前言
今天要说的,不是使用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镜像的去填满。如果绘制的区域大于纹理图片的话,纹理图片会以镜像的形式重复出现。