Android中ImageView是一个非常常用的控件,用于显示图片。但是有时候我们需要对ImageView进行一些自定义的展示,比如将图片裁剪为圆形、矩形或椭圆形。这时候就需要自定义ImageView来实现了。

首先我们需要自定义一个继承自ImageView的类,然后在类的构造方法中添加以下代码:
```
public class CustomImageView extends ImageView {
private Paint mPaint;
private int mShape;
public CustomImageView(Context context) {
super(context);
init();
}
public CustomImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
}
public void setShape(int shape) {
mShape = shape;
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
if (getWidth() == 0 || getHeight() == 0) {
return;
}
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap bitmapCopy = bitmap.copy(Bitmap.Config.ARGB_8888, true);
BitmapShader bitmapShader = new BitmapShader(bitmapCopy, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(bitmapShader);
switch (mShape) {
case 1:
canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, mPaint);
break;
case 2:
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
break;
case 3:
canvas.drawOval(0, 0, getWidth(), getHeight(), mPaint);
break;
default:
canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, mPaint);
break;
}
}
}
```
在上述代码中,我们定义了一个mShape变量,用于保存ImageView展示的形状。在setShape方法中,我们可以设置形状的值,1表示圆形,2表示矩形,3表示椭圆形。在onDraw方法中,我们首先获取ImageView中的Bitmap,然后创建一个BitmapShader,将Bitmap设置为画笔的Shader。接着根据mShape的值来绘制不同的形状。
最后,在布局文件中使用自定义的ImageView并设置形状即可:
```
android:id="@+id/circle_image" android:layout_width="200dp" android:layout_height="200dp" android:layout_marginTop="20dp" android:scaleType="centerCrop" app:shape="1" app:srcCompat="@drawable/avatar" /> ``` 其中,app:shape用于设置ImageView的形状,值为1表示圆形,2表示矩形,3表示椭圆形。 通过自定义ImageView,我们可以实现更加丰富的图片展示效果,提高用户体验。