在对viewGroup实现圆角边框效果,我是我的代码:
public class NewViewGroup extends FrameLayout { public NewViewGroup(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onLayout(boolean c, int l, int t, int r, int b) { super.onLayout(c, l, t, r, b); } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.FILL); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); canvas.drawRoundRect(new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()), 120, 120, paint); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); } }
测试了一下:
效果图:
出现问题,没办法把圆角外面的内容擦去,请问该怎么解决?
为什么我在布局文件中看到的是剪切之后的效果。用手机跑起来就没有效果了
之前我想用PorterDuffXfermode做出圆角效果的,但是做不出来,现在用clipPath裁剪canvas来做。
代码改为:
@Override protected void dispatchDraw(Canvas canvas) { Path path = new Path(); path.addRoundRect(new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()), 60, 60, Path.Direction.CW); canvas.clipPath(path, Region.Op.REPLACE); super.dispatchDraw(canvas); }
效果截图:
可以了。在问题中,PorterDuff.Mode.DST_IN不是显示下层相交部分吗,不明白为什么外沿也会出来?
看看这篇文章图像合成Xfermode和任意形状ImageView
关键原因是
这是因为直接通过Canvas#drawXX方法画图时, SRC仅是图形内的像素, 例如你画了一个圆, 那么SRC(即将要画的像素)仅是圆内的像素, 也就是说图片与圆不重叠的像素并不会有任何变化, 当然就不会消失了.