Android 自定义相机取景框
时间: 2023-11-19 14:55:24 浏览: 84
Android自定义相机取景框可以通过自定义View来实现。具体步骤如下:
1.在布局文件中添加SurfaceView和自定义View,其中SurfaceView用于相机预览,自定义View用于绘制取景框。
2.在Activity中获取SurfaceView和自定义View的实例,并在SurfaceView的回调函数中打开相机。
3.在自定义View的onDraw()方法中绘制取景框。
4.在Activity中实现相机拍照的回调函数,并在回调函数中获取拍照的图片。
5.在自定义View中添加手势监听器,实现取景框的移动和缩放功能。
代码示例:
```
//布局文件
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.example.myapp.MyView
android:id="@+id/myView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
//Activity中的代码
public class CameraActivity extends Activity implements SurfaceHolder.Callback {
private SurfaceView mSurfaceView;
private MyView mMyView;
private Camera mCamera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
mMyView = (MyView) findViewById(R.id.myView);
SurfaceHolder holder = mSurfaceView.getHolder();
holder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mCamera.stopPreview();
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
}
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//获取拍照的图片
}
};
}
//自定义View中的代码
public class MyView extends View {
private Rect mRect = new Rect(100, 100, 500, 500);
private Paint mPaint = new Paint();
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawRect(mRect, mPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//实现取景框的移动和缩放功能
return true;
}
}
```