开发中遇到单/多边框的UI,简单的可以自己写shape图,复杂的一般都让设计配合制作9patch图了。
今天不说需要切图的情况,只聊简单的单/多边框,主要是实现思路。
效果很简单:
就以上图为例介绍,只有上边框,边框红色、宽1dp,其余为白色。
思路一
- 两层画布叠加:底层红色;上层白色;
- 上层白色画布下移1dp。
代码实现:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--下层画布,红色-->
<item>
<shape>
<solid android:color="#f10606" />
</shape>
</item>
<!--下层画布,白色,向下移1dp-->
<item android:top="1dp">
<shape>
<solid android:color="#ffffff" />
</shape>
</item>
</layer-list>
其中<item>
标签的left
、top
、right
、bottom
属性可以理解为view
的marginXX
,这样接下来的思路二也就顺理成章了。
思路二
margin有正值,也有负值,所以...
- 两层画布:底层全部白色;上层只有红色边框,边框宽度1dp;
- 上层红色边框分别设置左、右、下margin为-1dp(这里只要负值大于边框宽度即可,并且必须大于边框宽度)
代码实现:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--下层画布,全白色-->
<item>
<shape>
<solid android:color="#ffffff" />
</shape>
</item>
<!--上层画布,红色边框,宽度1dp;左、右、下设置margin,为啥是-5而不是-1,后边解释-->
<item
android:bottom="-5dp"
android:left="-5dp"
android:right="-5dp"
android:top="0dp">
<shape>
<stroke
android:width="1dp"
android:color="#f10606" />
</shape>
</item>
</layer-list>
单边框就这样了,同理,那二边框、三边框也就简单了。
按需自取。
坑?
你以为到则里就结束了?图样图森炮!
跑一下上边思路二的代码看看效果
神马情况,stroke
里width
的值和item
里left
等的值转化为像素的比例还不一样?并且不同手机分辨率效果也不同,分辨率越高越容易出现。
当然,思路二里把item
里left
等的负值绝对值设置比width
大的多一些就阔以了;另外,思路一是没这个问题的。
至于原因嘛,太晚了,睡一觉再研究吧。
更多shape实用效果请移步这里:
更多博客,请关注