学习自: KEEGAN小钢 原文连接:https://keeganlee.me/post/android/20150916android
官方文档: https://developer.android.google.cn/guide/topics/resources/drawable-resource#top_of_pageide
Drawable 指的是一种可绘制图像,但又不仅是图片。能够是一种颜色或者各类形状所组成的图形。Drawable 通常作背景显示。通常经过XML来编写,也能够经过代码来写。post
优势:占用空间小,减少APK 体积,可以更好的适配各类机型显示。学习
经过Bitmap 能够对图片进行一些设置,动画
属性 | 描述 |
---|---|
src | 指定图片资源(必须指定) |
tint | 给图片着色(更换颜色) |
gravity | 对齐方式 |
antialias | 是否开启抗锯齿 |
filter | 当对图片进行收缩或者延展后能够得到更平滑的效果 |
tileMode | 平铺方式 |
android:tileMode 平铺方式,ui
四个可选值: repeat,mirror,clamp(复制图片边缘颜色来填充剩余部分),disable(默认,没效果)google
效果图:3d
可以对png图片进行局部拉伸,建立方式右键一张png图片,选择 Create 9-Patch file...
code
操做方式:经过拖动黑线区域来指定可拉伸区域,交叉位置即为可拉伸区域(也是文本显示位置)。xml
效果图:
对Drawable 设置内边距,也能够对单个方向进行设置。
<?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/img1" android:inset="10dp" android:insetBottom="5dp" android:insetLeft="5dp" android:insetRight="5dp" android:insetTop="5dp" />
效果图:
对Drawable 进行裁剪,经过设置level值控制裁剪多少,level 取值范围 0~10000,默认0,也就是图片彻底不显示。
实用场景:进度条
android:gravity
设置裁剪的位置,可取值以下,多个取值用 | 分隔:
Style1:
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:clipOrientation="horizontal" android:drawable="@drawable/img1" android:gravity="left"/>
Style2: 也能够在其中定义 drawable类型的子标签
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:clipOrientation="horizontal" android:gravity="left"> <color android:color="@color/colorPrimary" /> </clip>
从0~10000效果图:
代码设置 level:
Scaleiv.drawable.level = progress
对Drawable 进行缩放操做,经过设置 level 来控制缩放比例,level 越高越接近原图。范围0~10000
属性 | 描述 |
---|---|
drawable | 指定drawable 资源 |
scaleHeight | 设置可缩放高度的最大百分比,也就是说最小可以缩小到原图的百分之多少 |
scaleWidth | 设置可缩放宽度的最大百分比,也就是说最小可以缩小到原图的百分之多少 |
scaleGravity | 缩放后图片位置 |
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/img2" android:scaleGravity="center" android:scaleHeight="50%" android:scaleWidth="50%" />
须要经过代码设置level
从0到10000的变化,最小图是原图的50%
将多个drawable 放到一个集合中,更具设置level 来显示不一样drawable
item 匹配规则是从上到下,只要匹配就会返回,不会继续往下走。
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/img1" android:maxLevel="50" android:minLevel="0" /> <item android:drawable="@drawable/img2" android:maxLevel="100" android:minLevel="51" /> </level-list>
通常状况下,每一个item按照maxLevel从小到大添加,以下:
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/battery_low" android:maxLevel="10" /> <item android:drawable="@drawable/battery_below_half" android:maxLevel="50" /> <item android:drawable="@drawable/battery_over_half" android:maxLevel="99" /> <item android:drawable="@drawable/battery_full" android:maxLevel="100" /> </level-list>
Transition 继承自 layer-list, 可是transition 只能添加两个drawable,提供了两个drawable切换的方法,切换时会有淡入淡出效果。
应用场景:开关背景图
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/img1" /> <item android:drawable="@drawable/img2" /> </transition>
切换代码:
var td = iv_temp.drawable as TransitionDrawable //动画时长 td.startTransition(1000) //正向切换,第一张到第二张 (只能实现第一张到第二张) td.reverseTransition(1000) //逆向切换,第二张到第一张 (能够实现两张来回切换)
对drawable 进行旋转
应用场景:上箭头图片显示为下箭头图片
属性 | 描述 |
---|---|
fromDegrees | 起始角度度数 |
toDegrees | 结束角度度数(正数表示顺时针,负数表示逆时针) |
pivoX | 旋转中心X坐标,百分比表示,相对于左边缘距离 |
pivoY | 旋转中心X坐标,百分比表示,相对于上边缘距离 |
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/img2" android:fromDegrees="0" android:pivotX="5%" android:pivotY="50%" android:toDegrees="180" />
效果图:
建立帧动画,将多张drawable按照必定的播放顺序和必定的播放时间间隔来播放。
oneshot: 是不是播放一次 duration:播放时间间隔
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/img_miao1" android:duration="80" /> <item android:drawable="@drawable/img_miao2" android:duration="80" /> <item android:drawable="@drawable/img_miao3" android:duration="80" /> </animation-list>
开始及中止动画:
var animDrawable = activity_frame_animation_iv.drawable as AnimationDrawable animDrawable.start() //播放动画 animDrawable.stop() //中止播放
配合着Rotate使用,达到自动播放效果
<?xml version="1.0" encoding="utf-8"?> <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/test_rotate" android:pivotY="50%" android:pivotX="50%"> </animated-rotate>
使用layer-list 能够将多个 drawable 按照顺序层叠在一块儿显示。列表最后一个drawable 绘于顶部。
该图经过使用一个红色背景层和一个白色背景层实现,白色背景层在经过设置 android:bottom
向上偏移,显示图底部红色背景层。 偏移属性其实和 Margin
一个做用。
代码:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true"> <layer-list> <item android:drawable="@android:color/holo_red_dark" /> <item android:bottom="4dp" android:drawable="@android:color/white" /> </layer-list> </item> <item android:state_checked="false"> <layer-list> <item android:drawable="@android:color/holo_red_dark" /> <item android:bottom="2dp" android:drawable="@android:color/white" /> </layer-list> </item> </selector>
偏移指的是移动整个图层
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 灰色阴影 --> <item android:left="2dp" android:top="4dp"> <shape> <solid android:color="@android:color/darker_gray" /> <corners android:radius="10dp" /> </shape> </item> <!-- 白色前景 --> <item android:bottom="4dp" android:right="2dp"> <shape> <solid android:color="#FFFFFF" /> <corners android:radius="10dp" /> </shape> </item> </layer-list>