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鏡像的去填滿。如果繪製的區域大於紋理圖片的話,紋理圖片會以鏡像的形式重複出現。






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