最近做了一个demo,用到了圆形图片,本打算自定义ImageView来实现,感觉挺麻烦的,百度了一下,发现用自定义Drawable这种方法挺简单的,就照着这里写了一个demo记录下来。
实现效果
圆形图片
public class CircleImage extends Drawable {
private Paint paint;
private int width;
private Bitmap bitmap;
public CircleImage(Bitmap bitmap) {
this.bitmap = bitmap;
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(bitmapShader);
width = Math.min(bitmap.getWidth(), bitmap.getHeight());
}
@Override
public void draw(Canvas canvas) {
canvas.drawCircle(width / 2, width / 2, width / 2, paint);
}
@Override
public int getIntrinsicWidth() {
return width;
}
@Override
public int getIntrinsicHeight() {
return width;
}
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
圆角图片
public class RectangleImage extends Drawable {
private Bitmap bitmap;
private RectF rectF;
private Paint paint;
public RectangleImage(Bitmap bitmap) {
this.bitmap = bitmap;
paint = new Paint();
paint.setAntiAlias(true);
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(bitmapShader);
}
@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 int getIntrinsicWidth() {
return bitmap.getWidth();
}
@Override
public int getIntrinsicHeight() {
return bitmap.getHeight();
}
@Override
public void draw(Canvas canvas) {
canvas.drawRoundRect(rectF, 50, 50, paint);
}
@Override
public void setAlpha(int i) {
paint.setAlpha(i);
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
使用
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
circleImage = (ImageView) findViewById(R.id.iv_circle_img);
rectangleImage = (ImageView)findViewById(R.id.iv_rectangle_img);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.lena);
circleImage.setImageDrawable(new CircleImage(bitmap));
rectangleImage.setImageDrawable(new RectangleImage(bitmap));
}