/*************************
* 正方形笼罩层(调用相机用) *
**************************/
public class myViewfinderView extends View {
private Paint mPaint1;
private Paint mPaint2;
private Bitmap maskBM;
private Bitmap recBM;
private int mScreenWidth; // 屏幕的宽
private int mScreenHeight; //屏幕的高
private Bitmap mSrcRect;
private Bitmap mDstRect;
public myViewfinderView(Context context){
this(context,null);
}
public myViewfinderView(Context context,AttributeSet attrs){
super(context,attrs);
ViewGroup.LayoutParams layoutParams=new ViewGroup.LayoutParams
(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
setLayoutParams(layoutParams);
if (mScreenWidth==0){
DisplayMetrics dm=getResources().getDisplayMetrics();
mScreenHeight=dm.heightPixels;
mScreenWidth=dm.widthPixels; } }
private Bitmap makeSrcRect(){
maskBM=Bitmap.createBitmap(mScreenWidth,mScreenHeight,Bitmap.Config.ARGB_8888);
Canvas mCanvas=new Canvas(maskBM);
mPaint1=new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint1.setColor(Color.BLACK);
mCanvas.drawRect(new RectF(0,0,mScreenWidth,mScreenHeight), mPaint1);
return maskBM; }
private Bitmap makeDstRct(){
recBM=Bitmap.createBitmap(mScreenWidth,mScreenHeight,Bitmap.Config.ARGB_8888);
Canvas mCanvas2=new Canvas(recBM);
mPaint2=new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint2.setColor(Color.WHITE);
mCanvas2.drawRect(new RectF(mScreenWidth/4,mScreenHeight/4,mScreenWidth/4*3,mScreenHeight/4+mScreenWidth/2),mPaint2);
protected void onDraw(Canvas canvas)
{
mSrcRect=makeSrcRect();
mDstRect=makeDstRct();
Paint paint=new Paint();
paint.setFilterBitmap(false);
canvas.saveLayer(0, 0,mScreenWidth,mScreenHeight,null,Canvas.ALL_SAVE_FLAG);
canvas.drawBitmap(mDstRect,0,0,paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
paint.setAlpha(160);
canvas.drawBitmap(mSrcRect, 0, 0,paint);
paint.setXfermode(null);
canvas.saveLayer(0,0,mScreenWidth,mScreenHeight,null,Canvas.ALL_SAVE_FLAG );
paint.setAlpha(255);
}}
效果待补,可参照各app扫一扫二维码上的笼罩层,实际没用上所以没有优化,距离边框上可能有一定的问题,仅供思路参考。
使用方法是直接在界面布局上引用,因为这是一个自定义的View