package cn.mutils.app.zxing; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.util.AttributeSet; import android.view.View; import cn.mutils.app.R; /** * QRCode view <br> * It is used to show data by QRCode */ @SuppressWarnings("unused") public class QRCodeView extends View { protected Bitmap mLogoBitmap; protected Bitmap mContentBitmap; protected Bitmap mContentBgBitmap; protected String mText; protected Matrix mMatrix = new Matrix(); protected int mContentPadding = 5; public QRCodeView(Context context) { super(context); init(context, null); } public QRCodeView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public QRCodeView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } protected void init(Context context, AttributeSet attrs) { if (attrs != null) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.QRCodeView); setText(typedArray.getString(R.styleable.QRCodeView_android_text)); typedArray.recycle(); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (this.mContentBitmap == null) { return; } int width = this.getWidth(); int height = this.getHeight(); double backgroundSize = width < height ? width : height; double backgroundX = (width - backgroundSize) * 0.5; double backgroundY = (height - backgroundSize) * 0.5; if (this.mContentBgBitmap != null) { double backgroundScale = backgroundSize / this.mContentBgBitmap.getWidth(); this.mMatrix.reset(); this.mMatrix.postScale((float) backgroundScale, (float) backgroundScale); this.mMatrix.postTranslate((float) backgroundX, (float) backgroundY); canvas.drawBitmap(this.mContentBgBitmap, this.mMatrix, null); } double codeSize = backgroundSize - 2 * this.mContentPadding; double codeScale = codeSize / this.mContentBitmap.getWidth(); double codeX = (width - codeSize) * 0.5; double codeY = (height - codeSize) * 0.5; this.mMatrix.reset(); this.mMatrix.postScale((float) codeScale, (float) codeScale); this.mMatrix.postTranslate((float) codeX, (float) codeY); canvas.drawBitmap(this.mContentBitmap, this.mMatrix, null); if (this.mLogoBitmap == null) { return; } double logoSize = codeSize * 0.19; double logoScale = logoSize / this.mLogoBitmap.getWidth(); double logoX = (width - logoSize) * 0.5; double logoY = (height - logoSize) * 0.5; this.mMatrix.reset(); this.mMatrix.postScale((float) logoScale, (float) logoScale); this.mMatrix.postTranslate((float) logoX, (float) logoY); canvas.drawBitmap(this.mLogoBitmap, this.mMatrix, null); } public String getText() { return this.mText; } public void setText(String text) { if (text == null) { mText = null; this.mContentBitmap = null; this.invalidate(); return; } if (text.equals(mText)) { return; } mText = text; this.mContentBitmap = QRCodeUtil.convert(text); this.invalidate(); } public void setLogoRes(int logoResId) { if (logoResId == 0) { this.mLogoBitmap = null; this.invalidate(); return; } this.mLogoBitmap = BitmapFactory.decodeResource(this.getResources(), logoResId); this.invalidate(); } public void setContentBgRes(int contentBgRes) { if (contentBgRes == 0) { this.mContentBgBitmap = null; this.invalidate(); return; } this.mContentBgBitmap = BitmapFactory.decodeResource(this.getResources(), contentBgRes); this.invalidate(); } public void setContentPadding(int contentPadding) { if (contentPadding < 0) { return; } this.mContentPadding = contentPadding; this.invalidate(); } }