[关闭]
@act262 2017-03-26T15:20:46.000000Z 字数 2095 阅读 1162

各类自定义的Drawable

Android


使用 xml 定义的 shape 对应的是GradientDrawable,而ShapeDrawable是我们Java代码中常用到的,这2个没有相关关系。

drawable属性不支持直接使用颜色值,需要包装为ColorDrawable。可以用引用颜色值,或者增加一个<color>(ColorDrawable)子节点来设置颜色值。

  1. // 编译错误
  2. <item android:drawable="#f00" />

改为值引用或者包装一层

  1. <item android:drawable="@color/red" />
  1. <item>
  2. <color android:color="#f00" />
  3. </item>

具有多个样式的Drawable,用LayerDrawable组合多个Drawable

example:

  1. <View
  2. android:layout_width="200dp"
  3. android:layout_height="100dp"
  4. android:layout_gravity="center"
  5. android:background="@drawable/bg_divider" />

如果4边框规可以直接用ShapeDrawable,规则是指都有边框,大小、颜色一样。

  1. <shape xmlns:android="http://schemas.android.com/apk/res/android">
  2. <stroke
  3. android:width="1dp"
  4. android:color="#f00" />
  5. </shape>

image_1bc5f2d6e18ksgpr12p4ccvkhc9.png-10kB
不规则边框,可以用LayerDrawable来处理,同时需要注意LayerDrawable多层叠加导致的过度绘制,可以用paddinginsetgravity等属性设置位置关系。

例如需要做出顶部的边框或者顶部的分割线条效果
底色是红色,然后用白色盖住底色,距离顶部1dp,从而形成上边框1个dp的效果。

  1. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  2. <item>
  3. <color android:color="#f00" />
  4. </item>
  5. <item
  6. android:drawable="@android:color/white"
  7. android:top="1dp" />
  8. </layer-list>

image_1bc5f3jo119c91n601ao1odc1g7gm.png-9.1kB

多层颜色的覆盖会导致过度绘制,可以用下面的方式得到相同的效果而减少过度绘制

  1. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  2. <item
  3. android:drawable="@android:color/white"
  4. android:top="1dp" />
  5. <item android:height="1dp"> <!-- height/width API 23+才支持 -->
  6. <color android:color="#f00" />
  7. </item>
  8. </layer-list>

绘制一条线

  1. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  2. <item
  3. android:drawable="@android:color/white"
  4. android:top="1dp" />
  5. <item android:gravity="top"> <!-- 绘制一条线,需要设置gravity,不然会变成覆盖,且shape用的是矩形而不是line-->
  6. <shape android:shape="rectangle">
  7. <solid android:color="#f00" />
  8. <size android:height="1dp" />
  9. </shape>
  10. </item>
  11. </layer-list>

也可以用白色来覆盖多余的边框,留下一条边框

  1. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  2. <item>
  3. <shape>
  4. <stroke
  5. android:width="1dp"
  6. android:color="#f00" />
  7. </shape>
  8. </item>
  9. <item
  10. android:drawable="@android:color/white"
  11. android:top="1dp" />
  12. </layer-list>

居中的线条

  1. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  2. <item
  3. android:drawable="@android:color/white"
  4. android:top="1dp" />
  5. <item>
  6. <shape android:shape="line">
  7. <stroke
  8. android:width="1dp"
  9. android:color="#f00" />
  10. </shape>
  11. </item>
  12. </layer-list>

image_1bc5gfr5hfg91kv111odklq1pjn13.png-9.1kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注