【发布时间】:2013-04-01 03:14:18
【问题描述】:
我正在尝试实现一个用圆角绘制自身的 LinearLayout 子类。根据我的研究,我设置setWillNotDraw(false) 并覆盖onDraw() 以在画布中绘制一个圆角矩形:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), drawPaint, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
| Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG);
canvas.drawRoundRect(bounds, mCornerRadius, mCornerRadius, roundPaint);
canvas.restoreToCount(sc);
}
地点:
drawPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
drawPaint.setColor(0xffffffff);
drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
roundPaint.setColor(0xffffffff);
DST_IN 在这里似乎是正确的选择(根据 APIDemos 示例),但是应该透明的区域(圆形区域)改为黑色背景,并且孩子的角落仍然可见。这是搭载 Android 4.2.2 的 Galaxy Nexus 上的结果:
有什么提示吗?
编辑:这是我想要实现的目标,对于 photoshopping 的粗糙表示抱歉:)
编辑 2:我向 GitHub 添加了一个示例可运行项目:https://github.com/venator85/RoundClippingLayout
谢谢 ;)
【问题讨论】:
-
已经尝试过,但不起作用,因为我不是使用 ImageView 而是使用布局。我什至不知道 onDraw() 而不是 dispatchDraw(),甚至两者都是覆盖的正确方法。
-
该算法将起作用。您只需要获取返回的 Bitmap 并使用它创建一个 BitmapDrawable。然后将其设置为视图的背景。
-
您能否发布或链接到更多代码。如果你已经准备好调试代码会容易得多。
-
问题中添加的示例可运行项目。谢谢