- 本文主要实现将二维码绘制到图片之上
- 二维码的位置可以根据需求绘制到图上的任意位置
效果:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import com.jbh.goldrush.Utils.LogUtils;
import com.jbh.goldrush.Utils.Util;
public class RegImageView extends View {
/**view 的 宽高*/
private int viewWidth = 0;
private int viewHeight = 0;
/**背景底图*/
private Bitmap bgBitmap;
/**二维码图片*/
private Bitmap qrBitmap;
private Bitmap sourceBitmap ;
/**二维码显示的位置坐标*/
private int px;
private int py;
Canvas canvas;
/**
* @param context
*/
public RegImageView(Context context) {
this(context,null);
}
/**
*
* @param context
* @param attrs
*/
public RegImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
/**
*
* @param context
* @param attrs
* @param defStyleAttr
*/
public RegImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 背景图片
*
* @param bgBitmap
*/
public RegImageView setBgBitmap(Bitmap bgBitmap) {
this.bgBitmap = bgBitmap;
return RegImageView.this;
}
/**
* 二维码图片
* @param qrBitmap
*/
public RegImageView setQrBitmap(Bitmap qrBitmap) {
this.qrBitmap = qrBitmap;
viewWidth = bgBitmap.getWidth();
viewHeight = bgBitmap.getHeight();
invalidate();
return RegImageView.this;
}
/**
* @param px
* @param py
*/
public RegImageView setPivotXAndY(int px, int py) {
this.px = px;
this.py = py;
return RegImageView.this;
}
/**
* 初始化
*/
public void init() {
if (bgBitmap!=null && qrBitmap!=null){
viewWidth = bgBitmap.getWidth();
viewHeight = bgBitmap.getHeight();
LogUtils.LOG_V("viewWidth="+viewWidth);
LogUtils.LOG_V("viewHeight="+viewHeight);
sourceBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(sourceBitmap);
Paint mPaint = new Paint();
canvas.drawBitmap(bgBitmap,0,0,mPaint);
checkGravity();
canvas.drawBitmap(qrBitmap,px,py,null);
invalidate();
}
}
public void setText(){
if (canvas==null)return;
String s = "识别查看产品详情";
Paint paint = new Paint();
Rect rect=new Rect();
paint.getTextBounds(s,0,s.length(),rect);
paint.setColor(Color.BLACK);
paint.setTextSize(20);
paint.setAlpha(100);
canvas.drawText(s,px+(qrBitmap.getWidth()-rect.width())/4-5,py+qrBitmap.getHeight()+rect.height()/2,paint);
invalidate();
}
/**
* 控制mark的位置
*/
private void checkGravity() {
if (px>0||py>0)return;
switch (g){
//左上角
case LeftAndTob:
px = py = px = Util.dp2Px(10);
break;
//左下角
case LeftAndBottom:
px = Util.dp2Px(10);
py = bgBitmap.getHeight() - (Util.dp2Px(10)+qrBitmap.getHeight());
break;
//右上角
case RightAndTob:
px = bgBitmap.getWidth() - (Util.dp2Px(10)+qrBitmap.getHeight());
py = Util.dp2Px(10);
break;
//有下角
case RightAndBottom:
px=viewWidth-qrBitmap.getWidth()-Util.dp2Px(5);
py=viewHeight-qrBitmap.getHeight()-Util.dp2Px(10);
break;
}
}
/**
* @param g
*/
public RegImageView setGravity(ViewGravity g){
this.g=g;
return RegImageView.this;
}
/**
* 默认位置 左下角
*/
private ViewGravity g = ViewGravity.LeftAndBottom;
/**
* 显示 mark的位置
*/
public enum ViewGravity{
LeftAndTob,LeftAndBottom,RightAndTob,RightAndBottom,
}
/**
* 测量
*
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(viewWidth,viewHeight);
}
/**
* 将内容绘制到 画板上
*
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (sourceBitmap!=null){
canvas.save();
canvas.drawBitmap(sourceBitmap,0,0,null);
canvas.restore();
}
}
/**
* 将view 转成 图片
*
* @return
*/
public Bitmap loadBitmapFromView() {
Bitmap bmp = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
c.drawColor(Color.WHITE);
this.draw(c);
return bmp;
}
}