我有一个自定义视图,其中包含多个图像层,包含文本的布局,图纸等。 我想让视图的一个角落(右上角)。 换句话说,我想裁剪这个角落使其变圆 - 而不是设置圆角背景。
我设法通过使用clipPath()
来实现,但由于我不得不为此视图转换硬件加速,因此运行速度很慢 - 所以此解决方案不适合我。
还有其他办法吗?
答案 0 :(得分:0)
如果为该自定义视图创建透明画布,这应该不是问题。然后在其余图形之前绘制一个圆角矩形作为背景。
圆角矩形应大于画布并向左移动,以使画布的右上角保持透明。
然而,你是在自定义视图中绘制biger图像,并且只想剪切那个角落,而不是只用角落形状擦除角落路径填充油漆
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
答案 1 :(得分:0)
这里是扩展ImageView的自定义圆形ImageView类。此处的变量CORNER_RADIUS是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"
/>