gpt4 book ai didi

android-view - Android 中带有圆角的自定义 View

转载 作者:行者123 更新时间:2023-11-30 03:45:55 24 4
gpt4 key购买 nike

我有一个自定义 View ,其中包含多层图像、带有文本的布局、绘图等。我想制作 View 的一个角(右上角)。换句话说,我想裁剪这个角使其变圆——而不是设置圆角背景。

我设法通过使用 clipPath() 做到了这一点,但它运行缓慢,因为我必须为此 View 打开硬件加速 - 所以这个解决方案不适合我。

还有其他方法吗?

最佳答案

这是扩展 ImageView 的自定义圆角 ImageView 类。而这里的变量 CORNER_RADIUS 就是半径的值。使用此代码,您只需从该 View 扩展该类即可创建任何圆形 View 。

public class RoundedImage extends android.support.v7.widget.AppCompatImageView
{
private final static float CORNER_RADIUS = 100.0f;

private Bitmap maskBitmap;
private Paint paint, maskPaint;
private float cornerRadius;

public RoundedImage(Context context) {
super(context);
init(context, null, 0);

}

public RoundedImage(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}

public RoundedImage(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}

private void init(Context context, AttributeSet attrs, int defStyle) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);

paint = new Paint(Paint.ANTI_ALIAS_FLAG);

maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

setWillNotDraw(false);
}

@Override
public void draw(Canvas canvas) {
Bitmap offscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
Canvas offscreenCanvas = new Canvas(offscreenBitmap);

super.draw(offscreenCanvas);

if (maskBitmap == null) {
maskBitmap = createMask(canvas.getWidth(), canvas.getHeight());
}

offscreenCanvas.drawBitmap(maskBitmap, 0f, 0f, maskPaint);
canvas.drawBitmap(offscreenBitmap, 0f, 0f, paint);
}

private Bitmap createMask(int width, int height) {
Bitmap mask = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
Canvas canvas = new Canvas(mask);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.WHITE);

canvas.drawRect(0, 0, width, height, paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, paint);

return mask;
}

使用方法是:

<com.packagename.RoundedImage
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centercrop"
/>

关于android-view - Android 中带有圆角的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15007878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com