问题描述
在对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>
效果图:
出现问题,没办法把圆角外面的内容擦去,请问该怎么解决?
问题解答
回答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); }
效果截图:
可以了。在问题中,PorterDuff.Mode.DST_IN不是显示下层相交部分吗,不明白为什么外沿也会出来?
回答3:为什么我在布局文件中看到的是剪切之后的效果。用手机跑起来就没有效果了