前言
在此之前向大家介绍过一次ShapeView
的用途和实现方式,也得到一些反馈,之后我也进行了改进。本篇做为ShapeView
的第二篇,不会再对实现过程做赘述,将告诉大家我做这个控件的目的,将给你们带来什么好处。也是因为本项目已趋于完善,所以我认为有必要向大家再介绍一次
效果图要先上
正如你们看到的,ShapeView
可以将您View
剪裁不同的图形,并且支持手势按下抬起,不同状态变换。这个时候你们可能会问了,Android
本身不是已经帮我们提供了这些功能的Api供我们使用吗。对的没错,但是按照系统的逻辑和实现过程,我们是不是应该新建一个drawable资源,然后配置View的background属性。我认为这样做是不够直观的而且过程有些繁琐。如果遇到变更,改起来还麻烦。特别是遇到一个drawable资源被2个或者多个view使用,且其中一个view的样式在版本更新的时候发生了变化,这个时候我又不能直接对这个drawable进行更改,只能另起炉灶再写一个drawable导致deawable资源文件增加,一旦这个drawable资源文件废弃的时候我还要去删,删的时候还要小心了,怕下次如果又有需要了呢。所以今天我给大家介绍一种更加轻松,直观的方式去实现shape。
shapeView的用法
<com.github.xwc.view.ShapeView
android:id="@+id/heartShapeView"
android:layout_width="150dp"
android:layout_height="150dp"
app:shape_borderWidth="3dp"
app:shape_heart_YPercent="0.16"
app:shape_heart_radian="0.2"
app:shape_defaultBgd="@mipmap/image1"
app:shape_pressedBgd="@mipmap/image2"
app:shape_type="heart">
<!-- content -->
</com.github.xwc.view.ShapeView>
复制代码
其中的shape_type控制剪裁的图形,每个图形都有对应的属性配置,具体详情可以查看Github,对于圆角矩形我单独抽出来了但它们两个都是继承基类shape其配置用法如下
<com.github.xwc.view.ButtonShapeView
android:id="@+id/buttonShape"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="5dp"
app:shape_borderWidth="1dp"
app:shape_defaultColor="#000000"
app:shape_pressedColor="#FFFFFF"
app:shape_roundRect_radius="30dp">
<!-- content -->
</com.github.xwc.view.ButtonShapeView>
复制代码
从属性配置上可以看出,非常直观清晰的告诉我们默认的颜色和按下时的颜色,以及圆角大小,不仅如此还可以配置默认和点击时的图片同时也支持加载网络资源。直接通过gradle就能使用了
compile 'com.github.xwc:ShapeView:1.2.7'
annotationProcessor 'com.github.xwc:ShapeView-compiler:1.2.5'
复制代码
由于我使用了编译时注解所以别忘记了加上annotationProcessor..这一行,加上之后并不会为您的项目引入其他的类文件,只会在您编译的时候自动生成一个工厂类类IClipPathFactory,我这样做也是为了能够使代码更加优雅,所以您可以放心大胆的使用!如果还想了解更多可以到github上下载源码
关于性能方面
对于一个自定义控件来说,性能也是一个需要考虑的问题。只有强劲的性能,才能为我们带来畅快的体验。其实我并不担心会有什么性能方面的问题,因为在实现shapeview的时候一没有高强的操作,二没有耗时的算法。所以性能方面的问题是不存在的,但是我还是做了一个简单的测试,我分别用TextView,Button和shapeView来实现同一效果,并在Activity的onResume方法记录当前时间,在onWindowFocusChanged方法记录时间差,时间差如下:
View | 时长(毫秒) | 平均值 | ||||
---|---|---|---|---|---|---|
Button | 67 | 66 | ... | 67 | 73 | 69.4 |
TextView | 65 | 46 | ... | 49 | 50 | 53.7 |
ShapeView | 60 | 54 | ... | 50 | 51 | 53.2 |
分别记录了10次,这里解释一下为什么在onResume记录时间和在onWindowFocusChanged记录时间差。因为View的测量绘制是发生在onResume之后,这一点我相信熟悉Activity启动流程的一定知道,这些知识点我就不详细说明了。再说onWindowFocusChanged方法它的携带参数hasFocus为true的时是窗体真正的完成初始化Visible获取焦点并可交互,换而言之也可以说此时view已经绘制完毕,所以我在此记录时间差。
对比上面的表格,可以看出在它们绘制时间都差不多,没有明显的差距(ShapeView好像是最快的),由此可以得出结论:使用ShapeView和系统drawable在效率上是一样的。所以有这方面顾虑的读者不用担心,可以放心大胆的使用!
总结
ShapeView
并不像那些很牛逼的开源软件一样,一定会被大家使用。它只是一个小轮子,不会让你有种冲上云霄的感觉,但是我相信在你用过之后,也会给您带来加速冲刺的推背感。
如果还有什么问题或者需求可以给我提 Issues。
短暂的交流就到这里,下次再会!