这是预览效果
1、首先,xml布局,两个控件。SurfaceView和MyView
<SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> <com.example.administrator.myapplication.MyView android:id="@+id/myView" android:layout_width="match_parent" android:layout_height="match_parent"/>SurfaceView是相机预览控件,系统相机默认是横屏的,所以,要么我们把相机旋转90度,要么我们把屏幕设置成横屏
camera.setDisplayOrientation(90);//相机旋转90度
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//把屏幕设置成横屏
2、创建MyActivity。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//把屏幕设置成横屏 setContentView(R.layout.testlayout); myView = (MyView) findViewById(R.id.myView); surfaceview = (SurfaceView) findViewById(R.id.surfaceView); surfaceview.setOnTouchListener(new View.OnTouchListener() { //点击 surfaceview 聚焦 @Override public boolean onTouch(View v, MotionEvent event) { camera.autoFocus(myAutoFocusCallback); return false; } });
private MyView myView; private Camera camera; private SurfaceView surfaceview; private Camera.AutoFocusCallback myAutoFocusCallback = new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) {
//聚焦后的操作}} ; SurfaceHolder holder = surfaceview.getHolder() ; holder.setKeepScreenOn( true) ; // 屏幕常亮 holder.addCallback( new MySurfaceCallback()) ; holder.lockCanvas() ;}
private final class MySurfaceCallback implements SurfaceHolder.Callback { @Override public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
//当surface的格式或大小发生改变,这个方法就被调用} @Override public void surfaceCreated(SurfaceHolder holder) { try { // surfaceview 创建之后,就去打开相机 camera = Camera. open() ; Camera.Parameters params = camera.getParameters() ; camera.setPreviewDisplay( surfaceview.getHolder()) ; camera.startPreview() ; } catch (IOException e) { e.printStackTrace() ; } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if ( camera != null) { camera.release() ; camera = null; } }}
3、还有一个方法,点击拍摄的时候调用
camera.takePicture(null, null, myPictureCallback);
private Camera.PictureCallback myPictureCallback = new Camera.PictureCallback(){ @Override public void onPictureTaken(byte[] data, Camera camera) { //保存图片 } };4、最后是MyView
public class MyView extends ImageView { //获取屏幕的宽和高。根据屏幕的宽和高来算取景框的位置 private int width, height; public MyView(Context context, AttributeSet attrs) { super(context, attrs); WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); width = wm.getDefaultDisplay().getWidth(); height = wm.getDefaultDisplay().getHeight(); } @Override public void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.RED); paint.setAlpha(250); // 下面是取景框的8条线 // xy的算法是:把屏幕横着(逆时针旋转90度的屏幕),从左到右是x轴,从上到下是y轴 canvas.drawLine(200, 150, 300, 150, paint); canvas.drawLine(200, 150, 200, 200, paint); canvas.drawLine(200, height-150, 300, height-150, paint); canvas.drawLine(200, height-150, 200, height-200, paint); canvas.drawLine(width-355, 150, width-455, 150, paint); canvas.drawLine(width-355, 150, width-355, 200, paint); canvas.drawLine(width-355, height-150, width-455, height-150, paint); canvas.drawLine(width-355, height-150, width-355, height-200, paint); super.onDraw(canvas); } }