Android应用资源全面分析之三:Drawable资源

     Drawable是Android用来提供绘图的最重要资源,其位置在res/drawable下,除了最基本的.png、.jpg、.gif和.9.png等格式的原始图片以外,还有各种xml格式定义的绘图资源。它们有统一的引用方法:

资源名称

in XML

in Java

Drawable

@drawable/filename

getDrawable(R.drawable.filename)

getResources().getDrawable(R.drawable.filename,null)

imageView.getDrawable()

imageView.setImageResource(R.drawable.filename)

imageView.setImageDrawable(drawable)

一、Android Drawable类

      Drawable资源基本覆盖了Android的Drawable类及其大多数子类。其总体结构关系如下图所示:

注解:1)图中红色字体表示抽象类

         2)图中蓝色字体表示与动画有关的类

         3)图中括号中的数字标识该类第一次出现的Android API版本,没有数字标识的表示API版本为1或与父类相同版本

         4)没有对应的xml资源是指这些类只能在代码中使用,不能定义成xml资源。

二、Drawable的主要公共属性和方法

属性

相关方法

说明

android:alpha

setAlpha(int alpha)

[0,1].透明度,

android:automirrored

setAutoMirrored(boolean mirrored)

["true" | "false"] ,自动镜像

android:dither

setDither(boolean dither)

["true" | "false"] ,防抖动

android:level

setLevel(int level)

[0, 10000],级别

android:tint

setTint(int tintColor)

#ARGB,着色颜色

android:tintMode

setTintMode(

PorterDuff.Mode tintMode)

["src_in"| "add"| "multiply "|"screen"| "src_atop"| "src_over"]

着色方式

android:visible

setVisible(boolean visible, boolean restart)

["true" | "false"] ,["true" | "false"] ,是否可见

三、各种XML格式Drawable的定义和引用

目前可定义为xml资源使用的Drawable共计有18种,各自xml定义方法和使用要点见下表:

Drawable类型

xml定义

说明

StateListDrawable

<selector 

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:constantSize=["true" | "false"]

    android:dither=["true" | "false"]

    android:variablePadding=["true" | "false">

    <item

        android:drawable="@[package:]drawable/drawable_resource"

        android:state_pressed=["true" | "false"]

        android:state_focused=["true" | "false"]

        android:state_hovered=["true" | "false"]

        android:state_selected=["true" | "false"]

        android:state_checkable=["true" | "false"]

        android:state_checked=["true" | "false"]

        android:state_enabled=["true" | "false"]

        android:state_activated=["true" | "false"]

        android:state_window_focused=["true" | "false"] />

</selector>

不同状态引用不同位图(如按下按钮时使用另一个的图形)

如果可绘制对象的内部大小在状态变更时保持不变,则值为“true”。默认为false

如果可绘制对象的内边距根据选择的当前状态而变化,则值为“true”;默认为false

 

 

 

 

 

 

 

 

当应用窗口有焦点(应用在前台)时为true

Android 将使用状态列表中第一个与对象当前状态匹配的项目,因此默认值应始终放在最后

GradientDrawable

<shape

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:shape=["rectangle" | "oval" | "line" | "ring">

    <corners

        android:radius="integer"

        android:topLeftRadius="integer"

        android:topRightRadius="integer"

        android:bottomLeftRadius="integer"

        android:bottomRightRadius="integer/>

    <gradient

        android:angle="integer"

        android:centerX="float"

        android:centerY="float"

        android:centerColor="integer"

        android:endColor="color"

        android:gradientRadius="integer"

        android:startColor="color"

        android:type=["linear" | "radial" | "sweep"]

        android:useLevel=["true" | "false"/>

    <padding

        android:left="integer"

        android:top="integer"

        android:right="integer"

        android:bottom="integer/>

    <size

        android:width="integer"

        android:height="integer/>

    <solid

        android:color="color/>

    <stroke

        android:width="integer"

        android:color="color"

        android:dashWidth="integer"

        android:dashGap="integer/>

 

    android:innerRadius="integer"

    android:innerRadiusRatio="integer"

    android:thickness="integer"

    android:thicknessRatio="integer"

</shape>

用于定义几何形状(包括颜色和渐变)

getShape()/setShape(int shape)

 

 

圆角

getCornerRadius()/setCornerRadius(float radius)/setCornerRadii (float[] radii)

 

 

颜色渐变

渐变的角度(45的整数倍)

getGradientCenterX ()/setGradientCenter (float x, float y)

getGradientCenterY ()

起始颜色与结束颜色之间的可选颜色

 

渐变的半径

getGradientRadius ()

渐变图案的类型

getGradientType ()/setGradientType (int gradient)

getUseLevel ()/setUseLevel (boolean useLevel)

离边界的距离

 

 

 

长宽比例

setSize (int width, int height)

 

 

填充颜色

描边

setStroke ()

 

 

 

shape为ring时需设置的属性

 

BitmapDrawable

<bitmap

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:src="@[package:]drawable/drawable_resource"

    android:antialias=["true" | "false"]

    android:dither=["true" | "false"]

    android:filter=["true" | "false"]

    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |

                      "fill_vertical" | "center_horizontal" | "fill_horizontal" |

                      "center" | "fill" | "clip_vertical" | "clip_horizontal"]

    android:mipMap=["true" | "false"]

    android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"/>

XML 位图实际上是原始位图文件的别名。XML 中可以指定位图的特定属性。

 

启用或停用抗锯齿,setAntiAlias(boolean aa)

启用或停用位图抖动,setDither(boolean dither)

启用或停用位图过滤,setFilterBitmap(boolean filter)

可绘制对象在其容器中放置的位置,setGravity(int gravity)

 

 

启用或停用 mipmap 渲染,setMipMap(boolean mipMap)

启用或停用平铺模式,setTileModeXY(Shader.TileMode xmode, Shader.TileMode ymode)

NinePatch

Drawable

<nine-patch

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:src="@[package:]drawable/drawable_resource"

    android:dither=["true" | "false"/>

具有可拉伸区域的 PNG 文件,允许根据内容调整图像大小 

ColorDrawable

<color 

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:color="#rgb"|"#argb"|"#rrggbb"|"#aarrggbb"/>

可作为绘制对象的颜色,

getColor()/setColor(int color)

 

RippleDrawable

<ripple

   android:color="#rgb"|"#argb"|"#rrggbb"|"#aarrggbb"

   android:radius="@dimen/ripple_radius">
   
<item

         android:id="@android:id/mask"
         android:drawable="@[package:]drawable/drawable_resource"/>
 
</ripple>

点击后呈现水波纹效果图片

水波纹颜色

水波纹半径

水波纹大小约束

设置遮罩层(可选)

水波纹约束形状或图片

LayerDrawable

 

<layer-list

    xmlns:android="http://schemas.android.com/apk/res/android" >

    <item

        android:drawable="@[package:]drawable/drawable_resource"

        android:id="@[+][package:]id/resource_name"

        android:top="dimension"

        android:right="dimension"

        android:bottom="dimension"

        android:left="dimension/>

</layer-list>

管理一系列可绘制对象层级的可绘制对象。它们按层级顺序绘制,索引最大的元素绘制在顶部。

addLayer(Drawable dr)

setDrawableByLayerId(R.id.xxx, drawable)

setDrawable(int index, Drawable drawable)

setId(int index, int id)

 

 

LevelListDrawable

<level-list

    xmlns:android="http://schemas.android.com/apk/res/android" >

    <item

        android:drawable="@drawable/drawable_resource"

        android:maxLevel="integer"

        android:minLevel="integer/>

</level-list>

管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大和最小等级(level),levle取值[010000]

addLevel(int low, int high, Drawable drawable)

imageView.setImageLevel(int)

leveLlistDrawable.setLevel(int)

ScaleDrawable

<scale

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:drawable="@drawable/drawable_resource"

    android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |  "fill_vertical" | "center_horizontal" | "fill_horizontal" |

 "center" | "fill" | "clip_vertical" | "clip_horizontal"]

    android:scaleHeight="percentage"

    android:scaleWidth="percentage/>

更改指定可绘制对象大小的可绘制对象

 

 

 

 

图片缩放后尺寸:X轴的百分比

图片缩放后尺寸:Y轴的百分比

RotateDrawable

<rotate
   
 xmlns:android="http://schemas.android.com/apk/res/android"
    
android:drawable="@drawable/drawable_resource

    android:visible=["true" | "false"]

    android:fromDegrees="integer"
   
 android:toDegrees="integer"
   
 android:pivotX="percentage 
    
android:pivotY="percentage"/> 

旋转指定可绘制对象的可绘制对象

 

 

旋转的起始角度,0~360逆时针

旋转的终止角度,0-360顺时针

旋转的中心在图片X轴的百分比

旋转的中心在图片Y轴的百分比

ClipDrawable

<clip

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:drawable="@drawable/drawable_resource"

    android:clipOrientation=["horizontal" | "vertical"]

    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |

                     "fill_vertical" | "center_horizontal" | "fill_horizontal" |

                     "center" | "fill" | "clip_vertical" | "clip_horizontal"/>

对指定可绘制对象进行裁剪的可绘制对象,裁剪级别取值[010000]默认级别为 0,即完全裁剪,使图像不可见。当级别为 10000 时,图像不会裁剪,而是完全可见。

drawable.setLevel(int level);   ---设置裁剪级别

 

InsetDrawable

<inset

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:drawable="@drawable/drawable_resource"

    android:insetTop="dimension"

    android:insetRight="dimension"

    android:insetBottom="dimension"

    android:insetLeft="dimension/>

以指定距离插入其它可绘制对象的可绘制对象。当视图需要小于视图实际边界的背景可绘制对象时,此类可绘制对象很有用

VectorDrawable

<vector 

 xmlns:android="http://schemas.android.com/apk/res/android"

<!-- intrinsic size of the drawable -->

android:height="24dp"

android:width="24dp"

<!-- size of the virtual canvas -->

android:viewportWidth="24.0"

android:viewportHeight="24.0">

 <group

     android:name="rotationGroup"

     android:pivotX="10.0"

     android:pivotY="10.0"

     android:rotation="15.0" >

     <path

android:name="vect"

android:fillColor="#FF000000"

android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33V9h4.93L13,7v2h4V5.33C17,4.6 16.4,4 15.67,4z"

android:fillAlpha=".3"/>

      <path

android:name="draw"

android:fillColor="#FF000000" android:pathData="M13,12.5h2L11,20v-5.5H9L11.93,9H7v11.67C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V9h-4v3.5z"/>

</group>

</vector>

矢量图

 

 

 

 

 

 

group名称

 

 

path名称

填充颜色

Animation

Drawable

<animation-list      

    xmlns:android="http://schemas.android.com/apk/res/android"

   android:oneshot=["true" | "false"]>

   <item android:drawable="@drawable/drawable_resource"

               android:duration="integer/>

 </animation-list>

帧动画

addFrame(@NonNull Drawable frame, int duration)

start()

stop()

 

Transition

Drawable

 

<transition

xmlns:android="http://schemas.android.com/apk/res/android" >

    <item

        android:drawable="@[package:]drawable/drawable_resource"

        android:id="@[+][package:]id/resource_name"

        android:top="dimension"

        android:right="dimension"

        android:bottom="dimension"

        android:left="dimension/>

</transition>

可在两个可绘制对象资源之间交错淡入淡出的可绘制对象

startTransition(int durationMillis)

reverseTransition(int durationMillis)

 

AnimatedVector

Drawable

<animated-vector    

xmlns:android="http://schemas.android.com/apk/res/android"

android:drawable="@drawable/vectordrawable" 

<target

android:name="rotationGroup"

android:animation="@anim/rotation" />

<target

android:name="v"

android:animation="@anim/path_morph" />

</animated-vector>

矢量动画

start()

stop()

vector中的group名称

动画效果

vector中的path名称

动画效果

AnimatedState

ListDrawable

<animated-selector 

xmlns:android="http://schemas.android.com/apk/res/android">

<item

android:id="@+id/off"

android:drawable="@drawable/first"android:state_pressed="false"/>

<item

android:id="@+id/on"

android:state_pressed="true"android:drawable="@drawable/fifth"/>

<transition

android:fromId="@id/off"

android:toId="@id/on">

<animation-list>

    <item android:drawable="drawable/first" 

        android:duration="100"/>

    <item android:drawable="@drawable/second"

        android:duration="100"/>

    <item android:drawable="@drawable/third" 

                  android:duration="100"/>

    <item android:drawable="@drawable/fourth"

                  android:duration="100"/>

  <item android:drawable="@drawable/fifth"

                  android:duration="100"/>

         </animation-list>

</transition>

 </animated-selector>

不同状态引用不同位图,二者之间过渡使用其中的帧动画

 

AnimatedRotate

Drawable

<animated-rotate

xmlns:android="http://schemas.android.com/apk/res/android" 

android:drawable="@[package:]drawable/drawable_resource"

android:pivotX="percentage

android:pivotY="percentage 

</animated-rotate>

没有对应的java代码支持

图片源

 

旋转中心X坐标

旋转中心Y坐标

AdaptiveIcon

Drawable

<adaptive-icon    

       xmlns:android="http://schemas.android.com/apk/res/android" >

       <background android:drawable="@drawable/ic_background"/>

       <foreground android:drawable="@mipmap/ic_foreground"/>

</adaptive-icon>

自适应图标


背景图108x108dp

前景图72x72dp

四、示例

<selector>......</selector><shape>......</shape>

<bitmap>......</bitmap>

<niane-patch>......</nine-patch>

<color>......</color>

<ripple>......</ripple>

<scale>......</scale>

<rotate>......</rotate>

<clip>......</clip>

<inset>......</inset>

<layer-list>......</layer-list>

<level-list>......</level-list>

<vector>......</vector>

<animation-list>......</animation-list>

<transition>......</transition>

<animated-vector>.....</animated-vector> 

<animated-selector> ......</animated-vector>

<animated-rotate>......</animated-vector>

Drawable演示清单
五、Demo源码

      Resource Demo是将所有Android资源集合在一起,对其定义、引用和应用进行充分完全的演示,包括上述演示的全部内容。此Demo提供了详细的注释和说明,不仅可供学习时使用,也可作为模版在开发中直接使用(拷贝需要的代码段即可),以加快开发进度。该Demo在Android Studio 3.0 和Android SDK5.0以上版本可直接运行,欢迎索取使用。有需要者请发邮件到:xottys@163.com 即可。


建议直接下载安装APK: Android ResourceDemo ,演示效果会更好。该APK可在Android5.0以上版本正常运行。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值