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

2017-10-09  本文已影响53人  yyg

在学习自定义圆形及圆角图片的过程中,首先尝试的是通过继承ImageView,然后对其进行自定义扩张来实现,但是过程中总是遇到OOM,或者图片裁剪拉伸等问题,由于水平有限又急于学习下一步的知识,所以寻找了另外的方式,借鉴大神代码,通过自定义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;
    }
}

上一篇下一篇

猜你喜欢

热点阅读