SurfaceView放大和缩小功能,使用定制的相机 [英] SurfaceView Zoom IN and OUT functionality using Custom Camera

查看:4431
本文介绍了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:机器人=htt​​p://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_centerHorizo​​ntal =真
        机器人:背景=@绘制/捕获
        机器人: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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆