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