美文网首页
自定义Veiw之路(三)

自定义Veiw之路(三)

作者: 宁静世界 | 来源:发表于2018-06-18 22:17 被阅读0次

下面我们自定义一个圆形的图片

分为以下五部入手

1,拿到图片(Bitmap)
2,设置图片形状及模式BitmapShader
3,设置图片形状的变换矩阵,等比例缩放
4,为画笔设置shader(着色器)
5,将其绘制在画板上

需要掌握的

//BitmapShader 图片形状
//TileMode
//CLAMP 拉伸
//REPEAT 重复
//MIRROR 镜像
  bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//Matrix 缩放矩阵
// shader的变换矩阵,我们这里主要用于放大或者缩小
mMatrix.setScale(scale, scale);
 // 设置变换矩阵
bitmapShader.setLocalMatrix(mMatrix);
// 设置着色器
mBitmapPaint.setShader(bitmapShader);

以下是示例代码

public class DiyView04 extends ImageView {

    private BitmapShader bitmapShader = null;
    private Bitmap bitmap = null;
    private int mWidth;
    private Matrix mMatrix;
    private Paint mBitmapPaint;
    private int mRadius;

    public DiyView04(Context context) {
        this(context, null);
    }

    public DiyView04(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DiyView04(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mMatrix = new Matrix();
        mBitmapPaint = new Paint();
        mBitmapPaint.setAntiAlias(true);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.e("TAG", "onMeasure");
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        mWidth = Math.min(getMeasuredWidth(), getMeasuredHeight());
        mRadius = mWidth / 2;
        setMeasuredDimension(mWidth, mWidth);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        bitmap = ((BitmapDrawable) getResources().getDrawable(R.mipmap.img_main_orphan)).getBitmap();
        //TileMode
//        CLAMP 拉伸
//        REPEAT 重复
//        MIRROR 镜像
        bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        int bSize = Math.min(bitmap.getWidth(), bitmap.getHeight());
        float scale = 1.0f;
        scale = mWidth * 1.0f / bSize;
        // shader的变换矩阵,我们这里主要用于放大或者缩小
        mMatrix.setScale(scale, scale);
        // 设置变换矩阵
        bitmapShader.setLocalMatrix(mMatrix);
        // 设置shader
        mBitmapPaint.setShader(bitmapShader);
        canvas.drawCircle(mRadius, mRadius, mRadius, mBitmapPaint);
    }
}

相关文章

  • 自定义Veiw之路(三)

    下面我们自定义一个圆形的图片 分为以下五部入手 1,拿到图片(Bitmap)2,设置图片形状及模式BitmapSh...

  • models.py

    插入函数django编写网页时采用MTV模式(model-Template-Veiw) 1.unicode()请确...

  • Android源码完全解析——View的Measure过程

    在Android中,Veiw从内存中到呈现在UI界面上需要经过measure(测量)、layout(布局)、dra...

  • Android源码完全解析——View的Measure过程

    在Android中,Veiw从内存中到呈现在UI界面上需要经过measure(测量)、layout(布局)、dra...

  • 圆的自定义

    提高技能从自定义View开始,从今天开始走上自定义疯狂学习之路。首先来一波最简单的圆的自定义。对于自定义View的...

  • iOS hitTest方法找到合适的View底层实现

    什么时候调用:当事件传递给当前View时, 会调用当前Veiw的hitTest方法;作用:寻找最适合的View.返...

  • Android自定义View(一)-2016-06-05

    关于自定义View,是Android学习的必经之路,个人觉得自定义View更重要的是关于绘图的计算算法,利用And...

  • 自定义View之路(一)

    为什么要学自定义View,因为这是一个Android初级工程师到中高阶的必经之路,很多人对自定义View都比较恐惧...

  • 学习

    Android 进阶之路,谨以此日省吾身,保持进步: 1. UI进阶 自定义控件(canvas,paint...

  • valida校验关联参数、指定属性值

    一、自定义校验规则 二、请求实体 三、controller 三、自定义EnumValue注解 注解实现

网友评论

      本文标题:自定义Veiw之路(三)

      本文链接:https://www.haomeiwen.com/subject/ockoeftx.html