android 圆形相机预览拍照_圆形Camera预览实现

本文介绍了如何在Android中创建一个圆形的相机预览界面,包括设置预览尺寸、边框宽度,以及利用OutlineProvider实现圆形裁剪效果。通过自定义布局和ViewOutlineProvider,可以将相机预览区域限制在一个圆形内,提供独特的拍摄体验。
摘要由CSDN通过智能技术生成

importandroid.annotation.TargetApi;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.graphics.Color;importandroid.graphics.Outline;importandroid.graphics.Rect;importandroid.hardware.Camera;importandroid.os.Build;importandroid.os.Handler;importandroid.os.Looper;importandroid.support.annotation.RequiresApi;importandroid.support.v4.content.ContextCompat;importandroid.util.AttributeSet;importandroid.util.Log;importandroid.view.View;importandroid.view.ViewGroup;importandroid.view.ViewOutlineProvider;importandroid.widget.FrameLayout;importandroid.widget.RelativeLayout;importcom.dong.circlecamera.R;importjava.util.Timer;importjava.util.TimerTask;

public class CircleCameraLayout extendsRelativeLayout {publicCircleCameraLayout(Context context) {super(context);

init(context,null, -1, -1);

}publicCircleCameraLayout(Context context, AttributeSet attrs) {super(context, attrs);

init(context, attrs,-1, -1);

}public CircleCameraLayout(Context context, AttributeSet attrs, intdefStyleAttr) {super(context, attrs, defStyleAttr);

init(context, attrs, defStyleAttr,-1);

}

@RequiresApi(api=Build.VERSION_CODES.LOLLIPOP)public CircleCameraLayout(Context context, AttributeSet attrs, int defStyleAttr, intdefStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);

init(context, attrs, defStyleAttr, defStyleRes);

}privateTimer timer;privateTimerTask pressTask;privateContext mContext;private int circleWidth = 0;//指定半径

private int borderWidth = 0;//指定边框

private CameraPreview cameraPreview;//摄像预览

private void init(Context context, AttributeSet attrs, int defStyleAttr, intdefStyleRes) {

mContext=context;

timer= newTimer();if (attrs != null && defStyleAttr == -1 && defStyleRes == -1) {

TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.CircleCameraLayout, defStyleAttr, defStyleRes);

circleWidth= (int) typedArray.getDimension(R.styleable.CircleCameraLayout_circle_camera_width, ViewGroup.LayoutParams.WRAP_CONTENT);

borderWidth= (int) typedArray.getDimension(R.styleable.CircleCameraLayout_border_width, 5);

typedArray.recycle();

}

startView();

}/*** 设置照相预览

*

*@paramcameraPreview*/

public void setCameraPreview(CameraPreview cameraPreview) {

this.cameraPreview = cameraPreview;

}/*** 释放回收*/

public voidrelease() {if (null !=pressTask) {

pressTask.cancel();

pressTask= null;

}if (null !=timer) {

timer.cancel();

timer= null;

}

}//延时启动摄像头

public voidstartView() {

pressTask= newTimerTask() {

@Overridepublic voidrun() {new Handler(Looper.getMainLooper()).post(newRunnable() {

@Overridepublic voidrun() {

pressTask.cancel();

pressTask= null;if (null !=cameraPreview) {

show();

}else{

startView();

}

}

});

}

};

timer.schedule(pressTask,50);

}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)private voidshow() {//cmaera根view--layout

RelativeLayout cameraRoot = new RelativeLayout(mContext);

RelativeLayout.LayoutParams rootParams = new RelativeLayout.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

rootParams.addRule(CENTER_IN_PARENT, TRUE);

cameraRoot.setBackgroundColor(Color.TRANSPARENT);

cameraRoot.setClipChildren(false);//camera--layout

FrameLayout cameraLayout = new FrameLayout(mContext);

Camera.Size preSize = cameraPreview.getCameraSize();

int cameraHeight = (int) ((float) preSize.width / (float) preSize.height * circleWidth);

RelativeLayout.LayoutParams cameraParams = new RelativeLayout.LayoutParams(circleWidth, cameraHeight);

cameraParams.addRule(CENTER_IN_PARENT, TRUE);

cameraLayout.setLayoutParams(cameraParams);

cameraLayout.addView(cameraPreview);

cameraLayout.setOutlineProvider(viewOutlineProvider);//把自定义的轮廓提供者设置给imageView

cameraLayout.setClipToOutline(true);//开启裁剪//circleView--layout//CircleView circleView = new CircleView(mContext);

CircleView2 circleView = new CircleView2(mContext);

circleView.setBorderWidth(circleWidth, borderWidth);//设置margin值---隐藏超出部分布局

int margin = (cameraHeight - circleWidth) / 2 - borderWidth / 2;

rootParams.setMargins(0, -margin, 0, -margin);

cameraRoot.setLayoutParams(rootParams);//添加camera

cameraRoot.addView(cameraLayout);//添加circle

cameraRoot.addView(circleView);//添加根布局

this.addView(cameraRoot);

}//自定义一个轮廓提供者

public ViewOutlineProvider viewOutlineProvider = newViewOutlineProvider() {

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

@Overridepublic voidgetOutline(View view, Outline outline) {//裁剪成一个圆形

int left0 = 0;

int top0 = (view.getHeight() - view.getWidth()) / 2;

int right0 = view.getWidth();

int bottom0 = (view.getHeight() - view.getWidth()) / 2 +view.getWidth();

outline.setOval(left0, top0, right0, bottom0);

}

};

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值