Drawable Resources

来源:互联网 发布:韩子高网络剧免费下 编辑:程序博客网 时间:2024/04/29 05:52

drawable资源是一个图形的通用概念,它表示这个图形可以绘制到屏幕上,可以使用API接口获取,例如getDrawable(int);或应用到另外的XML资源属性中,例如android:drawable和android:icon。有以下几种drawable资源。

Bitmap File——一个位图图形文件(.png,.jpg,.gif)[此处指出了位图就是我们真是可见的图片]。创建一个BitmapDrawable。

Nine-Patch File——一个可扩展的PNG图片(.9.png)。创建一个NinePatchDrawable。

Layer List——操作一组drawables的一个drawable。元素按照索引有序层叠,创建一个LayerDrawable。

StateList——不同的状态指向不同的位图的XML文件。(例如,当按钮按下时使用不同的图片),创建一个StateListDrawable。

LevelList——一个XML文件,它定义了一个操作可选择的一组Drawables的drawable。组中的单个drawable都分配了一个数字,创建一个LevelListDrawable。

Transition Drawable——一个XML文件,定义了在两个drawable资源间逐渐穿过的drawable,创建一个TransitionDrawable。

Inset Drawable——一个XML文件,定义了一个drawable在一个指定的距离插入到另一个drawable中,当一个View需要的背景drawable小于View的真是边界是这个很有用。

Clip Drawable——一个XML文件,定义了一个drawable根据当前的level值,剪切另一个drawable。创建一个ClipDrawable。

Scale Drawable——一个XML文件,定义了一个改变另外的drawable尺寸的drawable,创建一个ScaleDrawable。

ShapeDrawable——一个XML文件,定义了一个包含颜色,倾斜度的几何图形,创建一个ShapeDrawable。

AnimationDrawable——查看Animation Resource文献。

Note:颜色资源也可以作为一个drawable。例如,当创建一个state list drawable时,可以这样指定一个颜色资源属性——android:drawable="@color/green"。

Bitmap

位图,安卓系统支持三中形式的位图:.png(推荐使用),.jpg(可用),.gif(不推荐使用)。(因为计算机只能读取二进制,图片也会转化为二进制,因此称作位图。)

把文件名作为资源ID使用可以直接指向位图,也可以在XML文件中创建一个资源ID别名。

Note:在工程build过程中,系统aapt工具会压缩优化位图。例如,一个不需要256色的真彩PNG图片可能会转化为一个8bitPNG图片。这样的结果是不失真却减小了占用内存。对于位图二进制会变化这一点我们一定要知道。如果我们计划读取一张图片的bit流转化为一个位图,则应该把图片防止在res/raw/文件夹里,这样不会被优化。

Bitmap File

一个bitmap文件是一个.png,.jpg或.gif文件。安卓系统把放置在res/drawable/文件夹里的任何文件都当作Drawable资源。

FILELOCATION:

  res/drawable/filename.png(.png,.jpg,.gif)文件名作为资源ID。

COMPILED RESOURCE DATATYPE:

  资源指向一个BitmapDrawable

RESOURCE REFERENCE:

  Java:R.drawable.filename

  XML:drawable/filename

EXAMPLE:

  图片保存为res/drawable/myimage.png,应用到一个View控件:

<ImageView        android:layout_height="wrap_content"        android:layout_width="wrap_content"        android:src="@drawable/myimage"/>

下段代码把图片作为Drawable资源取出:
Resources res = getResources();Drawable drawable = res.getDrawable(R.drawable.myimage);

XMl Bitmap

XML bitmap指定义在XML中指向bitmap文件的资源。影响是一个raw bitmap文件的别名。XML可以为位图指定额外的属性比如dithering和tiling。

Note:<bitmap>标签元素可以作为<item>元素的子元素。例如,当创建一个state list或者一个layer list时,可以在<item>元素中去除android:drawable属性,而使用嵌套的<bitmap>定义drawable项目。

FILELOCATION:

res/drawable/filename.xml文件名作为资源ID。

COMPILED RESOURCE DATATYPE:

资源指向一个BitmapDrawable。

RESOURCE REFERENCE:

  Java:R.drawable.filename

  XML:@[package:]drawable/filename

SYNTAX:

<?xml version="1.0" encoding="utf-8"?><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:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />

ELEMENTS:

<bitmap>——定义bitmap资源和其特性

xmlns:android——XML命名空间,必须是“http://schemas.android.com/apk/res/android”,<bitmap>是根元素时才要求这个属性,嵌套在<item>中时不需要。

android:src——必要的指向一个drawable资源

android:antialias——布尔类型,是否支持锯齿。

android:dither——布尔类型,bitmap与屏幕像素配置不一致是是否支持抖动(例如:ARGB8888bitmap和RGB565屏幕)

android:filter——布尔类型,当bitmap收缩或伸展以平滑它的外观时会用到这个属性

android:gravity——关键字。

android:tileMode——关键字,定义平铺模式,enabled时,bitmap可重复,忽略gravity。

可选常量值如下:

disabled——bitmap不平铺,缺省值

clamp——阴影部分超出边界时复制边缘颜色

repeat——重复使用阴影图片。

mirror——重复使用阴影图片,镜像图片。

EXAMPLE:

<?xml version="1.0" encoding="utf-8"?><bitmap xmlns:android="http://schemas.android.com/apk/res/android"    android:src="@drawable/icon"    android:tileMode="repeat" />

Nine-Patch

同bitmap一样,可以指定一个Nine-Patch文件或包含了该资源的XML文件。

Nine-Patch File

FILELOCATION:

res/drawable/filename.9.png文件名作为资源ID

COMPILED RESOURCE DATATYPE:

资源指向NinePatchDrawable

RESOURCE REFERENCE:

Java:R.drawable.filename

XML:@[package:]drawable/filename

EXAMPLE:

<Button         android:layout_height="wrap_content"         android:layout_width="wrap_content"         android:background="@drawable/myninepatch"/>

XML Nine-Patch

FILELOCATION:

res/drawable/filename.xml文件名用作资源ID

COMPILED RESOURCE DATATYPE:

资源指向NinePatchDrawable

RESOURCE REFERENCE:

Java:R.drawable.filename

XML:@[package:]drawable/filename

SYNTAX:

<?xml version="1.0" encoding="utf-8"?><nine-patch    xmlns:android="http://schemas.android.com/apk/res/android"    android:src="@[package:]drawable/drawable_resource"    android:dither=["true" | "false"] />

ELEMENTS:

<nine-patch>

属性:xmlns:android;android:src;android:dither

EXAMPLE:

<?xml version="1.0" encoding="utf-8"?><nine-patch xmlns:android="http://schemas.android.com/apk/res/android"    android:src="@drawable/myninepatch"    android:dither="false" />

Layer List

一个LayerDrawable对象操作一组drawables对象。list中的drawable都是有序的。

每一个drawable对象在<layer-list>元素中为一个<item>元素

FILELOCATION:

          res/drawable/filename.xml文件名为资源ID

COMPILED RESOURCE DATATYPE:

           资源指向一个LayerDrawable

RESOURCE REFERENCE:

           Java:R.drawable.filename

            XML:@[package:]drawable/filename

SYNTAX:

              

<?xml version="1.0" encoding="utf-8"?><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>

ELEMENTS:

<layer-list>

      xmlns:android

<item>:

           android:drawable

           android:id

           android:top——整型,顶部偏移距离

           android:right;android:bottom;android:left

缺省情况下,所有的drawable items都会按比例伸缩来匹配承载它们的View的尺寸。这样,layer list的images放置在不同位置可能会增加View的尺寸,同时还可能引起image的伸缩。为了避免这一状况,在<item>中使用<bitmap>元素指定drawable资源同时还要定义合适的gravity以避免伸缩。例如"center"。下例的<item>会伸缩以匹配View容器:

<item android:drawable="@drawable/image"/>

避免这种状况的定义如下:
<item>     <bitmap android:src="@drawable/image"             android:gravity="center"/></item>

EXAMPLE:

XML文件保存为res/drawable/layers.xml:

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <item>      <bitmap android:src="@drawable/android_red"        android:gravity="center" />    </item>    <item android:top="10dp" android:left="10dp">      <bitmap android:src="@drawable/android_green"        android:gravity="center" />    </item>    <item android:top="20dp" android:left="20dp">      <bitmap android:src="@drawable/android_blue"        android:gravity="center" />    </item></layer-list>

这个layout XML应用了上面的这个drawable如下:
<ImageView    android:layout_height="wrap_content"    android:layout_width="wrap_content"    android:src="@drawable/layers" />

效果图如下:


State List

StateListDrawable定义在一个XML文件中,它使用了一些不同的图片根据对象状态代表一种图形。例如,Button控件有几种存在状态(pressed, focused,neither),使用state list drawable,就可以为每种状态指定不同的图片。

state list定义在XML文件中,每个图形代表了<selector>元素中的一个<item>。每个<item>有多个属性描述作为图形使用时的状态。

每次状态变化,state list都会从上到下逐一查找合适的<item>,第一个匹配的<item>会被选择,而不是最佳匹配的<item>。

FILELOCATION:

        res/drawable/filename.xml文件名作为资源ID

COMPILED RESOURCE DATATYPE:

        资源指向一个StateListDrawable

RESOURCE REFERENCE:

        Java:R.drawable.filename

        XML:@[package:]drawable/filename

SYNTAX:

<?xml version="1.0" encoding="utf-8"?><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>

ELEMENTS:

<selector>

attributes:

    xmlns:android

   android:constantSize——布尔值,当state变化而drawable的内部尺寸保持不变时为“true”(尺寸为所有states的最大值),尺寸随状态变化而 变化时为"false",缺省值为false。

   android:dither

   android:variablePadding——布尔值,drawable的padding随状态变化而变化时为"true",保持不变为"false",缺省值为false。

<item>

attributes:

android:drawable

android:state_pressed——布尔值,该对象状态为pressed时为true,缺省值为false。

android:state_focused——布尔值,对象获取输入焦点(例如用户选择一个文本输入时)时为true,缺省状态为false

android:state_hovered——布尔值,光标悬停时为true。缺省值为false。

android:state_selected——布尔值

android:state_checkable——布尔值,对象checkable时为true(只在对象在一个checkable和non-checkable widget之间切换时有效)

android:state_checked——布尔值

android:state_enabled——对象enabled(能够接收touch/click事件)时为true。

android:state_activated——对象激活时(例如导航视图里选中的item为高亮)为true。

android:state_window_focused——应用窗口获取了焦点时为true(应用到前台)

Note:谨记匹配的是第一个合适的item,而不是最佳item,这也意味着缺省item应该放置在最底部。如下例:

EXAMPLE:

XML文件存储为res/drawable/button.xml:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_pressed="true"          android:drawable="@drawable/button_pressed" /> <!-- pressed -->    <item android:state_focused="true"          android:drawable="@drawable/button_focused" /> <!-- focused -->    <item android:state_hovered="true"          android:drawable="@drawable/button_focused" /> <!-- hovered -->    <item android:drawable="@drawable/button_normal" /> <!-- default --></selector>

应用到一个按钮如下:
<Button    android:layout_height="wrap_content"    android:layout_width="wrap_content"    android:background="@drawable/button" />

Level List

一个组drawable,它管理一组交替使用的drawables。每个drawable分配一个最大数值。setLevel()方法设置drawable的level值,装载drawable资源到level list中,level list有一个android:maxLevel值大于等于传递到setLevel()方法的值。

FILELOCATION:

    res/drawable/filename.xml文件名作为资源ID

COMPILED RESOURCE DATATYPE:

    资源指向一个LevelListDrawable

RESOURCE REFERENCE:

     Java:R.drawable.filename

     XML:@[package:]drawable/filename

SYNTAX:

<?xml version="1.0" encoding="utf-8"?><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>

ELEMENTS:

<level-list>

xmlns:android

<item>

     android:drawable

     android:maxLevel——该项最大允许值

     android:minLevel——该项最小允许值

EXAMPLE:

<?xml version="1.0" encoding="utf-8"?><level-list xmlns:android="http://schemas.android.com/apk/res/android" >    <item        android:drawable="@drawable/status_off"        android:maxLevel="0" />    <item        android:drawable="@drawable/status_on"        android:maxLevel="1" /></level-list>
应用到一个View中时,使用setLevel()或者setImageLevel()可以改变level值。

Transition Drawable

TanditionDrawable是可以在两个drawable资源间切换的drawable。

每个drawable是<transition>元素下的一个<item>标签。推荐只使用两个标签。向前切换,调用startTransition(),向后切换,调用reverseTransition()。

FILELOCATION:

     res/drawable/filename.xml文件名作为资源ID

COMPILED RESOURCE DATATYPE

     资源指向TransitionDrawable

RESOURCE REFERENCE:

      Java:R.drawable.filename

       XML:@[package:]drawable/filename

SYNTAX:

<?xml version="1.0" encoding="utf-8"?><transitionxmlns: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>

ELEMENTS:

<transition>

xmlns:android

<item>可接收<bitmap>元素

       android:drawable

       android:id

        android:top,android:right,android:bottom,android:left

EXAMPLE:

XML文件存储为res/drawable/transition.xml

<?xml version="1.0" encoding="utf-8"?><transition xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@drawable/on" />    <item android:drawable="@drawable/off" /></transition>

应用如下:

<ImageButton    android:id="@+id/button"    android:layout_height="wrap_content"    android:layout_width="wrap_content"    android:src="@drawable/transition" />

下面的代码段演示了从第一个item到第二个item的500ms切换。

ImageButton button = (ImageButton) findViewById(R.id.button);TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();drawable.startTransition(500);

Inset Drawable

把一个drawable在一个指定距离上插入到另外一个drawable。当一个视图view需要的背景图片小于该视图的边界时很有用。

FILE LOCATION:

        res/drawable/filename.xml文件名作为资源ID

COMPILED RESOURCE DATATYPE:

        指向一个InsetDrawable

RESOURCE REFERENCE:

       Java:R.drawable.filename

       XML:@[package:]drawable/filename

SYNTAX:

<?xml version="1.0" encoding="utf-8"?><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" />

ELEMENTS:

<inset>

xmlns:android

android:drawable

android:insetTop,android:insetRight,android:insetBottom,android:insetLeft必须是一个dimension值或dimsension reource。

EXAMPLE:

<?xml version="1.0" encoding="utf-8"?><inset xmlns:android="http://schemas.android.com/apk/res/android"    android:drawable="@drawable/background"    android:insetTop="10dp"    android:insetLeft="10dp" />

Clip Drawable

根据drawable的当前level值由一个drawable剪切另外一个drawable。根据level值可以控制child drawable被剪切了多少。同时还需要一个gravity值控制它们放置在容器中的位置。通常应用在progress bar。

FILELOCATION:

       res/drawable/filename.xml文件名应用为资源ID

COMPILED RESOURCE DATATYPE:

       资源指向一个ClipDrawable

RESOURCE REFERENCE

        Java:R.drawable.filename

         XML:@[package:]drawable/filename

SYNTAX:

<?xml version="1.0" encoding="utf-8"?><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"] />

ELEMENTS:

<clip>

xmlns:android

android:drawable——指向被剪切的drawable资源

android:clipOrientation——剪切的方向的关键字

            horizontal,vertical

android:gravity——指定drawable中剪切的位置,可以是以下的一个或多个常量(由“|”隔开)。

          top——对象放置在容器顶部,不改变尺寸,当clipOrientation是"vertical"时,在drawable底部开始剪切。

          bottom——对象放置在容器底部,不改变尺寸,当clipOrientation是"vertical"时,在drawable顶部剪切。

          left——对象放置在容器左边缘,不改变尺寸,当clipOrientation是"horizontal"时,在drawable右边剪切。这是缺省状态。

          right——对象放置在容器右边缘,不改变尺寸,当clipOrientation是"horizontal"时,在drawable左边剪切。

          center_vertical,fill_vertical,center_horizontal,fill_horizontal,center,fill,clip_vertical,clip_horizontal。

EXAMPLE:

XML文件保存为res/drawable/clip.xml

<?xml version="1.0" encoding="utf-8"?><clip xmlns:android="http://schemas.android.com/apk/res/android"    android:drawable="@drawable/android"    android:clipOrientation="horizontal"    android:gravity="left" />

应用到view如下:

<ImageView    android:id="@+id/image"    android:background="@drawable/clip"    android:layout_height="wrap_content"    android:layout_width="wrap_content" />

下段代码演示了如何通过增加level值,逐渐显示一副遮住的图片。

ImageView imageview = (ImageView) findViewById(R.id.image);ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();drawable.setLevel(drawable.getLevel() + 1000);

增加level值减少剪切量而逐渐显示图片。下图为level值7000。

Note:缺省level值为0,此时图片被完全剪切掉所以是看不见的,当level值为10000时,图片完全可见。

Scale Drawable

根据当前level值改变一个drawable的尺寸。

FILELOCATION:

     res/drawable/filename.xml

COMPILED RESOURCE DATATYPE:

      资源指向一个ScaleDrawable

RESOURCE REFERENCE:

      Java:R.drawable.filename

       XML:@[package:]drawable/filename

SYNTAX:

<?xml version="1.0" encoding="utf-8"?><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" />

ELEMENTS:

<scale>

xmlns:android

android:drawable

android:scaleGravity——改变尺寸之后对象放置在容器中的位置,由下述一个或多个(由“|”隔开)常量决定。

top,bottom,left,right,center_vertical,fill_vertical,center_horizontal,fill_horizontal,center,fill,clip_vertical,clip_horizontal

android:scaleHeight——缩放高,相对于drawable边界的百分比,格式为XX%,例如100%, 12.5%。

android:scaleWidth。

EXAMPLE:

<?xml version="1.0" encoding="utf-8"?><scale xmlns:android="http://schemas.android.com/apk/res/android"    android:drawable="@drawable/logo"    android:scaleGravity="center_vertical|center_horizontal"    android:scaleHeight="80%"    android:scaleWidth="80%" />

Shape Drawable

由XML文件定义一个基本图形。

FILELOCATION:

     res/drawable/filename.xml文件名用作资源ID。

COMPILED RESOURCE DATATYPE:

     资源指向一个GradientDrawable。

RESOURCE REFERENCE:

      Java:R.drawable.filename

      XML:@[package:]drawable/filename

SYNTAX:

<?xml version="1.0" encoding="utf-8"?><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="integer"        android:centerY="integer"        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" /></shape>

ELEMENTS:

<shape>

xmlns:android

android:shape——定义了基本图形。

       rectangle——缺省值

        oval,line,ring。

当android:shape="ring"时有以下属性。

android:innerRadius——半径

android:innerRadiusRation,thickness,thicknessRatio,useLevel。

<corners>shape的园角。只应用于rectangle

       android:radius,topLeftRadius,topRightRadius,bottomLeftRadius,bottomRightRadius

Note:corner初始化值必须为半径赋值大于1,否则就没有圆角。如果想指定不是圆角,使用android:radius设置缺省半径大于1,然后复写需要的corner的value值,不想要圆角时,设置值为”0dp"

<gradient>——倾斜度

android:angle,centerX,centerY,centerColor,gradientRadius,startColor,type,useLevel。

<padding>

<size>

Note:缺省情况下shape会根据<size>定义的dimension 来scale尺寸以匹配容器view。当应用shape到ImageView时,可以设置android:scaleType为"center"来限制scale。

<solid>——填充到图形的实心色

<stroke>——stroke线

         android:width,color,dashGap,dashWidth

EXAMPLE:

XML文件存储为res/drawable/gradient_box.xml

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle">    <gradient        android:startColor="#FFFF0000"        android:endColor="#80FF00FF"        android:angle="45"/>    <padding android:left="7dp"        android:top="7dp"        android:right="7dp"        android:bottom="7dp" />    <corners android:radius="8dp" /></shape>
应用到View实例如下:

<TextView    android:background="@drawable/gradient_box"    android:layout_height="wrap_content"    android:layout_width="wrap_content" />

下段代码演示了应用它到一个View中。

Resources res = getResources();Drawable shape = res. getDrawable(R.drawable.gradient_box);TextView tv = (TextView)findViewByID(R.id.textview);tv.setBackground(shape);

0 0
原创粉丝点击