我有一个自定义视图,其中包含几层图像、带有文本的布局、绘图等。我想将视图的一个角设为圆形(右上角)。换句话说,我想裁剪这个角使其变圆 - 而不是设置圆角背景。
我设法通过使用来做到这一点clipPath()
,但它运行缓慢,因为我必须为此视图打开硬件加速 - 所以这个解决方案不适合我。
还有其他方法吗?
我有一个自定义视图,其中包含几层图像、带有文本的布局、绘图等。我想将视图的一个角设为圆形(右上角)。换句话说,我想裁剪这个角使其变圆 - 而不是设置圆角背景。
我设法通过使用来做到这一点clipPath()
,但它运行缓慢,因为我必须为此视图打开硬件加速 - 所以这个解决方案不适合我。
还有其他方法吗?
这是扩展 ImageView 的自定义圆形 ImageView 类。这里变量 CORNER_RADIUS 是半径的值。使用此代码,您只需从该视图扩展该类即可创建任何圆形视图。
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"
/>
如果您为该自定义视图创建透明画布,这应该不是问题。然后在其余图形之前在其上绘制一个圆角矩形作为背景。
圆角矩形应大于画布并向左移动,以使画布的右上角保持透明。
但是,您是否在自定义视图中绘制更大的图像并且只想剪辑那个角落而不是用角落形状擦除那个角落充满油漆的路径
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));