美文网首页
自定义Drawable完成圆形、圆角图片

自定义Drawable完成圆形、圆角图片

作者: yyg | 来源:发表于2017-10-09 09:34 被阅读53次

    在学习自定义圆形及圆角图片的过程中,首先尝试的是通过继承ImageView,然后对其进行自定义扩张来实现,但是过程中总是遇到OOM,或者图片裁剪拉伸等问题,由于水平有限又急于学习下一步的知识,所以寻找了另外的方式,借鉴大神代码,通过自定义Drawable 简单完成了圆形和圆角图片,下面代码作为记录,好记性不如烂笔头。

    • 自定义Drawable,相比View来说,Drawable属于轻量级的、使用也很简单。Drawable相对能提升我们的UI的性能。相比与直接自定义view,自定义drawable也是另外一种方式。
    • 但是自定义Drawable无法再xml中使用,因此降低了定义Drawable的使用范围

    贴几个链接,方便以后回过头来学习:
    Android模仿QQ音乐播放旋转的圆形ImageView
    Android Drawable 那些不为人知的高效用法
    Android Xfermode 实战 实现圆形、圆角图片
    Android BitmapShader 实战 实现圆形、圆角图片

    public class CircleRoundDrawable extends Drawable {
    
        private Paint paint;//画笔
        private int mWidth;//图片宽与高的最小值
        private RectF rectF;//矩形
        private int radius;//半径
        private int roundAngle = 30;//默认圆角
        private Bitmap bitmap;//位图
        private int type=2;//默认为圆形
    
        public static final int TYPE_Round = 1;
        public static final int Type_Circle = 2;
    
    
        public CircleRoundDrawable(Context context, int resID) {
            this(BitmapFactory.decodeResource(context.getResources(), resID));
        }
    
        public CircleRoundDrawable(Bitmap bitmap) {
            this.bitmap = bitmap;
            paint = new Paint();
            paint.setAntiAlias(true);//抗锯齿
            paint.setDither(true);//抖动,不同屏幕尺的使用保证图片质量
    
            ///位图渲染器
            BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            paint.setShader(bitmapShader);
            mWidth = Math.min(bitmap.getWidth(), bitmap.getHeight());
            //初始化半径
            radius = mWidth / 2;
        }
    
        /***
         * 对外暴露的方法
         * @param roundAngle
         */
        public void setRoundAngle(int roundAngle) {
            this.roundAngle = roundAngle;
        }
    
        public void setType(int type) {
            this.type = type;
        }
        /**
         * drawable将被绘制在画布上的区域
         *
         * @param left
         * @param top
         * @param right
         * @param bottom
         */
        @Override
        public void setBounds(int left, int top, int right, int bottom) {
            super.setBounds(left, top, right, bottom);
            //绘制区域
            rectF = new RectF(left, top, right, bottom);
        }
        /**
         * 核心方法
         *
         * @param canvas
         */
        @Override
        public void draw(@NonNull Canvas canvas) {
            if (type ==Type_Circle) {
                canvas.drawCircle(mWidth / 2, mWidth / 2, radius, paint);
            } else{
                canvas.drawRoundRect(rectF, roundAngle, roundAngle, paint);
            }
    
        }
    
        @Override
        public void setAlpha(int i) {
            paint.setAlpha(i);
            invalidateSelf();//更新设置
    
        }
    
        @Override
        public int getIntrinsicHeight() {
            if (type == Type_Circle) {
                return mWidth;
            }
            return bitmap.getHeight();
        }
    
        @Override
        public int getIntrinsicWidth() {
            if (type == Type_Circle) {
                return mWidth;
            }
            return bitmap.getWidth();
        }
    
        @Override
        public void setColorFilter(@Nullable ColorFilter colorFilter) {
            paint.setColorFilter(colorFilter);
            invalidateSelf();//更行设置
    
        }
    
        @Override
        public int getOpacity() {
            return PixelFormat.TRANSLUCENT;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:自定义Drawable完成圆形、圆角图片

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