在原有的基础上,新增了java版本,目前支持kotlin和java两个版本,git地址:文章链接
又更新了,新增文字大小自适应方法,xml文件中可控
在Android开发中,使用Shape标签可以很方便的帮我们构建资源文件,跟传统的png图片相比:
- shape标签可以帮助我们有效减小apk安装包大小。
- 在不同手机的适配上面,shape标签也表现得更加优秀。
关于shape标签如何使用,在网上一搜一大把,笔者这里就不赘述了,今天我们要讨论的shape标签泛滥成灾以后带来的后果。这里先给大家看一个维护刚刚有3年的项目的drawable目录。
请注意右侧标红的滚动条,有没有感觉很酸爽,在这个目录下的文件现在已经接近400个了,并且还在不停的增加。我们分析这个目录下的xml构成,发现主要由两种类型构成:selector和shape。selector这里略过不提,重点是shape,发现shape文件已经超过一半多,并且还会不停的增加,我们在带着好奇的心态,随便点开几个shape看一看
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- solid的表示填充颜色 -->
<solid android:color="#44ffffff"/>
<stroke
android:width="1px"
android:color="#77ffffff"/>
<!--为了展示半圆,就把角度设置的大点-->
<corners android:radius="100dp"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<corners android:radius="1dip" />
<stroke
android:width="0.5dip"
android:color="#ea474f" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="0.5dp"
android:color="@color/color_de" />
<solid android:color="@color/white" />
<corners android:radius="5dp" />
</shape>
真的是不看不知道,一看吓一跳。原来我们项目中大量存在的shape文件其实都是大同小异的。涉及到最常见的shape变化:圆角,描边,填充以及渐变。进一步分析,我们又发现:
- 有些时候填充颜色是相同的,只不过圆角半径不同,我们就得新增及一个shape文件。
- 有些时候圆角半径是相同的,只不过填充颜色不同,我们又得增加一个shape文件。
- 有些时候两个负责不同业务模块的同事,各自新增一个同样样式的shape文件。
等等一些情况,让我们陷入了shape文件的无限新增与维护中。我们不禁要思考,有没有办法可以把这些shape统一起来管理呢?xml书写出来的代码最终不都是会对应一个内存中的对象么?我们能不能从管理shape文件过渡到管理一个对象呢?
Talk is cheap 。 Show me the code
第一步,我们需要确定shape标签对应的泪到底是哪一个?第一反应就是ShapeDrawable,顾名思义嘛。然后残酷的事实告诉我们其实是GradientDrawable这兄弟。浏览GradientDrawable类的方法结构,从中我们也找到了setColor()、setCorner