Android – Drawable 详解

很早看过这篇文章,并做了笔记,后来看到群里的小伙伴有问相关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的大小。

工具

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,825评论 25 707
  • 1、Drawable 简介 Drawable——可简单理解为可绘制物,表示一些可以绘制在 Canvas 上的对象。...
    牧秦丶阅读 14,745评论 0 15
  • 1.多列布局 类似报刊杂志的排版方式,一般常用于控制大篇幅文本 2.过渡 例如,一个盒子直接从200PX变成400...
    AnnQi阅读 290评论 0 0
  • 其实这篇应该早点写的,因为是感触比较早的事情,说是早,其实也没有多久吧。 你比我想象中,还要成熟。 你的心智比较成...
    四筒0831阅读 181评论 0 0
  • 最近又是重新观看了一次阿甘正传,对于这部经典的电影来说,每次看都不腻,每次看都有新的感概出现。 简单来说,阿甘正传...
    三里有屯阅读 484评论 0 2