我已经编写了使用Custom Camera的代码,为此我使用的是SurfaceView,现在我想知道如果我需要实现Zoom IN和OUT功能,我从未使用过这种应用程序.
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>
解决方法
下面是缩放功能的示例代码.请尝试它是否可以帮助您:
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); } }