Drawable资源

    技术2024-07-09  68

    Drawable资源

    Drawable 资源是对图像的一个抽象,你可以通过 getDrawable(int) 得到并绘制到屏幕上。这里有几种不同类型的 Drawable

     

    Bitmap File

        一个 Bitmap 图像文件( .png .jpg .gif )。 BitmapDrawable

    Nine-Patch File

        一个带有伸缩区域的 PNG 文件,可以基于 content 伸缩图片( .9.png )。 NinePatchDrawable

    State List

        一个 XML 文件,为不同的状态引用不同的 Bitmap 图像(例如,当按钮按下时使用不同的图片)。 StateListDrawable

    Color

        定义在 XML 中的资源,指定一个矩形(圆角可以有)的颜色。 PaintDrawable

    Shape

        一个 XML 文件,定义了一个几何形状,包括颜色和渐变。 ShapeDrawable

     

    AnimationDrawable 资源的说明在【 Animation 资源】文章中。

     

    Bitmap File

     

    基本的 Bitmap 图像。 Android 支持几种不同格式的 Bitmap 文件: .png (最佳)、 .jpg (可接受)、 .gif (不要)。

    注意: Bitmap 文件可能会被 aapt 工具进行无损图像压缩优化。例如,一个真彩色的 PNG (不超过 256 色)可能会被转换成一个带有颜色板的 8 PNG 。这样做能保证图片质量一样,但减少内存占用。因此,需要了解的是放在这个文件夹下的二进制图像在编译时可能会发生变更。如果你打算以位流方式读取图像来转化成 Bitmap 的话,可以把它们放到 res/raw 文件中,在这里,它们不会被优化。

     

    File Location

        res/drawable/filename.png (.png, .jpg, .gif)

        文件名会被当作资源 ID 使用。

    Complied Resource Datatype

        指向 BitmapDrawable 的资源指针。

    Resource Reference

        R.drawable.filename Java

        @[package:]drawable/filename XML

    Example

        res/drawable/myimage.png 位置保存了一张图片,在 Layout XML 中可以应用这个图片到一个 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);

     

    Nine-Patch File

     

    NinePatch 是一种 PNG 图像,可以定义拉伸区域,当 View content 超出图像边界的话, Android 会拉伸它。典型用法是把这个图像设置为 View 的背景,而这个 View 至少有一个尺寸设置为“ wrap_content ”,当这个 View 变大来容纳 content 时, Nine-Patch 图像也会拉伸来匹配 View 的大小。

     

    File Location

        res/drawable/filename.9.png

        文件名将被当作资源 ID 使用。

    Complied Resource Datatype

        指向 NinePatchDrawable 的资源指针。

    Resource Reference

        R.drawable.filename Java

        @[package:]drawable/filename XML

    Example

        res/drawable/myninepatch.9.png 位置保存了一张图片,在 Layout XML 中可以应用这个图片到一个 View 上:

        <Button

            android:layout_height="wrap_content"

            android:layout_width="wrap_content"

            android:background="@drawable/myninepatch" />

     

    State List

     

    StateListDrawable 是定义在 XML 中的 Drawable 对象,能根据状态来呈现不同的图像。例如, Button 存在多种不同的状态( pressed focused other ),使用 StateListDrawable ,你可以为 Button 的每个状态提供不同的按钮图像。

     

    你可以在 XML 文件中描述状态列表。在 <selector> 元素里的每个 <item> 代表每个图像。每个 <item> 使用不同的特性来描述使用的时机。

     

    当每次状态改变时, StateList 都会从上到下遍历一次,第一个匹配当前状态的 item 将被使用——选择的过程不是基于“最佳匹配”,只是符合 state 的最低标准的第一个 item

     

    File Location

        Res/drawable/filename.xml

        文件名将被当作资源 ID 使用。

    Complied Resource Datatype

        指向 StateListDrawable 的资源指针。

    Resource Reference

        R.drawable.filename Java

        @[package:]drawable/filename XML

    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_selected = ["true" | "false"

            android:state_active = ["true" | "false"

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

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

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

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

    </selector>

    Elements

        <selector>

        必须。必须是根元素。可以包含一个或多个 <item> 元素。

        Attributes

            xmlns:android

                      String 。必须。定义 XML 的命名空间,必须是

                      http://schemas.android.com/apk/res/android ”。

                  android:constantSize

               Boolean 。“ true ”表示随着状态变化, Drawable 的大小保持不变(所有状态中最大的 size );“ false ”表示大小会变化。默认是 false

                  android:dither

    Boolean 。“ true ”表示当 Bitmap 和屏幕的不是相同的像素设定时支持 Bitmap 抖动(例如, ARGB 8888 Bitmap RGB 565 的屏幕);“ false ”表示不支持。默认是“ true ”。

                  android:variablePadding

                         Boolean 。“ true ”表示 Drawable Padding 可以变化;“ false ”表示 Padding 保持相同(所有状态的最大 Padding )。使能这一特征需要在状态变化时处理 Layout ,一般都不支持。默认值是 false

        <item>

                  定义特定状态的 Drawable ,通过它的特性指定。必须是 <selector> 的子元素。

                  Attributes

                      android:drawable

                                Drawable 资源。必须。指向一个 Drawable 资源。

        android:state_pressed

    Boolean 。“ true ”表示按下状态使用(例如按钮按下);“ false ”表示非按下状态使用。

                      android:state_focused

    Boolean 。“ true ”表示聚焦状态使用(例如使用滚动球 /D-pad 聚焦 Button );“ false ”表示非聚焦状态使用。

                      android:state_selected

    Boolean 。“ true ”表示选中状态使用(例如 Tab 打开);“ false ”表示非选中状态使用。

                      android:state_checkable

    Boolean 。“ true ”表示可勾选状态时使用;“ false ”表示非可勾选状态使用。(只对能切换可勾选—非可勾选的构件有用。)

                      android:state_checked

                                Boolean 。“ true ”表示勾选状态使用;“ false ”表示非勾选状态使用。

                      android:state_enabled

    Boolean 。“ true ”表示可用状态使用(能接收触摸 / 点击事件);“ false ”表示不可用状态使用。

                      android:window_focused

    Boolean 。“ true ”表示应用程序窗口有焦点时使用(应用程序在前台);“ false ”表示无焦点时使用(例如 Notification 栏拉下或对话框显示)。

    注意: 记住一点, StateList 中第一个匹配当前状态的 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:drawable = "@drawable/button_normal" /> <!-- default -->  

    </selector>

        Layout XML 将这个 Drawable 应用到一个 View 上:

    <ImageView  

        android:layout_height = "wrap_content"  

        android:layout_width = "wrap_content"  

        android:src = "@drawable/button" />

     

    Color

     

    定义在 XML 中的 color ,可以当作 Drawable 使用,来填充矩形区域(圆角可以有)。这种 Drawable 的行为很像是颜色填充。

    注意: Color Drawable 是一种简单的资源,可以使用 name 特性来引用其值(不再是 XML 文件的名)。因此,你可以在一个 XML 文件中的 <resources> 元素下添加多个 Color Drawable

     

    File Location

        res/drawable/filename.xml

        文件名随意。元素的 name 将会当作资源 ID 使用。

    Complied Resource Datatype

        指向 PaintDrawable 资源的指针。

    Resource Reference

        R.drawable.color_name Java

        @[package:]drawable/color_name XML

    Syntax

    <? xml version = "1.0" encoding = "utf-8" ?>  

    < resources >  

        < drawable   name = "color_name "  

            > color </drawable>  

    </resources>

    Elements

        <resources>

               必须。必须是根节点。

               没有特性。

        <drawable>

    一个 color Drawable 。其值可以是任何有效的十六进制颜色值或者 Color 资源。 Color 值总是以“ # ”开头,后面紧跟 Alpha-Red-Green-Blue 信息,格式是: #RGB #ARGB 或者 #AARRGGBB

                  Attributes

                      name

                                String 。必须。 Color 的名字。这个名字将被当作资源 ID 使用。

    Example

        XML 文件保存在 res/drawable/color.xml

    <? xml version = "1.0" encoding = "utf-8" ?>  

    <resources>  

        <drawable name = "solid_red" > #f00 </drawable>  

        <drawable name = "solid_blue" > #0000ff </drawable>  

    </resources>

        Layout XML 将会把这个 Color Drawable 应用到一个 View 上:

    <TextView  

        android:layout_width = "fill_parent"  

        android:layout_height = "wrap_content"  

        android:background = "@drawable/solid_blue" />

        代码中获取 Color Drawable 并应用到 View 上:

    Resources res =   getResources () ;  

    Drawable redDrawable = res . getDrawable ( R . drawable . solid_red );  

     

    TextView tv = ( TextView ) findViewByID ( R . id . text );  

    tv . setBackground ( redDrawable );

     

    Shape

     

    定义在 XML 中的几何形状。

     

    File Location

        res/drawable/filename.xml

        文件名将被当作资源 ID 使用。

    Complied Resource Datatype

        指向 ShapeDrawable 的资源指针。

    Resource Reference

        R.drawable.filename Java

        @[package:]drawable/filename XML

    Syntax

    <? xml version = "1.0" encoding = "utf-8" ?>  

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

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

        < 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:usesLevel = ["true" | "false" ] />  

        < solid  

            android:color = "color " />  

        < stroke  

            android:width = "integer "  

            android:color = "color "  

            android:dashWidth = "integer "  

            android:dashGap = "integer " />  

        < padding  

            android:left = "integer "  

            android:top = "integer "  

            android:right = "integer "  

            android:bottom = "integer " />  

        < corners  

            android:radius = "integer "  

            android:topLeftRadius = "integer "  

            android:topRightRadius = "integer "  

            android:bottomLeftRadius = "integer "  

            android:bottomRightRadius = "integer " />  

    </shape>

    Elements

        <shape>

                  必须。必须是根元素。

        Attributes

                  android:shape

                      Keyword 。定义 Shape 的类型。有效的值包括:

    Value

    Desciption

    "rectangle"

    矩形。默认形状。

    "oval"

    椭圆。

    "line"

    水平直线。需要 <stroke> 元素定义线的宽度。

    "ring"

    环形。

     

    接下来的特性只能在 android:shape=”ring” 时使用:

                  android:innerRadius

                      Dimension 。内环的半径。

                  android:innerRadiusRatio

             Float 。以环的宽度比率来表示内环的半径。例如,如果 android:innerRadiusRatio=”5” ,内环半径等于环的宽度除以 5 。这个值可以被 android:innerRadius 覆盖。默认值是 9

                  android:thickness

                      Dimension 。环的厚度。

                  android:thicknessRatio

               Float 。以环的宽度比率来表示环的厚度。例如,如果 android:thicknessRatio=”2” ,厚度就等于环的宽度除以 2 。这个值可以被 android:thickness 覆盖。默认值是 3

                  android:useLevel

                      Boolean 。“ true ”表示可以当作 LevelListDrawable 使用。一般都为“ false ”。

       

    <gradient>

                  Shape 指定渐变色。

    Attributes

                  android:angle

    Integer 。渐变色的角度值。 0 表示从左到右, 90 表示从下到上。必须是 45 的倍数,默认是 0

                  android:centerX

                      Float 。渐变色中心的 X 相对位置( 0-1.0 )。当 android:type=”linear” 时无效。

                  android:centerY

                      Float 。渐变色中心的 Y 相对位置( 0-1.0 )。当 android:type=”linear” 时无效。

                  android:centerColor

                      Color 。可选的颜色,出现在 start end 颜色之间。

                  android:endColor

                      Color end 颜色。

                  android:gradientRadius

                      Float 。渐变色的半径。当 android:type=”radial” 时有效。

                  android:startColor

                      Color start 颜色。

    android:type

                      Keyword 。渐变色的样式。有效值为:

    Value

    Description

    "linear"

    线性渐变,默认值。

    "radial"

    环形渐变。 start 颜色是处于中间的颜色。

    "sweep"

    sweep 渐变

                  android:useLevel

                      Boolean 。“ true ”表示可以当作 LevelListDrawable 使用。

       

    <solid>

                  填充 shape 的单一色。

    Attributes

        android:color

                      Color 。这个颜色会应用到 shape 上。

       

    <stroke>

                  shape 的线形。

        Attributes

                  android:width

                      Dimension 。线的厚度。

                  android:color

                      Color 。线的颜色。

                  android:dashGap

                      Dimension 。间断线间的距离。仅在 android:dashWidth 设定时有效。

                  android:dashWidth

                      Dimension 。间断线的大小。仅在 android:dashGap 设定时有效。

     

        <padding>

                  内部 View 元素的边距。

        Attributes

                  android:left

                      Dimension 。左内边距。

                  android:top

                      Dimension 。上内边距。

                  android:right

                      Dimension 。右内边距。

                  android:bottom

                      Dimension 。下内边距。

     

        <corners>

                  shape 创建圆角。当 shape 是一个矩形时有效。

        Attributes

                  android:radius

                      Dimension 。圆角的半径。会被下面的特性覆盖。

                  android:topLeftRadius

                      Dimension 。左上圆角半径。

                  android:topRightRadius

                      Dimension 。右上圆角半径。

                  android:bottomLeftRadius

                      Dimension 。左下圆角半径。

                  android:bottomRightRadius

                      Dimension 。右下圆角半径。

     

    Examples

        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>

        Layout XML 将被当作 ShapeDrawable 应用到一个 View 上:

    <TextView  

        android:background = "@drawable/gradient_box"  

        android:layout_height = "wrap_content"  

        android:layout_width = "wrap_content" />

        代码中也可以获得 ShapeDrawable ,然后应用到 View 上:

    Resources res = getResources () ;  

    Drawable shape = res . getDrawable ( R . drawable . gradient_box );  

     

    TextView tv = ( TextView ) findViewByID ( R . id . textview );  

    tv . setBackground ( shape );

     

    最新回复(0)