很早看过这篇文章,并做了笔记,后来看到群里的小伙伴有问相关Drawable的问题,就把这篇翻译过来的文章给放出来了。大家一起学习,一起进步。想看原文的小伙伴可以点击下面的链接。
原文地址
前言
Drawable是可以绘制到屏幕上的图形。 Drawable用于定义形状,颜色,边界,渐变等,然后将其应用于Activity中的View。
这通常用于自定义显示在特定View。 Drawable倾向于在XML中定义,然后可以通过XML或Java代码应用于View。
有关Android的每个版本的默认Drawable列表,请参考androiddrawables网站。
用法
在不同情况下有很多可绘制的类型,设置按钮的状态行为,创建可伸缩的按钮背景和创建复合可绘制图层。
至少有17种可绘制类型,但有五个最重要的:
① Shape Drawables - 定义具有例如:stroke(描边),fill(填充)和padding(内边距)等属性的形状
② StateList Drawables - 定义用于不同状态的Drawable
③ LayerList Drawables - 定义分组在一起成为复合结果的Drawable
④ NinePatch Drawables - 具有可伸缩区域的PNG图片,以允许适当调整大小
⑤ Vector Drawables - 定义复杂的基于XML的矢量图像
下面让我们一一介绍它们的使用方法
Shape
Shape Drawable是一个XML文件,它定义了几何形状,包括颜色和渐变。这用于创建一个复杂的形状,然后可以作为布局或视图的背景附加在屏幕上。例如,可以使用可绘制的形状来更改按钮背景的形状,边框和渐变。
一个形状只是一个属性的集合,被合并来描述一个背景。形状可以用属性来描述,如圆角,背景渐变,间距填充,背景颜色固定,描边等。
纯色 Shapes
下面是一个绘制带有边框的圆角矩形的示例:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="4dp" />
<stroke android:width="4dp" android:color="#C1E1A6" />
<solid android:color="#118C4E"/>
<padding android:left="20dp" android:top="20dp"
android:right="20dp" android:bottom="20dp" />
</shape>
然后在TextView的background属性里应用:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/solid_color_shape"
android:textColor="#ffffff"
android:text="@string/hello_world" />
结果看起来像下面这样:
注意,drawables可以应用于任何View及ViewGroup,通常是通过background属性来设置Drawable资源的。
渐变色的 Shapes
形状也支持 gradients backgrounds(渐变背景)支持的属性,如startColor,centerColor,endColor,角度。可以使用类型属性选择不同的渐变,如径向,线性或扫描。
下面是一个简单的线性渐变形状的例子:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="4dp" />
<stroke android:width="1dp" android:color="#0078a5" />
<gradient
android:startColor="#0078a5" android:endColor="#00adee"
android:angle="90"/>
<padding android:left="8dp" android:top="2dp"
android:right="8dp" android:bottom="2dp" />
</shape>
结果看起来像下面这样:
你还可以使用以下设置径向类型渐变:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="4dp" />
<stroke android:width="4dp" android:color="#CCFFFF" />
<gradient
android:startColor="#0078a5"
android:endColor="#CCFFFF"
android:gradientRadius="250"
android:type="radial"
/>
<padding android:left="30dp" android:top="30dp"
android:right="30dp" android:bottom="30dp" />
</shape>
应用于TextView时,看起来像下面这样:
使用纯色形状和渐变,我们可以自定义按钮,布局和其他视图的外观,而不需要使用任何图片。请注意,可以使用PathShape和ArcShape在运行时创建自定义形状。
Drawable List 状态集合
StateListDrawable是一个在XML中定义的可绘制对象,根据对象的状态,使用多个不同的图像来表示相同的图形。例如,Button控件可以以几种不同的状态之一存在(按下,有焦点或不可点击),并且使用Drawable的状态列表,可以为每个状态提供不同的背景图像。例如:android:state_pressed,android:state_focused,android:state_enabled,android:state_selected等等。下图显示了可以表示的所有主要状态:
例如,按钮背景的状态列表XML可能类似于以下文件中的内容:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:state_enabled="true"
android:drawable="@drawable/button_pressed" />
<item
android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/button_focused" />
<item
android:state_enabled="true"
android:drawable="@drawable/button_enabled" />
</selector>
现在,当视图(即按钮)被按下或聚焦时,用于视图的drawable将相应地改变。请注意,任何视图都有一个状态选择器,但最常见的用途是按钮和列表视图项目。也有颜色状态选择器,允许根据视图状态来选择颜色。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="#ffff0000"/>
<item android:state_focused="true" android:color="#ff0000ff"/>
<item android:color="#ff000000"/>
</selector>
并应用于布局文件中按钮的textColor属性等颜色值的任何字段:
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:textColor="@color/button_text" />
使用状态列表允许我们轻松定义响应按下,是否选中,是否可用或其他相关状态的动态视图。
创建 Layer List
一个LayerDrawable是一个drawable对象,管理其它的drawable数组。列表中的每个drawable都按照列表的顺序绘制 - 列表中的最后一个drawable绘制在顶部。每个drawable由单个<layer-list>元素内的<item>元素表示。
LayerList可以用来绘制多个其它的drawable(形状,图像等),并将它们放置在相互之间的关系中。默认情况下,图层被放置在另一个的顶部,最后一个图层被绘制在顶部。然后可以使用left, right, top, and bottom属性来移动图层的坐标。
图层样式的常见用例包括:
① View边框阴影
② View单边添加边框
③ View分层背景
④ View卡片背景
⑤ 绘制三角形
举一个简单的例子,下面的图层列表绘制了几个相互关联的形状:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape
android:shape="rectangle">
<size android:width="280dp" android:height="140dp"/>
<stroke android:width="1dp" android:color="#585858" />
<solid android:color="#FF9009" />
<padding android:bottom="1dp"/>
</shape>
</item>
<item android:left="10dp" android:top="20dp" android:bottom="20dp" android:right="150dp">
<shape
android:shape="oval">
<stroke android:width="1dp" android:color="#ffffff" />
<solid android:color="#118C4E" />
<padding android:bottom="1dp"/>
</shape>
</item>
<item android:left="150dp" android:top="20dp" android:bottom="20dp" android:right="10dp">
<shape
android:shape="rectangle">
<stroke android:width="1dp" android:color="#ffffff" />
<solid android:color="#C1E1A6" />
<padding android:bottom="1dp"/>
</shape>
</item>
</layer-list>
结果看起来像下面这样:
请记住,LayerList中的item也可以是图像或任何其他类型的drawable。你可以使用它来创建更复杂的drawable,并将多个drawable叠加在一起。在官方文档中查看更多示例。
可伸缩的 Nine-Patch Image
NinePatch是一个PNG图像,你可以在该图像中定义当View的内容超出正常图像边界时定义拉伸的可伸展区域。通常将此类型的图像作为View的背景,将其宽度设置为wrap_content。最常见的用法是一个Button,它必须根据里面显示的文字来拉伸。
NinePatch是具有.9.png文件扩展名的图像,表示这是一个可伸缩的PNG图像。该文件与正常的PNG文件没有什么不同,除了您将添加细黑线以指示图像的垂直和水平“可拉伸”和“填充”区域。Android不会显示这些guide lines(指导线),这些guide lines(指导线)用于确定如何呈现图像。
下面嵌入了一个9-patch image的例子(左边是9patch图形,右边是在应用程序中使用的一个例子):
NinePatch被定义并保存在drawable文件夹中,并将背景设置为与任何图像相同:
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Submit"
android:background="@drawable/button_background"/>
Android Studio可以直接编辑9-patch文件。你的PNG文件只需保存在drawable文件夹中以.9.png为扩展名,即可显示9-patch编辑器,而不是普通的图像编辑器。你可以使用鼠标来选择要拉伸的区域(使用Shift键并单击并拖动鼠标擦除区域),右侧的预览窗格将显示如何根据内部文本渲染图像。
需要为可拉伸区域定义左边和上边的线。为了避免在上面的例子中拉伸这个气泡的箭头,我们定义了这个区域之外的区域。右侧和底部的行定义了可以填充文本的位置。如果没有底线,您的文字将不会填满拉伸区域的整个宽度,并且可能无法正确居中。
有关更多信息,可以参考这个简单的操作指南。你也可以参考官方的文档。
Vector Drawables(矢量图)
这些XML是可绘制的,可以定义复杂的基于矢量的图像,可以自动缩放以支持所有的密度。这意味着使用基于矢量的图像,在位图图像的情况下,你只需要一个drawable file,而不是每个屏幕密度的drawable file。
首先,请参考设置指南以启用对pre-Lollipop devices(棒棒糖前设备)的矢量绘图支持。
创建 Vector Drawables
要创建一个矢量图像,您需要定义位于这里的pathData语法。本示例使用以下内容定义XML元素中的形状细节:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="256dp"
android:width="256dp"
android:viewportWidth="32"
android:viewportHeight="32">
<!-- draw a path -->
<path android:fillColor="#c9c10606"
android:pathData="M20.5,9.5
c-1.955,0,-3.83,1.268,-4.5,3
c-0.67,-1.732,-2.547,-3,-4.5,-3
C8.957,9.5,7,11.432,7,14
c0,3.53,3.793,6.257,9,11.5
c5.207,-5.242,9,-7.97,9,-11.5
C25,11.432,23.043,9.5,20.5,9.5z" />
</vector>
使用 Vector Drawables
然后,我们可以使用app:srcCompat属性来加载:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_heart" />
</RelativeLayout>
注意:请务必使用app:srcCompat来支持较旧的Android设备。如果你使用android:src作为vector drawable,你的应用可能会在较新的设备中正确呈现,但可能会在棒棒糖前设备中崩溃。
最终显示如下图所示:
你也可以在运行时使用代码来设置vector drawable:
ImageView iv = (ImageView) findViewById(...);
iv.setImageResource(R.drawable.ic_heart);
查找 Vector Drawables
现在可以在Android Studio中直接找到vector drawable,也可以在许多Android资源网站上找到。假设您已更新到Android Studio v2.2,您可以在File => New => Vector Asset向导中检查vector drawable:
您可以在material design icons website上找到其他图标,其中也包含社区贡献的图标。
转换为Vector Drawable
另外,有几种方法可以直接从SVG图形创建vector drawable:
① Vector Asset Studio - 是Android Studio中包含的一个实用工具(如上所示),用于将SVG asstes转换为vector drawable
② SVG2Android Online Utility - 直接在浏览器中将SVG转换为vector drawable
③ Command-line SVG Converter - 可以将SVG批量转换为vector drawable
④ Vectorizer - 将PNG图像转换为SVG以转换为vector drawable
自定义 Button
创建自定义按钮需要至少组合一个drawable的状态列表和一个drawable的形状。首先,我们来创建一个drawable的形状,res / drawable / nice_button_enabled.xml中的“默认”按钮背景:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient
android:startColor="#0078a5"
android:endColor="#00adee"
android:angle="90"/>
<padding android:left="15dp"
android:top="1dp"
android:right="15dp"
android:bottom="1dp" />
<stroke
android:width="1dp"
android:color="#0076a3" />
<corners android:radius="8dp" />
</shape>
我们还要创建一个style(视图属性集),其中包含在res / values / styles.xml中设置背景:
<style name="NiceButton" parent="@android:style/Widget.Button">
<item name="android:gravity">center_vertical|center_horizontal</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:background">@drawable/nice_button_enabled</item>
<item name="android:textSize">16sp</item>
<item name="android:textStyle">bold</item>
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
</style>
这代表默认状态下按钮的形状和背景以及其他属性。我们可以通过设置按钮的style来应用这个:
<Button
android:id="@+id/btnGo"
style="@style/NiceButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
结果会像下面这样:
现在Button很好地显示,但没有任何“按下”或“聚焦”的状态。要做到这一点,我们需要创建一个状态列表drawable来表示res / drawable / states_nice_button.xml中每个状态的drawable。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:state_enabled="true"
android:drawable="@drawable/nice_button_pressed" />
<item
android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/nice_button_focused" />
<item
android:state_enabled="true"
android:drawable="@drawable/nice_button_enabled" />
</selector>
这描述了在所有三个主要状态(默认,按下和聚焦)中Button的外观。现在我们需要创建两个Shape drawable状态。一个用于res / drawable / nice_button_pressed.xml,另一个用于res / drawable / nice_button_focused.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient
android:startColor="#00adee"
android:endColor="#0078a5"
android:angle="90"/>
<padding android:left="15dp"
android:top="1dp"
android:right="15dp"
android:bottom="1dp" />
<stroke
android:width="1dp"
android:color="#0076a3" />
<corners android:radius="8dp" />
</shape>
按压和聚焦的状态将显示相同,但这些也可能是不同的视觉状态。现在,我们需要改变style来使用res / drawable / states_nice_button.xml:
<style name="NiceButton" parent="@android:style/Widget.Button">
<item name="android:gravity">center_vertical|center_horizontal</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:background">@drawable/states_nice_button</item>
<item name="android:textSize">16sp</item>
<item name="android:textStyle">bold</item>
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
</style>
现在我们有一个Button,它有一个很好的形状drawable背景,当按下时不需要单个图像资源就可以改变视觉状态!
自定义ListView
另一个常见需求是自定义ListView中项目的外观。首先让我们创建基本的ListView并在其中填充String项目。首先,res / layout / item_simple.xml中项目的布局XML:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="5dp"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
接下来,让我们在一个activity中设置基本的ListView xml:
<ListView
android:id="@+id/lvTest"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
然后填充ListView:
ArrayList<String> items = new ArrayList<String>();
for (int i = 1; i < 8; i++) {
items.add("Item " + i);
}
ArrayAdapter<String> aItems = new ArrayAdapter<String>(this, R.layout.item_simple, items);
lvTest = (ListView) findViewById(R.id.lvTest);
lvTest.setAdapter(aItems);
结果看起来像下面这样:
现在,让我们将自己的样式添加到ListView。让我们添加一个默认的渐变和一个按下的渐变,改变项目之间的分隔线颜色,并在ListView周围添加一个边框。首先,我们在res / drawable / gradient_bg.xml中为默认状态添加形状渐变背景:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#f1f1f2"
android:centerColor="#e7e7e8"
android:endColor="#cfcfcf"
android:angle="270" />
</shape>
然后在res / drawable / gradient_pressed_bg.xml中添加按下渐变背景:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#C1E1A6"
android:endColor="#118C4E"
android:angle="270" />
</shape>
然后让我们创建一个状态列表来描述在各种列表状态中使用的drawable:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_selected="false"
android:state_pressed="false"
android:drawable="@drawable/gradient_bg" />
<item android:state_pressed="true"
android:drawable="@drawable/gradient_pressed_bg" />
<item android:state_selected="true"
android:state_pressed="false"
android:drawable="@drawable/gradient_pressed_bg" />
</selector>
接下来,我们通过设置“stroke”属性,在res / drawable / list_border.xml中使用一个Shape drawable设置ListView的边框:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<stroke android:width="1dp" android:color="#b5b5b5" />
<solid android:color="#00000000" />
</shape>
现在让我们将这些XML drawable中的每一个应用于各种元素。首先,我们将背景添加到列表项本身并调整res / layout / item_simple.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
...
android:background="@drawable/states_selector_list" />
请注意,背景属性已设置为状态列表,以便为项目应用默认背景。接下来,让我们将边框和选择器状态添加到活动布局文件中的现有ListView:
<ListView
...
android:padding="1dp"
android:divider="#b5b5b5"
android:dividerHeight="1dp"
android:background="@drawable/list_border"
android:listSelector="@drawable/states_selector_list" >
</ListView>
在这里我们定制了divider color和dividerHeight以及背景来应用border和listSelector来管理一个item被按下时的状态。有了这一切,我们的自定义ListView现在看起来像:
我们现在已经成功地定制了我们的ListView的外观,并且它使用了一系列drawable。
运行时Drawables
我们可以通过访问具有可绘制应用的视图的背景,在我们的Java代码的运行时访问drawable。例如,给res / drawables / message_bubble.xml这个层列表:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/outerRectangle">
<shape android:shape="rectangle" >
<solid android:color="#FF00FF" />
</shape>
</item>
<item android:left="10dp">
<shape android:shape="rectangle" >
<solid android:color="#ffccd2" />
</shape>
</item>
</layer-list>
然后我们可以从我们的activity中通过指定的id访问outerRectangle:
// Get drawable layer list from the background
LayerDrawable bubble = (LayerDrawable) tvFoo.getBackground();
// Access
GradientDrawable outerRect = (GradientDrawable)
bubble.findDrawableByLayerId(R.id.outerRectangle);
// Change the solid color of the drawable
outerRect.setColor(Color.parseColor("#2f8f22"));
请注意,即使形状是纯色,此形状也是作为GradientDrawable访问的。
运行时Vector Drawables
如果你在运行时使用 vector drawables或animated vector drawables,请确保使用新的AppCompatResource类而不是普通的getDrawable()调用,特别是如果您在绘图中引用自定义主题属性(即?attr / colorAccent):
// Use AppCompatResource so that it will accurately use theme attributes
Drawable drawable = AppCompatResources.getDrawable(R.drawable.ic_test_24dp);
// Use this drawable
ImageView imageView = (ImageView) findViewById(R.id.tst);
imageView.setBackground(drawable);
应用着色器
从Android 5.0及更高版本开始,现在可以将tint color应用于drawable。其优点是根据当前主题使用的图像风格。例如,在Twitter最近的Android UI更新中,大多数图像以黑色的形式存储为vector drawables:
这里是对应的vector drawable:
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#ff000000" android:pathData="M22.46,7.57L12.357,2.115c-0.223,-0.12 -0.49,-0.12 -0.713,0L1.543,7.57c-0.364,0.197 -0.5,0.652 -0.303,1.017 0.135,0.25 0.394,0.393 0.66,0.393 0.12,0 0.243,-0.03 0.356,-0.09l0.815,-0.44L4.7,19.963c0.214,1.215 1.308,2.062 2.658,2.062h9.282c1.352,0 2.445,-0.848 2.663,-2.087l1.626,-11.49 0.818,0.442c0.364,0.193 0.82,0.06 1.017,-0.304 0.196,-0.363 0.06,-0.818 -0.304,-1.016zM17.822,19.703c-0.107,0.606 -0.703,0.822 -1.18,0.822L7.36,20.525c-0.48,0 -1.075,-0.216 -1.178,-0.798L4.48,7.69 12,3.628l7.522,4.06 -1.7,12.015z" />
<path android:fillColor="#ff000000" android:pathData="M8.22,12.184c0,2.084 1.695,3.78 3.78,3.78s3.78,-1.696 3.78,-3.78 -1.695,-3.78 -3.78,-3.78 -3.78,1.696 -3.78,3.78zM14.28,12.184c0,1.258 -1.022,2.28 -2.28,2.28s-2.28,-1.022 -2.28,-2.28 1.022,-2.28 2.28,-2.28 2.28,1.022 2.28,2.28z" />
</vector>
首先,我们将颜色添加到我们的colors.xml文件中:
<color name="twitter_blue">#ff1da1f2</color>
<color name="medium_gray">#ffaab8c2</color>
将此vector drawable更改为蓝色的最简单方法是将android:tint属性应用于<vector>标记:
<vector
android:tint="@color/twitter_blue">
</vector>
我们也可以动态改变这个:
ColorStateList colors;
if (Build.VERSION.SDK_INT >= 23) {
colors = getResources().getColorStateList(R.color.twitter_blue, getTheme());
}
else {
colors = getResources().getColorStateList(R.color.twitter_blue);
}
// Use for pre-Lollipop devices
Drawable drawable = AppCompatResources.getDrawable(R.drawable.ic_test_24dp);
// Wrap the drawable so that future tinting calls work on pre-v21 devices.
Drawable icon = DrawableCompat.wrap(drawable);
DrawableCompat.setTintList(icon, colors);
}
注意,使用的着色颜色也可以使用可绘制的状态列表。例如,如果我们希望色彩根据图标是否被选中而改变颜色,我们可以创建一个res / color / tab_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/twitter_blue" android:state_selected="true"></item>
<item android:color="@color/medium_gray" />
</selector>
额外的drawable类型
① LevelList - 一个Drawable,管理一些替代Drawables,每个分配一个最大数值。
② TransitionDrawable - 可绘制的对象,可以在两个drawable资源之间交叉淡入淡出。用于两个drawable之间的动画。
③ InsetDrawable - 在XML中定义的drawable表示将另一个drawable对象按指定的距离进行插入。当View需要比View的实际边界更小的背景时,这是非常有用的。
④ ClipDrawable - 在XML中定义一个drawable,根据这个Drawable的当前级别剪切另一个drawable。最常用来实现诸如进度条之类的东西。
⑤ ScaleDrawable - XML中定义的drawable根据当前级别更改另一个drawable的大小。
工具
参考
- http://developer.android.com/guide/topics/resources/drawable-resource.html
- http://www.vogella.com/articles/AndroidDrawables/article.html
- http://developer.android.com/reference/android/graphics/drawable/Drawable.html
- http://android-dev-tips-and-tricks.blogspot.com/2012/08/xml-drawables-part-i.html
- http://androidcookbook.com/Recipe.seam;jsessionid=8BED36512503CA63614CA9237248CBE7?recipeId=3307
- http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/
- http://cyrilmottier.com/2011/08/08/listview-tips-tricks-3-create-fancy-listviews/
- http://bnotions.com/efficient-use-of-drawables-to-develop-a-dynamic-ui-on-android/
- http://androiddrawables.com/
- http://nick.perfectedz.com/android-layerlist-tip/