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

Mar*_*cek 6 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);
  }
});
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,使用a Path没有效果.替换setRoundRect为:

Path path = new Path();
path.addRoundRect(
  0, 0, view.getWidth(), view.getHeight(), 16, 16, Path.Direction.CW);
outline.setConvexPath(path);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何使视图剪辑到提供的路径?

Mik*_* M. 7

似乎View只能剪裁为矩形,圆角矩形或椭圆形Outline.相反,View可以仅被限幅到Outline一个与一个具体定义setRect(),setRoundRect()setOval()方法.即使它本身可能是上述形状之一,但是具有不起作用的Outline集合也是Path行不通的Path.

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

View#setClipToOutline():

请注意,只有View的Outline从中返回true时才会遵循此标志canClip().

Outline#canClip():

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

定义阴影和剪切视图 - 剪辑视图:

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

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


Gau*_*egi 7

我知道它没有帮助裁剪,但仍然可以利用outline.setConvexPath(path);的优势在高程阴影中,因为它可以很好地用作路径周围高程阴影的轮廓。

我附加了一张图片,以使其在以下位置更加清晰:

第一张图片:带有[带有阴影的图片]的ImageView

android:outlineProvider =“ bounds”
android:elevation =“ 4dp”

第二图像:CustomImageView与canvas.clipPath(getShapePath())的onDraw()方法[我们将获得cliped图像,但仍阴影显示为矩形约束]

android:outlineProvider =“ bounds”
android:elevation =“ 4dp”

第三图像:CustomImageView与canvas.clipPath(getShapePath())的onDraw()方法?轮廓.setConvexPath(getShapePath())ViewOutlineProvider [我们将得到cliped图像和阴影将褐藻胶有cilped图片]

android:outlineProvider =“ bounds” //这将无效,因为它将被setConvexPath覆盖
android:elevation =“ 4dp”

有效的XHTML

  • @Saeed 是的,我想上传图片,但它需要 10 个声誉点,因为我是新人,我没有任何声誉点。一旦我获得 10 点声望点,我就会更新:-) (2认同)