开源啦·开源啦 Android 炫酷好用 的 裁切布局 ClipLayout ClipMask

203 阅读2分钟

开源啦·开源啦 Android 超炫酷 超好用 的 裁切布局 一个布局搞定所有裁切

你遇到过怎样的图片裁切需求?

1. 圆角矩形

round_rectangle.png

2. 带边框的圆角矩形

round_rectangle_border.png

3. 圆形

circle.png

4. 带边框的圆形

circle_border.png

你又遇到过怎样奇怪的布局需求?

1. 异形布局

special.png

2. 阴阳布局

yinyang.png

3. 还是心形布局

hart.png

所有这些,都可以用一个ClipLayout布局搞定

更重要的是

它会根据透明通道,重新调度触摸事件,所以事件会符合物理现象的进行图层穿透

请看展示效果

ClipLayout.gif

它不止是裁切图片的利器,也是裁切布局的利器

例如:上图中心形布局中的scrollview已经被自动裁切,即便滑动,也不影响裁切效果

阴阳布局的旋转过程,也没有因为旋转而忘记点击事件的重新分配

这么好的东西,会不会很难用呢?

当然不会啦,请看带边框圆形图片的布局代码

circle_border.png

Include_circle_border.xml

<com.sens.widget.ClipLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="64dp"
    android:layout_height="64dp">

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/oval" />

    <com.sens.widget.ClipMask
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="2dp"
        android:background="@drawable/oval" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="2dp"
        android:src="@drawable/sens" />
</com.sens.widget.ClipLayout>

第一层的oval是白色的圆形shape

第二层的mask同样使用oval作为模版

第三层的image是正常的图像

通过上面的代码,想必你已经看出来了,ClipLayout整体分为三层结构:

ClipLayout就是裁切的舞台(它负责所有裁切任务的调度),ClipMask就是裁切的模版。当然了 ClipLayout也可以包含多个ClipMask,但是ClipMask必需是ClipLayout的直接子View,否则它们的效果和FrameLayout无异。

没有ClipMaskClipLayout和FrameLayout的效果没有差异,因为它们均继承自FrameLayout,更复杂的模版和布局,写在它们的xml内部即可。

到这里想必你已经明白了:

ClipMask是裁切模版,只取透明通道,ClipMask默认对ClipMask之下的视图(即背景层)执行打洞操作,默认对ClipMask上层(即内容层)执行切割操作

当然了,默认行为是可以随时修改的

你可以通过修改ClipLayout 中的isReversal属性动态的使它的裁切效果反向。

即:如果 isReversal == true (默认false) 那么

ClipMaskClipMask之下的视图(即背景层)执行切割操作,对ClipMask上层(即内容层)执行打洞操作

讲到这里,请问:这么好的东西,会不会有兼容问题呢?

好消息是,ClipLayout 向下兼容至安卓2.3.7 向上兼容至安卓12.0 是的,它不存在兼容问题,放心用

那这么好的东西,会不会增加项目的重量呢?

它的代码不足200行。

200行你用不了吃亏,也用不了上当,走过路过,点赞收藏+关注

如果你想了解更多的实现原理,可直奔gay站看代码,也可以给我留言。

下面是一个使用ClipLayout制作的综合样例,喜欢请扫码进入gay站吧。

ticket.png

项目地址

体验APK

jar包