2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > android自定义相机加取景框

android自定义相机加取景框

时间:2020-06-11 03:45:06

相关推荐

android自定义相机加取景框

这是预览效果

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。

@Overrideprotected 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); }}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。