SurfaceView放大和缩小功能,使用定制的相机 [英] SurfaceView Zoom IN and OUT functionality using Custom Camera
本文介绍了SurfaceView放大和缩小功能,使用定制的相机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经写了code。与定制的相机工作,为了这个,我现在用的SurfaceView,现在我想知道如果我需要执行放大和缩小功能,我从来没有做过对这种应用程序。
我的code,这是我用于创建定制的相机,见下图:
MainActivity.java: -
公共类MainActivity延伸活动{ 私人SurfaceView preVIEW = NULL;
私人SurfaceHolder previewHolder = NULL;
公共摄像头摄像头;
在preVIEW = FALSE私人布尔;
的ImageButton btnCapture;
@燮pressWarnings(德precation)
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main); preVIEW =(SurfaceView)findViewById(R.id.surface);
previewHolder = preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
previewHolder.setFixedSize(getWindow()。getWindowManager()
.getDefaultDisplay()。的getWidth(),getWindow()。getWindowManager()
.getDefaultDisplay()的getHeight())。 btnCapture =(的ImageButton)findViewById(R.id.btnCapture); btnCapture.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
Toast.makeText(getApplicationContext(),捕捉图像(S),Toast.LENGTH_LONG).show();
}
});
} @覆盖
公共无效onResume(){
super.onResume();
相机= Camera.open();
} @覆盖
公共无效的onPause(){
super.onPause();
如果(在preVIEW){
camera.stop preVIEW(); }
camera.release();
摄像头= NULL;
在preVIEW = FALSE;
}
私人Camera.Size getBest previewSize(INT宽度,高度INT,Camera.Parameters参数){
Camera.Size结果= NULL;
对于(Camera.Size大小:parameters.getSupported previewSizes())
{
如果(size.width< =宽度放大器;&安培; size.height< =身高)
{
如果(结果== NULL){
结果=大小;
}其他{
INT resultArea = result.width * result.height;
INT newArea = size.width * size.height;
如果(newArea> resultArea){
结果=大小;
}
}
}
}
返回(结果);
} SurfaceHolder.Callback surfaceCallback =新SurfaceHolder.Callback(){ 公共无效surfaceCreated(SurfaceHolder持有人){
尝试{
camera.set previewDisplay(previewHolder);
}赶上(的Throwable t)的{
Log.e(previewDemo-surfaceCallback
异常的一套previewDisplay(),T);
Toast.makeText(MainActivity.this,t.getMessage(),Toast.LENGTH_LONG).show();
}
} 公共无效surfaceChanged(SurfaceHolder架,INT格式,诠释的宽度,高度INT){
Camera.Parameters参数= camera.getParameters();
Camera.Size大小= getBest previewSize(宽度,高度,
参数);
如果(大小!= NULL){
parameters.set previewSize(size.width,size.height);
camera.setParameters(参数);
camera.start preVIEW();
在preVIEW = TRUE;
}
} 公共无效surfaceDestroyed(SurfaceHolder持有人){ }
};
}
activity_main.xml中: -
< RelativeLayout的
的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:背景=@绘制/ splash_background> < android.view.SurfaceView
机器人:ID =@ + ID /面
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT/> <的ImageButton
机器人:ID =@ + ID / btnCapture
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_alignParentBottom =真
机器人:layout_centerHorizontal =真
机器人:背景=@绘制/捕获
机器人:contentDescription =@字符串/ APP_NAME/> < / RelativeLayout的>
解决方案
下面是示例code变焦功能。请尝试,如果它可以帮助你:
公共类DemoActivity延伸活动{私人的FrameLayout pCameraLayout = NULL; //这个布局包含surfaceview
私人ZoomControls zoomControls;
相机mCamera = NULL; @覆盖
保护无效的onCreate(捆绑savedInstanceState){
// TODO自动生成方法存根
super.onCreate(savedInstanceState); enableZoom();
} 私人无效enableZoom(){
zoomControls =新ZoomControls(本);
zoomControls.setIsZoomInEnabled(真);
zoomControls.setIsZoomOutEnabled(真);
zoomControls.setOnZoomInClickListener(新View.OnClickListener(){ @覆盖
公共无效的onClick(视图v){
// TODO自动生成方法存根
zoomCamera(假); }
});
zoomControls.setOnZoomOutClickListener(新View.OnClickListener(){ @覆盖
公共无效的onClick(视图v){
// TODO自动生成方法存根 zoomCamera(真);
}
});
pCameraLayout.addView(zoomControls);
} / **
*启用原生相机的变焦功能。从视图的侦听器调用
*用于放大和缩小。
*
*
* @参数zoomInOrOut假为变焦和真为缩小
* /
公共无效zoomCamera(布尔zoomInOrOut){
如果(mCamera!= NULL){
参数参数= mCamera.getParameters(); 如果(parameter.isZoomSupported()){
INT MAX_ZOOM = parameter.getMaxZoom();
INT currnetZoom = parameter.getZoom();
如果(zoomInOrOut&放大器;及(currnetZoom&所述; MAX_ZOOM&放大器;&放大器; currnetZoom&GT = 0)){
parameter.setZoom(++ currnetZoom);
}
否则如果(zoomInOrOut&放大器;!及(currnetZoom&下; = MAX_ZOOM&放大器;&放大器; currnetZoom大于0)){
parameter.setZoom( - currnetZoom);
}
}
其他
Toast.makeText(背景下,缩放暂无数据,Toast.LENGTH_LONG).show(); mCamera.setParameters(参数);
}
}
I have written code to work with Custom Camera and for this I am using SurfaceView, now i want to know what if i need to implement Zoom IN and OUT functionality, I never worked on this kind of app.
My code, which i used to create Custom Camera, see below:
MainActivity.java:-
public class MainActivity extends Activity {
private SurfaceView preview=null;
private SurfaceHolder previewHolder=null;
public Camera camera ;
private boolean inPreview=false;
ImageButton btnCapture;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preview=(SurfaceView)findViewById(R.id.surface);
previewHolder=preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
previewHolder.setFixedSize(getWindow().getWindowManager()
.getDefaultDisplay().getWidth(), getWindow().getWindowManager()
.getDefaultDisplay().getHeight());
btnCapture = (ImageButton) findViewById(R.id.btnCapture);
btnCapture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "Capture Image(s)", Toast.LENGTH_LONG).show();
}
});
}
@Override
public void onResume() {
super.onResume();
camera=Camera.open();
}
@Override
public void onPause() {
super.onPause();
if (inPreview) {
camera.stopPreview(); }
camera.release();
camera=null;
inPreview=false;
}
private Camera.Size getBestPreviewSize(int width, int height,Camera.Parameters parameters){
Camera.Size result=null;
for (Camera.Size size : parameters.getSupportedPreviewSizes())
{
if (size.width<=width && size.height<=height)
{
if (result==null) {
result=size;
} else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea) {
result=size;
}
}
}
}
return(result);
}
SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback(){
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(previewHolder);
} catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_LONG).show();
}
}
public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) {
Camera.Parameters parameters=camera.getParameters();
Camera.Size size=getBestPreviewSize(width, height,
parameters);
if (size!=null) {
parameters.setPreviewSize(size.width, size.height);
camera.setParameters(parameters);
camera.startPreview();
inPreview=true;
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
}
};
}
activity_main.xml:-
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/splash_background" >
<android.view.SurfaceView
android:id="@+id/surface"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<ImageButton
android:id="@+id/btnCapture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/capture"
android:contentDescription="@string/app_name" />
</RelativeLayout>
解决方案
Below is the sample code for zoom functionality .Please try if it can help you:
public class DemoActivity extends Activity {
private FrameLayout pCameraLayout = null; // this layout contains surfaceview
private ZoomControls zoomControls ;
Camera mCamera=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
enableZoom();
}
private void enableZoom() {
zoomControls = new ZoomControls(this);
zoomControls.setIsZoomInEnabled(true);
zoomControls.setIsZoomOutEnabled(true);
zoomControls.setOnZoomInClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
zoomCamera(false);
}
});
zoomControls.setOnZoomOutClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
zoomCamera(true);
}
});
pCameraLayout.addView(zoomControls);
}
/**
* Enables zoom feature in native camera . Called from listener of the view
* used for zoom in and zoom out.
*
*
* @param zoomInOrOut "false" for zoom in and "true" for zoom out
*/
public void zoomCamera(boolean zoomInOrOut) {
if(mCamera!=null) {
Parameters parameter = mCamera.getParameters();
if(parameter.isZoomSupported()) {
int MAX_ZOOM = parameter.getMaxZoom();
int currnetZoom = parameter.getZoom();
if(zoomInOrOut && (currnetZoom <MAX_ZOOM && currnetZoom >=0)) {
parameter.setZoom(++currnetZoom);
}
else if(!zoomInOrOut && (currnetZoom <=MAX_ZOOM && currnetZoom >0)) {
parameter.setZoom(--currnetZoom);
}
}
else
Toast.makeText(context, "Zoom Not Avaliable", Toast.LENGTH_LONG).show();
mCamera.setParameters(parameter);
}
}
这篇关于SurfaceView放大和缩小功能,使用定制的相机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文