Android Drawable设计圆角

前言

今天要说的,不是使用shape来创建圆角,也不是使用第三方框架来变化。是继承Drawable设计圆角。

在这里感谢洪洋大神的知识分享!


具体代码

设计圆角

public class RoundImageDrawable extends Drawable {

    private Bitmap bitmap;
    private Paint paint;
    private RectF rectF;

    public RoundImageDrawable(Bitmap bitmap) {
        this.bitmap = bitmap;
        BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setShader(shader);
    }

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

    @Override
    public void draw(@NonNull Canvas canvas) {
        canvas.drawRoundRect(rectF, 10, 10, paint);
    }

    @Override
    public void setAlpha(@IntRange(from = 0, to = 255) int i) {
        paint.setAlpha(i);
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        paint.setColorFilter(colorFilter);
    }

    @Override
    public int getIntrinsicHeight() {
        return bitmap.getHeight();
    }

    @Override
    public int getIntrinsicWidth() {
        return bitmap.getWidth();
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}



设计圆形

public class CircelImageDrawable extends Drawable {

    private Bitmap bitmap;
    private Paint paint;
    private RectF rectF;
    private int width;

    public CircelImageDrawable(Bitmap bitmap) {
        this.bitmap = bitmap;
        BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setShader(shader);
        width = Math.min(bitmap.getWidth(), bitmap.getHeight());
    }

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

    @Override
    public void draw(@NonNull Canvas canvas) {
        canvas.drawCircle(width / 2, width / 2, width / 2, paint);
    }

    @Override
    public void setAlpha(@IntRange(from = 0, to = 255) int i) {
        paint.setAlpha(i);
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        paint.setColorFilter(colorFilter);
    }

    @Override
    public int getIntrinsicHeight() {
        return bitmap.getHeight();
    }

    @Override
    public int getIntrinsicWidth() {
        return bitmap.getWidth();
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}


其实两者差别不大,细心的盆友应该能看出来

圆形是圆角的一个特例,将半径和左上右下的弧度设置的和图片宽度一半长一样而已。


注:

关于BitmapShader:

官方解释:

使用特定的图片来作为文理来处理。

Shader used to draw a bitmap as a texture.

BitmapShader 的构造函数
public BitmapShader(@NonNull Bitmap bitmap, TileMode tileX, TileMode tileY)

三个参数:bitmap 指的是要作为纹理的图片,tileX 指的是在x方向纹理的绘制模式,tileY 指的是Y方向上的绘制模式。

TileMode 是一个枚举类型,有3个可能的值:

1、CLMP 如果需要填充的内容大小超过了bitmap size 就选bitmap 边界的颜色进行扩展

2、REPEAT重复,不断的重复bitmap去填满,如果绘制的区域大于纹理图片的话,纹理图片会在这片区域不断重复

3、MIRROR镜像的去填满。如果绘制的区域大于纹理图片的话,纹理图片会以镜像的形式重复出现。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章