当我按如下方式设置View的大纲时,它的效果很好:
view.setClipToOutline(true);
view.setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), 16);
}
});
但是,使用Path
无效。将setRoundRect
替换为:
Path path = new Path();
path.addRoundRect(
0, 0, view.getWidth(), view.getHeight(), 16, 16, Path.Direction.CW);
outline.setConvexPath(path);
如何将视图剪辑设置为提供的路径?
答案 0 :(得分:7)
我知道它对裁剪没有帮助,但是仍然可以在立面阴影中利用 outline.setConvexPath(path); 的优势,因为它可以很好地用作环绕周围的立面阴影的轮廓路径。
我在其中附加了一张图片,以使其更加清晰:
第一张图片:带有[带阴影的图片]
的ImageView android:outlineProvider =“ bounds”
android:elevation =“ 4dp”
第二张图片:在 onDraw()方法中具有 canvas.clipPath(getShapePath())的CustomImageView [我们将获得裁剪的图像,但阴影仍然显示为矩形边界]
android:outlineProvider =“ bounds”
android:elevation =“ 4dp”
第三张图像:具有 onDraw()方法中的 canvas.clipPath(getShapePath())和 outline?.setConvexPath的CustomImageView ( ViewOutlineProvider 中的(getShapePath())。[我们将获得裁剪的图像,阴影将与对齐的图像一起出现]
android:outlineProvider =“ bounds” //这将无效,因为它将被setConvexPath
覆盖。
android:elevation =“ 4dp”
答案 1 :(得分:6)
似乎View
只能裁剪为矩形,圆角矩形或椭圆Outline
。相反,View
只能剪切为Outline
,该setRect()
专门使用setRoundRect()
,setOval()
或Outline
方法定义。即使Path
本身可能是上述形状之一,Path
设置为Outline
也无效。
在我看来,这在几个地方有记载,但并不是特别好。
请注意,如果View的Outline从
canClip()
返回true,则只会遵循此标志。
目前,只有可以表示为矩形,圆形或圆形矩形的轮廓支持剪辑。
Defining Shadows and Clipping Views - Clip Views:
只有矩形,圆形和圆角矩形轮廓支持剪裁,由
Outline.canClip()
方法确定。
初看起来,这似乎与Path
自己的内部运作不一致,因为凸Path
实际上是在内部用于非圆形椭圆。但是,简单地禁止所有外部定义的Path
是有意义的,而不是花费必要的资源来确定任意python my_script.py 4
output: 2
是否有效。