概述
目录
- 前言
- Android5.0前标签
- shape
- 属性
- 子标签
- selector
- 属性
- 子标签
- rotate
- 属性
- 子标签
- bitmap
- 属性
- nine-patch
- 属性
- color
- 属性
- inset
- 属性
- 子标签
- clip
- 属性
- 子标签
- 注意
- scale
- 属性
- 子标签
- level-list
- 子标签
- item属性
- layer-list
- 属性
- 子标签
- transition
- 属性
- 子标签
- 注意
- animation-list
- 属性
- 子标签
- animation-rotate
- 属性
- 子标签
- android5.0新增标签
- vector
- 属性
- 子标签:
- animated-vector
- 属性
- 子标签:
- 说明
- ripple
- 属性
- 子标签
- 说明
- animated-selector
- 属性
- 子标签
- 说明
- adaptive-icon
- 属性
- 子标签
- maskable-icon
- 属性
- 子标签
- drawable
- 总结
前言
我们在drawable目录下可以创建很多自定义的资源,其中用的最多的应该就是selector和shape。目前在Android中有21种drawable标签,了解和利用这些标签对我们的开发有很大的帮助。这个文章我们对这21种标签做一个介绍,让大家有一个印象。
本文中有些资料取自网上,当时记录在笔记中,但是由于时间久远,忘记出处了。
Android5.0前标签
shape
这个大家非常熟悉,简单列举一下属性和子标签,至于子标签的属性和具体使用就不细说了,网上有的是
属性
-
android:dither 是否启动图片抖动
-
android:shape 形状。分别为矩形、线、椭圆、环。默认为矩形rectangle
当为line时,一定要有stroke,实线虚线都可以,但是只能是横线,并且局中,主要用于分割线
-
android:tint 给shape着色
-
android:tintMode 着色类型(蒙版类型)
-
android:visible
//下面这五个属性是shape为ring,即圆环是才使用的
-
android:innerRadius
-
android:innerRadiusRatio
-
android:thickness
-
android:thicknessRatio
-
android:useLevel
子标签
-
solid填充颜色
-
corners圆角
-
stroke描边
-
padding边距
-
size长宽
-
gradient渐变
selector
选择器,也很常用,设置不同状态下不同的drawable。
属性
-
android:dither 是否启动图片抖动
-
android:visible
-
android:enterFadeDuration 状态改变时,新状态展示时的淡入时间,以毫秒为单位
-
android:exitFadeDuration 状态改变时,旧状态消失时的淡出时间,以毫秒为单位
-
android:autoMirrored 设置图片是否需要镜像反转,当布局方向是RTL,即从右到左布局时才有用,API Level 19(Android 4.4)才添加的属性
在某些语言下如阿拉伯语习惯是从右到左,在manifest的application中需要设置android:supportsRtl,另外在组件中还有两个相关属性android:layoutDirection和android:textDirection
-
android:variablePadding (基本不用)选择true时,drawable的内边距会根据状态的变化而变化,设置为true时,你必须为不同的状态配置layout,但是通常不建议这么做。选择false时,内边距保持一致,所有状态中最大的内边距。
-
android:constantSize 当选择器各个状态的图片大小不一时,设置为 true表示以最大的图片的尺寸显示,设置为false以默认的图片的尺寸显示
子标签
- item 该标签下可以定义drawable类型的子标签
rotate
可以对资源进行旋转
属性
-
android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
-
android:fromDegrees 起始的角度度数
-
android:toDegrees 结束的角度度数,正数表示顺时针,负数表示逆时针
-
android:pivotX 旋转中心的X坐标,浮点数或是百分比。浮点数表示相对于drawable的左边缘距离单位为px,如5; 百分比表示相对于drawable的左边缘距离按百分比计算,如5%; 另一种百分比表示相对于父容器的左边缘,如5%p; 一般设置为50%表示在drawable中心
-
android:pivotY 旋转中心的Y坐标
-
android:visible 设置初始的可见性状态,默认为false
子标签
当不设定android:drawable时,可以添加任意drawable的子标签,比如shape(其实也可以将shape单独放一个xml文件中,然后用android:drawable设定,其实是一样的,只不过直接通过shape标签可以减少一个文件),这样在通过旋转可以实现某些图形,如三角形。但是比较麻烦,也不常用,这里就不细说了。
bitmap
属性
-
android:src 必填项,指定图片资源,只能是图片,不能是xml定义的drawable资源(所以svg不行)
-
android:gravity 设置图片的对齐方式,比如在layer-list中,默认是填满整个视图则会拉伸,用这个值。多个取值可以用 | 分隔:
-
android:antialias 设置是否开启抗锯齿
-
android:dither 设置是否抖动,图片与屏幕的像素配置不同时会用到,比如图片是ARGB 8888的,而屏幕是RGB565
-
android:filter 设置是否允许对图片进行滤波,对图片进行收缩或者延展使用滤波可以获得平滑的外观效果
-
android:tint 着色
-
android:tileMode 设置图片平铺的方式,其中clamp复制图片边缘的颜色来填充容器剩下的空白部分
-
android:alpha 透明度
-
android:mipMap 设置是否可以使用mipmap,但API Level最低要求是17,即Android 4.2
-
android:autoMirrored 设置图片是否需要镜像反转,上面提到了
-
android:tileModeX 设置水平方向的平铺方式,这是API Level 21(Android 5.0)才添加的属性
-
android:tileModeY 设置垂直方向的平铺方式,这是API Level 21(Android 5.0)才添加的属性
-
android:tintMode 着色模式,也是API Level 21(Android 5.0)才添加的属性
nine-patch
属性
- android:src 必填项,必须指定点九类型的图片 xxx.9.png
其他属性与bitmap完全一样,不复述了。
color
属性
只有一个android:color属性,因为可以直接在color.xml设置颜色,所以这个用处不多。
inset
设置边距,注意这个边距不是指内容与view边界的padding(如shape中的padding),而是drawable与view边界的距离
比如做背景时,无论怎么设置view的padding,图案都是完整填充view的,设置了这个之后就可以让图案四周留出空白。
属性
-
android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
-
android:visible 设置初始的可见性状态,默认为false
-
android:insetLeft 左边距
-
android:insetRight 右边距
-
android:insetTop 顶部边距
-
android:insetBottom 底部边距
-
android:inset 设置统一边距,会覆盖上面四个属性,但API Level要求为21,即Android 5.0
子标签
如果不设置drawable属性,也可以定义drawable类型的子标签,如shape等
clip
使用clip标签可以对drawable进行裁剪,在做进度条时很有用。通过设置level值控制裁剪多少,level取值范围为0~10000,默认为0,表示完全裁剪,图片将不可见;10000则完全不裁剪,可见完整图片。
属性
-
android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
-
android:clipOrientation 设置裁剪的方向
-
android:gravity 设置裁剪的位置,可取值如下,多个取值用 | 分隔:
-
top: 图片放于容器顶部,不改变图片大小。当裁剪方向为vertical时,会裁掉图片底部
-
bottom: 图片放于容器底部,不改变图片大小。当裁剪方向为vertical时,会裁掉图片顶部
-
left: 图片放于容器左边,不改变图片大小,默认值。当裁剪方向为horizontal,会裁掉图片右边部分
-
right: 图片放于容器右边,不改变图片大小。当裁剪方向为horizontal,会裁掉图片左边部分
-
center: 图片放于容器中心位置,包括水平和垂直方向,不改变图片大小。当裁剪方向为horizontal时,会裁掉图片左右部分;当裁剪方向为vertical时,会裁掉图片上下部分
-
fill: 拉伸整张图片以填满容器的整个高度和宽度。这时候图片不会被裁剪,除非level设为了0,此时图片不可见
-
center_vertical: 图片放于容器垂直方向的中心位置,不改变图片大小。裁剪和center时一样
-
center_horizontal: 图片放于容器水平方向的中心位置,不改变图片大小。裁剪和center时一样
-
fill_vertical: 在垂直方向上拉伸图片以填满容器的整个高度。当裁剪方向为vertical时,图片不会被裁剪,除非level设为了0,此时图片不可见
-
fill_horizontal: 在水平方向上拉伸图片以填满容器的整个宽度。当裁剪方向为horizontal时,图片不会被裁剪,除非level设为了0,此时图片不可见
-
clip_vertical: 附加选项,裁剪基于垂直方向的gravity设置,设置top时会裁剪底部,设置bottom时会裁剪顶部,其他情况会同时裁剪顶部和底部
-
clip_horizontal: 附加选项,裁剪基于水平方向的gravity设置,设置left时会裁剪右侧,设置right时会裁剪左侧,其他情况会同时裁剪左右两侧
-
子标签
如果不设置drawable属性,也可以定义drawable类型的子标签,如shape等
注意
必须设置level才会生效,而level只能在代码中设置,ImageView.setImageLevel()。除了用于进度条,配合属性动画可以实现图片各种效果的逐渐展示。
scale
与clip类似,也需要设置level值,0-10000,10000是原大小,但是可以设置超过10000的值,则为放大。
属性
-
android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
-
android:scaleHeight 设置可缩放的高度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半
-
android:scaleWidth 设置可缩放的宽度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半
-
android:scaleGravity 设置drawable缩放后的位置,取值和bitmap标签的一样,就不一一列举说明了,不过默认值是left
-
android:useIntrinsicSizeAsMinimum 设置drawable原有尺寸作为最小尺寸,设为true时,缩放无效
-
android:level 要求api>=24,但是设置没有效果,待研究
子标签
如果不设置drawable属性,也可以定义drawable类型的子标签,如shape等
level-list
当需要在一个View中显示不同图片的时候,比如手机剩余电量不同时显示的图片不同,level-list就可以派上用场了。level-list可以管理一组drawable,每个drawable设置一组level范围,最终会根据level值选取对应的drawable绘制出来。
子标签
item
item属性
-
android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
-
android:minLevel 该item的最小level值
-
android:maxLevel 该item的最大level值
通过level-list我们就可以不用在使用if-else来动态改变图片或者背景了,直接改变level就可以了。
layer-list
这个也比较常用,主要是将几个drawable叠加在一起,通过简单的drawable实现复杂的图形。
属性
-
android:autoMirrored 自动镜像,上面解释过,api>=19
-
android:opacity 透明模式,根据官方注释理解设置了这个时候,子标签对应的这个属性都失效,没测试过
-
android:paddingMode 堆叠模式,api>=21。有两种模式
- nest是默认的,将每一层都嵌套到上一层中,所以上一层的padding对这一层有效果
- stack将每一层直接堆叠在上一层上,上一个的padding对本层无效果
简单解释一下,假设第一层是shape,设置了android:left=“10dp”。在nest模式下第二层是从左边10dp才开始填充,而在stack模式下第二层是从左边0dp开始填充。
-
android:paddingXXX 设置内容边距(如设置为背景时)
子标签
-item 该标签下可以定义drawable类型的子标签
transition
transition其实是继承自layer-list的transition只能管理两层drawable(多余的item无效),提供了两层drawable之间切换的方法,切换时还会有淡入淡出的动画效果。
属性
都是继承layer-list,且都无效
子标签
- item 该标签下可以定义drawable类型的子标签
注意
在代码中,transition标签生成的Drawable对应的类为TransitionDrawable,要切换时,需要主动调用TransitionDrawable的startTransition()
方法,参数为动画的毫秒数,也可以调用reverseTransition()
方法逆向切换。
((TransitionDrawable)drawable).startTransition(500);
//正向切换,即从第一个drawable切换到第二个
((TransitionDrawable)drawable).reverseTransition(500);
//逆向切换,即从第二个drawable切换回第一个
animation-list
通过animation-list可以将一系列drawable构建成帧动画,就是将一个个drawable,一帧一帧的播放。
属性
-
android:visible
-
android:oneshot 是否循环播放
-
android:variablePadding 上面提到过
子标签
- item 该标签下可以定义drawable类型的子标签。item的属性有drawable和duration
animation-rotate
这个很好理解,就是让一个drawable以某处为中心不停地做旋转动画,没旋转角度和时间,比如加载动画。
属性
-
android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签
-
android:pivotX 旋转中心的X坐标
-
android:pivotY 旋转中心的Y坐标
-
android:visible 设置初始的可见性状态,默认为false
子标签
如果不设置drawable属性,也可以定义drawable类型的子标签,如shape等
android5.0新增标签
vector
svg矢量图
属性
-
android:name 名称
-
android:width Drawable宽度
-
android:height Drawable的高度
-
android:viewportWidth 定义矢量图形的视图(viewport)空间的宽度,viewport是一个虚拟的canvas,这不是drawable的宽度,是指这个坐标系横向最大的数值,即将drawable横向分成多少份。
-
android:viewportHeight 定义矢量图形的可视区域的高度。
-
android:tint 着色
-
android:tintMode 着色模式
-
android:autoMirrored 自动镜像,上面提到过
-
android:alpha 透明度,取值0~1
子标签:
- group: 可以包含子group和path。它的属性:
- android:name
- android:rotation 旋转
- android:pivotX 旋转和缩放时的中心点的X轴坐标。取值基于viewport视图的坐标系,不能使用百分比。
- android:pivotY 旋转和缩放时的中心点的Y轴坐标。取值基于viewport视图的坐标系,不能使用百分比。
- android:scaleX 在X轴上的缩放比例,最先应用到图形上。
- android:scaleY 在Y轴上的缩放比例,最先应用到图形上。
- android:translateX 在X轴的平移距离,取值基于viewport视图的坐标系。最后应用到图形上。
- android:translateY 在Y轴的平移距离,取值基于viewport视图的坐标系。最后应用到图形上。
- path:路径,它的属性:
- android:name
- android:pathData 路径的数据。主要属性,数据格式比较复杂,不在这细说了。
- android:fillColor 填充路径的颜色,在SDK24及以上,可以指定一个颜色状态列表或者一个渐变的颜色。如果在此属性上做渐变动画,新的属性值会覆盖此值。
- android:strokeColor 指定路径线条的颜色,在SDK24及以上,可以指定一个颜色状态列表或者一个渐变的颜色。如果在此属性上做渐变动画,新的属性值会覆盖此值。
- android:strokeWidth 指定路径线条的宽度,基于viewport视图的坐标系
- android:strokeAlpha 指定路径线条的透明度
- android:fillAlpha 指定填充区域的透明度
- android:trimPathStart 取值从0到1,表示路径从哪里开始绘制。0~trimPathStart区间的路径不会被绘制出来。
- android:trimPathEnd 取值从0到1,表示路径绘制到哪里。trimPathEnd~1区间的路径不会被绘制出来。
- android:trimPathOffset 平移可绘制区域,取值从0到1,线条从trimPathOffset+trimPathStart绘制到trimPathOffset+trimPathEnd,注意:trimPathOffset+trimPathEnd如果超过1,其实也是绘制的的,绘制的是0~trimPathOffset+trimPathEnd-1的位置。
- android:strokeLineCap 设置线条首尾的外观,三个值:butt(默认,向线条的每个末端添加平直的边缘), round(向线条的每个末端添加圆形线帽), square(向线条的每个末端添加正方形线帽。)。
- android:strokeLineJoin 设置当两条线条交汇时,创建什么样的边角(线段连接类型):三个值:miter(默认,创建尖角),round(创建圆角),bevel(创建斜角) 。
- android:strokeMiterLimit 设置设置最大斜接长度,斜接长度指的是在两条线交汇处内角和外角之间的距离。只有当 lineJoin 属性为 “miter” 时,miterLimit 才有效。
- android:fillType 设置路径的填充类型
clip-path: 只有在剪切路径内的才会显示出来,它的属性: - android:name
- android:pathData 裁切路径,取值与上面讲的pathData相同。
animated-vector
svg矢量动画,需要配合动画xml(anim、animator)使用。
属性
- android:drawable svg矢量图,即VectorDrawable
子标签:
- target: 它的属性
- android:name vector中group或path的name
- android:animation group或path执行的动画,anim或animator
说明
举个列子简单来说一下,假设我们想让菜单icon(三条横线)变成后退icon(箭头)
首先我们要定义一个VectorDrawable,其中包含多条path或group,例子中是三个path,即三条横线。
然后需要定义几个anim或animator,例子中需要定义两个动画,分别是逆时针和顺时针旋转的动画
最好定义animated-vector,这样执行时可以看到上下两条横线旋转与中间横线交接,由菜单icon转成了后退icon。
这里注意,当我们使用animator直接改变pathData的时候,比如:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:propertyName="pathData"
android:valueFrom="M20,20L80,20"
android:valueTo="M50,20L80,50"
android:valueType="pathType" />
一定要将valueType显式设置为pathType,否则会crash,且没有crash日志。
另外经测试,在valueFrom和valueTo中的path格式要一一对应,否则也会crash,也没有日志,我的理解是因为无法计算出动画数据。
比如:
android:valueFrom="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z"
android:valueTo="M4,0h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L0,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z"
这样就没问题,因为path的每小段的数据都是完全对应,只是每个小部分中的数值有变化
而:
android:valueFrom="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z"
android:valueTo="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM9,17L7,17v-7h2v7zM13,17h-2L11,7h2v10zM17,17h-2v-4h2v4z"
则会crash,因为path的数据完全对应不上,无法计算出动画的中间数据
ripple
水纹效果
属性
-
android:color 必填,水纹颜色
-
android:radius 响应半径
子标签
- item: 如果不设置drawable属性,该标签下可以定义drawable类型的子标签
说明
item的drawable会一直显示作为背景,水纹则在其上面。
radius响应半径的意思是,以view的中心为圆心,以radius的值为半径的一个圆形区域,如果radius未设置则是view的所有区域。
当点击时,这个响应区域会填充颜色,同时产生水纹。但是水纹是以触碰点为圆心的,也就是说响应区域和水纹区域不重合。
但是如果触碰点在响应区域外,则水纹的圆心不会超出响应区域。
animated-selector
实现selector的动画,状态改变时会有一个动画效果。
属性
它是继承selector的,所以属性都一样
子标签
-
item: 与selector的item子标签一样。如果不设置drawable属性,该标签下可以定义drawable类型的子标签
-
transition: 它的属性:
- android:fromId 开始item的id
- android:toId 结束item的id
它的子标签: - animation-list 过渡的帧动画
说明
这里举个例子说一下:
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/state_on"
android:drawable="@drawable/btn_check_0"
android:state_checked="false" />
<item
android:id="@+id/state_off"
android:state_checked="true"
android:drawable="@drawable/btn_check_15" />
<transition
android:fromId="@id/state_on"
android:toId="@id/state_off">
<animation-list>
<item
android:drawable="@drawable/btn_check_0"
android:duration="30" />
...
</animation-list>
</transition>
</animated-selector>
可以看到在上面的例子中,实现了点击效果的动画,在非点击和点击两种状态转换时播放帧动画。这样可以实现不同状态间播放不同的动画。
adaptive-icon
自适应图标,必须在xxx-v26目录下,且其他版本目录中也要有对应资源,比如在mipmap-anydpi-v26中有一个adaptive-icon资源,在mipmap-xhdpi目录要有一个同名的png等资源。
否则在其他目录下直接使用这个标签会crash,其他版本目录中没有对应资源也会crash。
属性
- android:drawable
子标签
-
foreground 前景,如果不设置drawable属性,该标签下可以定义drawable类型的子标签
-
background 背景,如果不设置drawable属性,该标签下可以定义drawable类型的子标签
这两个标签还有一些设置位置的属性,比较简单,不一一介绍了
maskable-icon
据了解,被adaptive-icon替代了,完全一样
属性
- android:drawable
子标签
-
foreground
-
background
drawable
api>=24
只有一个属性class,值是类的全名,如android.graphics.drawable.ColorDrawable,否则会提示找不到类
这个标签没有找到文档,猜测是将一个自定义的drawable的java类转成xml资源
总结
熟练使用这些标签,不仅会提高你的开发效率,还会提高代码质量,减少APK体积等。比如通过一些标签可以有效的对资源进行复用,这样就可以减少大量重复冗余资源,减少APK提交,具体可以参考《Android中的资源复用小技巧》
最后
以上就是开放长颈鹿为你收集整理的你都知道么?Android中21种drawable标签大全前言shapeselectorrotatebitmapnine-patchcolorinsetclipscalelevel-listlayer-list属性transitionanimation-listanimation-rotate以下是android5.0新增标签vectoranimated-vectorripple的全部内容,希望文章能够帮你解决你都知道么?Android中21种drawable标签大全前言shapeselectorrotatebitmapnine-patchcolorinsetclipscalelevel-listlayer-list属性transitionanimation-listanimation-rotate以下是android5.0新增标签vectoranimated-vectorripple所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复