Android中带圆角的自定义视图

时间:2013-02-21 16:53:03

标签: android android-view android-ui android-custom-view

我有一个自定义视图,其中包含多个图像层,包含文本的布局,图纸等。 我想让视图的一个角落(右上角)。 换句话说,我想裁剪这个角落使其变圆 - 而不是设置圆角背景。

我设法通过使用clipPath()来实现,但由于我不得不为此视图转换硬件加速,因此运行速度很慢 - 所以此解决方案不适合我。

还有其他办法吗?

2 个答案:

答案 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"
 />