android BitmapShader实现圆形imageview

BitmapShader描述:
Shader used to draw a bitmap as a texture. The bitmap can be repeated or mirrored by setting the tiling mode.
用来将bitmap 绘制为纹理的着色器。通过设置平铺模式,位图可以重复或镜像
BitmapShader是Shader的子类
BitmapShader
ComposeShader
LinearGradient
RadialGradient
SweepGradient

其他之类逐一学习使用..


test111.png

这是原图 我们要的效果是这样

Screenshot_20170629113943.png

创建一个CircleImageView继承ImageView

主要重写
onDraw
onMeasure
这两个方法

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //取宽度或者高度的最小值
        int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
        mRadius = size / 2;
        setMeasuredDimension(size, size);
    }
    private float mScale;
    private int mRadius; //圆形图片的半径
    BitmapShader mBitmapShader;
    Paint mBitmapPaint;
    @Override
    protected void onDraw(Canvas canvas) {
        //创建一个画笔
        mBitmapPaint = new Paint();
        //把Drawable转化为Bitmap 
        Bitmap bitmap = getBitmapFromDrawable(getDrawable());
        //设置一个BitmapShader
        //Shader.TileMode.CLAMP 当所画图形的尺寸大于Bitmap的尺寸的时候,会用Bitmap四边的颜色填充剩余空间
        //REPEAT  重复平铺整个绘制的区域    
        //MIRROR   镜像平铺整个绘制的区
        mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP,
                Shader.TileMode.CLAMP);
        //计算缩放比例
        mScale = ((mRadius * 2.0f) / Math.min(bitmap.getHeight(), bitmap.getWidth()));
        //可以保证显示的时候图片内容照应Shader大小,否者图片显示偏移
        Matrix matrix = new Matrix();
        matrix.setScale(mScale, mScale);
        mBitmapShader.setLocalMatrix(matrix);
        //添加Shader
        mBitmapPaint.setShader(mBitmapShader);
        //画圆
        canvas.drawCircle(mRadius, mRadius, mRadius,
                mBitmapPaint);

    }
   private Bitmap getBitmapFromDrawable(Drawable drawable) {
        if (drawable == null) {
            return null;
        }
        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }
        Bitmap bitmap;
        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
                drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);
        return bitmap;

    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 上篇学了PorterDuffXfermode,本篇记录学习Shader 学习资料: Android群英传 爱哥写的...
    英勇青铜5阅读 2,780评论 0 11
  • 2017.11.15 星期三 阴 中午时分,太阳刚冒头一点,即刻便缩回去了。正在兴奋今天阳光有多好,可惜阴雾蒙...
    欣凭阅读 95评论 0 0
  • 每次,写关于自己的文章的时候,总会难产,因为认识自己,面对自己,是真的需要很大勇气! 前几年一直都很流行很流行间隔...
    青青子衿0917阅读 203评论 0 2
  • 睁开眼睛 打开手机 三十多条消息 唯独没有你 望着天花板 突然想起 “ 我们已经分开了” 看了看镜中的自己 扯着嘴...
    酒浓情伤阅读 296评论 0 3
  • 难忘的长城之旅 “不到长城非好汉。”暑假里,我和妈妈一起来到了居庸关长城。 来到了长城,我就被长城...
    灏之作阅读 246评论 0 0