我已经编写了使用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);
}
}