android - 自定义ViewGroup实现圆角边框效果外沿内容无法擦去?

浏览:47日期:2022-11-16

问题描述

在对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); }}

测试了一下:

<cn.litforest.source.widget.NewViewGroupandroid:layout_below='@+id/collapse_view'android:layout_width='match_parent'android:layout_height='wrap_content'><ImageView android:background='@drawable/raichu_face_by_keafox' android:layout_width='match_parent' android:layout_height='match_parent'/> </cn.litforest.source.widget.NewViewGroup>

效果图:android - 自定义ViewGroup实现圆角边框效果外沿内容无法擦去?

出现问题,没办法把圆角外面的内容擦去,请问该怎么解决?

问题解答

回答1:

看看这篇文章图像合成Xfermode和任意形状ImageView

关键原因是

这是因为直接通过Canvas#drawXX方法画图时, SRC仅是图形内的像素, 例如你画了一个圆, 那么SRC(即将要画的像素)仅是圆内的像素, 也就是说图片与圆不重叠的像素并不会有任何变化, 当然就不会消失了.

回答2:

之前我想用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); }

效果截图:android - 自定义ViewGroup实现圆角边框效果外沿内容无法擦去?

可以了。在问题中,PorterDuff.Mode.DST_IN不是显示下层相交部分吗,不明白为什么外沿也会出来?

回答3:

为什么我在布局文件中看到的是剪切之后的效果。用手机跑起来就没有效果了

相关文章: