《Android编程权威指南》之XML drawable篇笔录

本章内容的项目实战呢,是在美化BeatBox应用,由于没有实践此应用,那以Demo形式来总结此章的核心知识点吧。

凡是要在屏幕上绘制的东西都可以叫作drawable,比如抽象图形、Drawable类的子类、位图图像等。用来封装图片的BitmapDrawable也是一种drawable。state list drawable、shape drawable 和 layer list drawable 统称为XML drawable。

1. shape drawable

ShapeDrawable可以把按钮变成圆形。XML drawable和屏幕像素密度无关,无需考虑创建特定像素密度目录,直接放入drawable文件夹即可。

button_beat_box_normal.xml(书中例子)

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@color/colorAccent" />
</shape>

截图取自Demo
效果:
截图取自Demo
shape图形参数详细解析:

  1. shape 图形形状
  2. corners 圆角标签(指定长方形四角的圆滑度)
    • bottomLeftRadius 左下角
    • bottomRightRadius 右下角
    • topLeftRadius 左上角
    • topRightRadius 右上角
    • radius 是四个角,设置了这个就不需要设置上面的四个了,但是它的优先级比较低, 会被上面的设置覆盖。
  3. gradient 阶梯渐变标签
    • angle 是颜色变换的角度,默认是0, 取值必须是45的倍数, 0: 是颜色从左边到右边, 90:是颜色从底部到顶部
    • startColor centerColor endColor : 开始的颜色,中间的颜色, 结束的颜色
    • centerX centerY是指定位置坐标,取值是0.0f ~ 1.0f 之间,例如: android:centerX="0.5f" 表示X方向的中间位置
    • type 颜色渐变的类型, 取值类型有三种:linear/radial/sweep
    • linear 线性渐变,就是颜色从左往右, 从下往上
    • radial 放射渐变, 例如:从一个圆中心到圆的边缘变化
    • sweep 扫描式渐变, 类似雷达扫描的那种图形
    • gradientRadius 和android:type=”radial”一起连用,配置shape图片的半径
  4. padding 边距标签(设置控件中(文字)内容与shape图片边框的距离,bottom 底部距离,left 左边距离,right 右边距离,top 顶部距离)
  5. size 大小标签(shape图形的宽度和高度,这里一般不用设置,它的优先级没有控件的优先级大)
  6. solid 背景标签(stroke标签中如果不指定color的颜色, 则默认是黑色,solid标签会和gradient标签冲突, 会覆盖gradient配置的颜色)
  7. stroke 边框标签 (给shape图形设置边框, 设置边框的宽度, 颜色,实现还是虚线, 以及虚线的间隔大小)
    • width 边框线的宽度
    • color 边框线的颜色
    • dashGap 虚线间隔的长度
    • dashWidth 虚线中实线的长度

shape图形:

  1. rectangle 长方形/默认是长方形
  2. oval 椭圆
  3. line 线(line形状下,solid标签下的color会无效)
  4. ring 环形 (innerRadius——中间圆圈的半径;innerRadiusRatio——如果和innerRadius同时存在, innerRadiusRatio无效,是一个比率: shape图片宽度/内半径, 默认是9;thickness——圆环的厚度,整的shape图片的半径减去内圆的半径;thicknessRatio——同样如果和thickness同时存在,thicknessRatio无效, 也是一个比率: shape图片宽度/圆环厚度,默认值是3;useLevel—— 一般使用false)

2. state list drawable

这里例子就是在完善上一个知识点的按钮按下状态的切换了,除了按下状态,state list drawable还支持禁用、聚焦以及激活等状态。

button_beat_box_pressed.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="oval">
   <solid android:color="@color/colorPrimary" />
</shape>

button_beat_box.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_beat_box_pressed"
          android:state_pressed="true" />
    <item android:drawable="@drawable/button_beat_box_normal" />
</selector>
截图取自Demo

按下后的效果:


截图取自Demo

当然,state list drawable还支持禁用、聚焦以及激活等状态。

3. layer list drawable

layer list drawable能让两个XML drawable合二为一,现在为按下状态的添加一个深色的圆环。

button_beat_box_pressed.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval">
            <solid android:color="@color/colorPrimary"/>
        </shape>
    </item>
    <item>
        <shape android:shape="oval">
            <stroke
                android:width="4dp"
                android:color="@color/colorPrimaryDark"/>
        </shape>
    </item>
</layer-list>

按下效果:


截图取自Demo

深入学习:为什么要用XML drawable

  • 方便灵活、用法多样、易于更新维护,搭配shape drawable 和 layer list drawable可作出复杂的背景图,配色简单。
  • XML drawable 独立于屏幕像素密度,直接定义在drawable目录中,不需要加屏幕密度资源修饰符,不需要准备多个版本以适配更多设备。

深入学习:使用 9-patch 图像

(比如说聊天界面的气泡框,会用到这种图片,解决了不同长度图片或文字可能被拉伸的问题)

  • 9-patch 图像是一种特别处理过的文件,让Android知道图像的哪些部分是可以拉伸的。
  • 9-patch 图像分成 3 x 3 的网格,即由9部分或者9 patch组成的网格。网格角落部分不会被缩放。边缘部分的4个patch只按一个维度缩放,而中间部分则按两个维度缩放。
截图取于网上
  • 9-patch 图像文件名以 .9.png结尾,图边缘具有1像素宽度的边框。
  • 任意图形编辑器都可以用来创建 9-patch 图像,Android SDK自带的draw9patch工具更方便,工具地址:SDK安装目录下的tools中,找到打开即可。


    截图取自自身电脑
    截图取自自身电脑
  • 9-patch工具中,把图像顶部左边填充为黑色,以标记图像的可伸缩区域。 底部右边定义可选drawable区域,通常是绘制内容,比如说文字的地方,若不标记drawable区域,则默认与可拉伸区域保持一致。
  • Android Studio内置有9-patch编辑器,可以直接在项目中把图片转换为9-patch图,先重命名,然后打开,就可以自行去设置.9图了。
1
2
3

这个非常实用!

深入学习:使用Mipmap图像

推荐把应用启动器图标放在mipmap目录中,其他图片都放在drawable目录中。

谷歌官方:

  • drawable/
    For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML files that describe Drawable shapes or Drawable objects that contain multiple states (normal, pressed, or focused). See the Drawable resource type.
  • mipmap/
    For app launcher icons. The Android system retains the resources in this folder (and density-specific folders such as mipmap-xxxhdpi) regardless of the screen resolution of the device where your app is installed. This behavior allows launcher apps to pick the best resolution icon for your app to display on the home screen. For more information about using the mipmap folders, see Managing Launcher Icons as mipmap Resources.

google说图片放入mipmap系统会在缩放上提供一定的性能优化,使用上来说,drawable和mipmap上放普通图片区别也不大。原来我们把项目中用到的png、jpeg图片还有xml文件都是放在drawable中,显得还是很杂乱的,找个图片多难哇~ 所以,建议就把icon图片放mipmap,然后xml就放drawable,这样不错的。

建议尺寸:

截图取自网络
有一篇关于drawable很好的文章:https://blog.csdn.net/guolin_blog/article/details/50727753

参考里面的dpi范围-密度表格:

截取自网络
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容