SurfaceView Zoom IN and OUT Features Using a Custom Camera

I wrote code to work with a custom camera, and for this I use SurfaceView, now I want to know that if I need to implement the Zoom IN and OUT functions, I never worked on this application.

My code that I used to create a custom camera is 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> 
+6
source share
2 answers

The following is sample code for the zoom function. Please try if this 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); } } 
+4
source

I found a method using several links, it works for me, and finally I added the code to my surfaceChanged (...) file , my full surfaceChanged (..) file looks like this:

declare a variable from a data type called currentZoomLevel and assign 0 as the 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 put my answer only for clarity and for future use by the audience.

+6
source

All Articles