实现android端的类似二维码的扫描窗口(中间亮,四周暗,扫描线循环),效果图:
要实现android端的类似二维码的扫描窗口(中间亮,四周暗,扫描线循环)
主要用到paint类,drawRect()以及drawLine()函数,参数分别是左上点x,左下点y,右上点x,右下点y,画布paint
drawRect(float left, float top, float right, float bottom, Paint paint)drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
主要流程是:首先, 新建一个类继承于ImageView类,重写onDraw函数。
使用用法:在你需要的.xml布局文件添加上该类
例如: 新建的扫描窗口类为cameraWindows,在activity_camera.xml上添加该类:
<com.hongh.camera.cameraWindows
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
部分核心代码:
//设置三个Paint画布,分别用于画阴影矩形,蓝色矩形(四个角),蓝色直线(扫描线)</span>
private Paint mAreaPaint,paint,paint2;
mAreaPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint = new Paint();
paint2 = new Paint();
mAreaPaint.setColor(Color.BLACK);
mAreaPaint.setStyle(Paint.Style.FILL);
mAreaPaint.setAlpha(110);
//设置画布为蓝色,用于设置扫描窗口边缘的四个角
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(7f);
//设置画布为蓝色,用于设置扫描线
paint2.setColor(Color.BLUE);
paint2.setStrokeWidth(2f);
<p><span style="font-size: 18px;"> //参数分别是左上点x,左下点y,右上点x,右下点y,画布paint</span></p><span style="font-size: 18px;"> //drawRect(float left, float top, float right, float bottom, Paint paint)</span>
/***画阴影部分的矩形框****/
canvas.drawRect(0,0,screenWidth,(screenHeight - Y)/2,mAreaPaint);
canvas.drawRect(0,(screenHeight - Y)/2,(screenWidth-X)/2,screenHeight,mAreaPaint);
canvas.drawRect((screenWidth-X)/2+X,(screenHeight - Y)/2,screenWidth,screenHeight,mAreaPaint);
canvas.drawRect((screenWidth-X)/2,(screenHeight - Y)/2+Y,(screenWidth-X)/2+X,screenHeight,mAreaPaint);
/***四个角***/
canvas.drawLine((screenWidth-X)/2,(screenHeight - Y)/2,(screenWidth-X)/2+XX,(screenHeight - Y)/2,paint);
canvas.drawLine((screenWidth-X)/2,(screenHeight - Y)/2,(screenWidth-X)/2,(screenHeight - Y)/2+XX,paint);
canvas.drawLine((screenWidth-X)/2+X-XX,(screenHeight - Y)/2,(screenWidth-X)/2+X,(screenHeight - Y)/2,paint);
canvas.drawLine((screenWidth-X)/2+X,(screenHeight - Y)/2,(screenWidth-X)/2+X,(screenHeight - Y)/2+XX,paint);
canvas.drawLine((screenWidth-X)/2,(screenHeight - Y)/2+Y-XX,(screenWidth-X)/2,(screenHeight - Y)/2+Y,paint);
canvas.drawLine((screenWidth-X)/2,(screenHeight - Y)/2+Y,(screenWidth-X)/2+XX,(screenHeight - Y)/2+Y,paint);
canvas.drawLine((screenWidth-X)/2+X,(screenHeight - Y)/2+Y-XX,(screenWidth-X)/2+X,(screenHeight - Y)/2+Y,paint);
canvas.drawLine((screenWidth-X)/2+X-XX,(screenHeight - Y)/2+Y,(screenWidth-X)/2+X,(screenHeight - Y)/2+Y,paint);
/*******扫描线*********/
if(count >Y-20)
count = 0;
canvas.drawLine((screenWidth-X)/2+20,(screenHeight - Y)/2+10+count,(screenWidth-X)/2+X-20,(screenHeight - Y)/2+10+count,paint2);
count+=2;
invalidate(); //刷新canvas,目的是更新扫描线
源码下载:
http://download.csdn.net/detail/chenmohousuiyue/9643338