自定义View-实现绘制bitmap

  1. 本文主要实现将二维码绘制到图片之上
  2. 二维码的位置可以根据需求绘制到图上的任意位置

效果:
在这里插入图片描述


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;
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

将哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值