Android自定义圆形ImageView
在Android开发中,经常需要使用ImageView来显示图片,但是默认的ImageView只支持矩形的显示,如果需要显示圆形的图片,就需要对ImageView进行自定义。本文将介绍如何使用自定义圆形ImageView来显示圆形图片,并提供相应的代码示例。
1. 实现方式
实现圆形ImageView主要有两种方式:
- 使用BitmapShader
- 使用自定义的Drawable
下面将分别介绍这两种方式的实现。
2. 使用BitmapShader
BitmapShader是Android提供的一个用于绘制图形的Shader类,可以通过设置Bitmap和TileMode来实现不同的效果。通过使用BitmapShader,我们可以将图片绘制成圆形。
2.1 创建CircleImageView类
public class CircleImageView extends AppCompatImageView {
private Paint mPaint;
private BitmapShader mBitmapShader;
private Bitmap mBitmap;
private RectF mRectF;
public CircleImageView(Context context) {
super(context);
init();
}
public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mRectF = new RectF();
}
@Override
protected void onDraw(Canvas canvas) {
if (mBitmapShader != null) {
canvas.drawRoundRect(mRectF, getWidth() / 2, getHeight() / 2, mPaint);
} else {
super.onDraw(canvas);
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mRectF.set(0, 0, w, h);
if (mBitmap != null) {
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(mBitmapShader);
}
}
@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
mBitmap = bm;
if (mBitmapShader != null) {
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(mBitmapShader);
}
}
}
2.2 使用CircleImageView
<com.example.CircleImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/avatar"
android:scaleType="centerCrop"/>
3. 使用自定义的Drawable
另一种实现圆形ImageView的方式是使用自定义的Drawable。
3.1 创建CircleImageDrawable类
public class CircleImageDrawable extends Drawable {
private Bitmap mBitmap;
private Paint mPaint;
private RectF mRectF;
public CircleImageDrawable(Bitmap bitmap) {
mBitmap = bitmap;
mPaint = new Paint();
mPaint.setAntiAlias(true);
mRectF = new RectF();
}
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawOval(mRectF, mPaint);
}
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
mRectF.set(bounds);
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public int getIntrinsicWidth() {
return mBitmap.getWidth();
}
@Override
public int getIntrinsicHeight() {
return mBitmap.getHeight();
}
}
3.2 使用CircleImageDrawable
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.avatar);
CircleImageDrawable drawable = new CircleImageDrawable(bitmap);
imageView.setImageDrawable(drawable);
4. 总结
本文介绍了两种实现圆形ImageView的方式:使用BitmapShader和使用自定义的Drawable。使用BitmapShader可以通过设置BitmapShader实现圆形效果,使用自定义的Drawable可以根据图片绘制圆形区域。根据实际需求选择合适的方式来实现圆形ImageView。
以上就是自定义圆形ImageView的实现方式和代码示例,希望对大家有所帮助。
参考资料
- [Android