前言
今天要說的,不是使用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鏡像的去填滿。如果繪製的區域大於紋理圖片的話,紋理圖片會以鏡像的形式重複出現。