Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SurfaceView Zoom IN and OUT functionality using Custom Camera

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>
like image 799
Sun Avatar asked Jan 22 '14 10:01

Sun


People also ask

How do I make my camera zoom in and out?

Open “Webcam Settings” and then press the tab captioned “Camera Control” to adjust zoom settings. Now drag the slider accordingly to the left or right to zoom out the webcam and then click the “OK” button.

How do you zoom on an Android camera?

Pinch your fingers together. Start with your thumb and pointer finger a couple of inches apart, then pinch them together. As you pinch, the camera will zoom out, making the image on the screen much smaller. Repeat this motion to zoom out more.

What is camera API in Android?

This package is the primary API for controlling device cameras. It can be used to take pictures or videos when you are building a camera application. Camera. This class is the older deprecated API for controlling device cameras. SurfaceView.


2 Answers

I found a way by using several links, it works for me, and finally i have added code into my surfaceChanged(...), my complete surfaceChanged(..) code looks like, below:

declare variable of int datatype named currentZoomLevel and assign 0 as initial value,

  int currentZoomLevel = 0;

Code:-

 public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) {
            params = camera.getParameters();       
            params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
            Camera.Size size=getBestPreviewSize(width, height,                                           
                    params);       
            if (size!=null) {      
                params.setPreviewSize(size.width, size.height);
                camera.setParameters(params);       
                camera.startPreview();       
                inPreview=true;   
                ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomControls);

                if (params.isZoomSupported()) {
                    final int maxZoomLevel = params.getMaxZoom();
                    Log.i("max ZOOM ", "is " + maxZoomLevel);
                    zoomControls.setIsZoomInEnabled(true);
                    zoomControls.setIsZoomOutEnabled(true);

                    zoomControls.setOnZoomInClickListener(new OnClickListener(){
                        public void onClick(View v){
                            if(currentZoomLevel < maxZoomLevel){
                                currentZoomLevel++;
                                //mCamera.startSmoothZoom(currentZoomLevel);
                                params.setZoom(currentZoomLevel);
                                camera.setParameters(params);
                            }
                        }
                    });

                    zoomControls.setOnZoomOutClickListener(new OnClickListener(){
                        public void onClick(View v){
                            if(currentZoomLevel > 0){
                                currentZoomLevel--;
                                params.setZoom(currentZoomLevel);
                                camera.setParameters(params);
                            }
                        }
                    });    
                }
                else
                    zoomControls.setVisibility(View.GONE);
                }     
            }   

Xml:-

<ZoomControls
    android:id="@+id/zoomControls"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true" />

I am placing my answer, just for more clearity and for viewers future use..

like image 181
Sun Avatar answered Sep 21 '22 21:09

Sun


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);
        }
    } 
like image 33
Sourabh s Avatar answered Sep 20 '22 21:09

Sourabh s