是否可以在android中屏蔽视图?

Posted

技术标签:

【中文标题】是否可以在android中屏蔽视图?【英文标题】:Is it possible to mask a View in android? 【发布时间】:2011-09-26 17:57:40 【问题描述】:

是否可以屏蔽视图?例如,如果我的设计要求列表视图在椭圆形开口内可见。有没有办法为视图创建蒙版?是不是叫别的东西?因为我在 android 文档中找到的所有关于遮罩的引用都在谈论遮罩画布对象或可绘制对象。但我不认为像列表视图这样的交互式对象的可绘制将是一个好方法。这只是暂时要处理的限制吗?

【问题讨论】:

【参考方案1】:

是的,它是 - 您必须覆盖视图的绘制方法 - 即:

......
final Path path = new Path();
path.addRoundRect(new RectF(0,0,getWidth(),getHeight()),10,10,Direction.CW);
......
@Override
protected void dispatchDraw(Canvas canvas)
    canvas.clipPath(path);
    super.dispatchDraw(canvas);

这只会在路径设置的边界内绘制您的视图。

【讨论】:

您也可以创建您想要的任何“蒙版”效果,然后将其放入自己的视图中,然后将其放在相关视图的顶部/前面。如果您只需要对 1 个特定视图使用此效果,则可以省去创建自己的视图和编辑绘制方法的麻烦。 那是完全错误的,蒂姆。在性能至关重要的移动平台上创建完全不必要的视图层次结构会降低应用程序的速度。 我同意这会导致性能下降。我认为,如果他将其应用于 1 个活动中的 1 个视图,那么人眼在外面的设备上将不会注意到性能差异。对于某些人来说,使用单独的视图来做这件事似乎比尝试创建自己的视图以便他们可以覆盖绘图方法更令人生畏。我知道在你掌握了一些东西之后,做这样的事情就变得微不足道了。但是,如果您以前从未这样做过,对我来说这似乎有点令人生畏。 如果我用这个覆盖我的 imageview 的 dispatchDraw 方法,什么也不会发生。图像像以前一样绘制。 此解决方案不适用于屏蔽动画视图【参考方案2】:

是的,您甚至可以屏蔽完整的布局。 无耻的自拔

<com.christophesmet.android.views.maskableframelayout.MaskableFrameLayout
android:id="@+id/frm_mask_animated"
android:layout_
app:porterduffxfermode="DST_IN"
app:mask="@drawable/animation_mask"
android:layout_>

<ImageView android:layout_
           android:layout_
           android:scaleType="centerCrop"
           android:src="@drawable/unicorn"/>

你可以找到它here

【讨论】:

以上是关于是否可以在android中屏蔽视图?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用微调器在相同的 android 活动中添加列表视图

是否可以在android中将一个视图放在另一个视图上?

是否可以在视图上设置背景 png 并将其锚定到顶部而不在 Android 中缩放?

android开发设置屏蔽录制

是否可以在viewpager android中只创建一个可滑动的视图

是否可以覆盖我的 android 应用程序中所有视图的 onClick 侦听器?