【问题标题】:Android View outline - using a custom PathAndroid 视图大纲 - 使用自定义路径
【发布时间】:2017-04-21 16:46:57
【问题描述】:

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

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

【问题讨论】:

  • 你可以看看这里:issuetracker.google.com/issues/37064491.
  • OK 好像不支持。仅支持矩形、椭圆形和圆角矩形。非常感谢!如果你想发布一个,我可以接受这个作为答案。

标签: android


【解决方案1】:

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

我附上了一张图片以使其更加清晰:

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

android:outlineProvider="bounds"  
android:elevation="4dp"

第二张图片:CustomImageView with canvas.clipPath(getShapePath()) in onDraw() 方法[我们将得到剪裁的图像,但阴影仍显示为矩形边界]

android:outlineProvider="bounds"  
android:elevation="4dp"

第三张图片:在 onDraw() 方法中使用 canvas.clipPath(getShapePath()) 和在 ViewOutlineProvider 中使用 outline?.setConvexPath(getShapePath()) 的 CustomImageView。 [我们将得到裁剪后的图像,阴影将与裁剪后的图像对齐]

android:outlineProvider="bounds" // this will have no effect since it will be override by setConvexPath  
android:elevation="4dp"

Download Source Code

【讨论】:

  • 您似乎想在答案中上传一些图片,但您没有编辑答案并上传它们以澄清您的内容。
  • @Saeed 是的,我想上传图片,但它需要 10 个信誉点,因为我是新手,我没有。一旦我获得 10 声望点,我就会更新:-)
  • 你能分享第三个图像示例的所有代码吗? getShapePath() 定义在哪里?
  • @JimitPatel 原生 android 阴影仅适用于凸轮廓,如果您考虑椭圆、圆角矩形或矩形等形状,它们都是凸路径,但如果我们想要非凸路径然后我们可以使用:paint.setShadowLayer(shadowPadding, 0f, 0f, shadowColor) 或者您可以通过绘制假阴影来查看这个新的可绘制对象:developer.android.com/reference/com/google/android/material/…
  • @DavidAlbers,正如我所承诺的,这里是Complete Source Code
【解决方案2】:

似乎View 只能裁剪为矩形、圆角矩形或椭圆形Outline。相反,View 只能剪裁为使用setRect()setRoundRect()setOval() 方法专门定义的Outline。带有PathOutline 集将不起作用,即使Path 本身可能是上述形状之一。

在我看来,这在几个地方都有记录,虽然不是特别好。

View#setClipToOutline():

请注意,只有当视图的大纲从 canClip() 返回 true 时,才会尊重此标志。

Outline#canClip():

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

Defining Shadows and Clipping Views - Clip Views:

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

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

【讨论】:

  • 很棒的答案,谢谢!恕我直言,如果有人在 canClip() 返回 false 时尝试使用 Outline 进行剪辑,则抛出异常会更清楚。
猜你喜欢
  • 2018-12-31
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多