Android View大纲 - 使用自定义路径

时间:2017-04-21 16:46:58

标签: android

当我按如下方式设置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);
  }
});

enter image description here

但是,使用Path无效。将setRoundRect替换为:

Path path = new Path();
path.addRoundRect(
  0, 0, view.getWidth(), view.getHeight(), 16, 16, Path.Direction.CW);
outline.setConvexPath(path);

enter image description here

如何将视图剪辑设置为提供的路径?

2 个答案:

答案 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”

Valid XHTML

答案 1 :(得分:6)

似乎View只能裁剪为矩形,圆角矩形或椭圆Outline。相反,View只能剪切为Outline,该setRect()专门使用setRoundRect()setOval()Outline方法定义。即使Path本身可能是上述形状之一,Path设置为Outline也无效。

在我看来,这在几个地方有记载,但并不是特别好。

View#setClipToOutline()

  

请注意,如果View的Outline从canClip()返回true,则只会遵循此标志。

Outline#canClip()

  

目前,只有可以表示为矩形,圆形或圆形矩形的轮廓支持剪辑。

Defining Shadows and Clipping Views - Clip Views

  

只有矩形,圆形和圆角矩形轮廓支持剪裁,由Outline.canClip()方法确定。

初看起来,这似乎与Path自己的内部运作不一致,因为凸Path实际上是在内部用于非圆形椭圆。但是,简单地禁止所有外部定义的Path是有意义的,而不是花费必要的资源来确定任意python my_script.py 4 output: 2 是否有效。