Android自定义ImageView实现圆形、矩形、椭圆的显示

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,我们可以实现更加丰富的图片展示效果,提高用户体验。