文章中的内容参考Dev Guide中的Drawable Resources,英文好的朋友可以直接去读英文。总结这篇文章的目的是自己在使用drawable资源遇到一些问题跟大家分享下,同时整理下自己对drawable的理解。
drawable资源共有10种,包括Bitmap文件、Nine-Path文件、Layer List、State List、Level list、Transition Drawable、Inset Drawable、Clip Drawable、Scale Drawable、Shape Drawable。下面分别介绍下各种文件的用法和其中主要属性的作用:
一、Bitmap文件:就是普通的jpg、png和gif图片文件;
二、Nine-Path文件:以.9.png结尾的图片文件,其中图片中有够伸缩的区域,可以根据内容改变图片大小。在android sdk的tools目录下有一个draw9patch.bat可以制作9.png图片;
三、Layer List: 可以用于把多张图片组合成一张图片,例如:
<?xml version="1.0" encoding="utf-8"?>四、State List:作用是在相同的图形中展示不同的图片,比如ListView中的子项背景,可以设置点击时是一种背景,没有焦点时是另一种背景。例如:
<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>
<?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_window_focused=["true" | "false"] />
</selector>
<?xml version="1.0" encoding="utf-8"?>五、Level list:可以通过程序imageView.getDrawable().setImageLevel(value)来设置需要在ImageView中显示的图片(在xml中声明的图片)。例子:
<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>
<?xml version="1.0" encoding="utf-8"?>可以在程序中设置imageView.getDrawable().setImageLevel(0)或imageView.getDrawable().setImageLevel(1)来切换图片。
<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>
六、Transition Drawable:可以通过调用startTransition()和reverseTransition()实现两张图片的切换。例子:
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>
在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>
在XML中的引用:
<ImageButton在程序中的使用
android:id="@+id/button"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/transition" />
ImageButton button = (ImageButton) findViewById(R.id.button);
TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();
drawable.startTransition(500);
七、Inset Drawable:用于通过指定的间距把图片插入到XML中,它在View需要比自身小的背景时常用。有些像padding的作用。例子:
第一步:drawable文件中建立inset_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<inset
<inset
xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/photo2"android:insetTop="100dp"android:insetRight="100dp"android:insetBottom="200dp"android:insetLeft="100dp" />
android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/inset_drawable">
八、Clip Drawable:可以剪载图片显示,例如,可以通过它来做进度度。你可以选择是从水平或垂直方向剪载。其中的gravity设置从整个部件的哪里开始。例子:
第一步,在drawable文件中建立:clip_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/test_img"
android:clipOrientation="horizontal"
android:gravity="left" />
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/test_img"
android:clipOrientation="horizontal"
android:gravity="left" />
第二步,在ImageView中引用:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/clipimage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/clip_drawable"/>
</LinearLayout>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/clipimage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/clip_drawable"/>
</LinearLayout>
Dev Guide中在ImageView中设置的是android:background="@drawable/clip_drawable",但是我使用background的时,会在程序中报空指针的错误。
最后,使用程序控制:
ImageView imageView=(ImageView)findViewById(R.id.clipimage);
ClipDrawable clipDrawable=(ClipDrawable)imageView.getDrawable();
clipDrawable.setLevel(5000);
level的值为0到10000 。当值为10000时图全部显示。
九、Scale Drawable:在原图的基础上改变图片的大小。例子:
第一步:drawable文件中建立scale_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/test_img"
android:scaleGravity="center_vertical|center_horizontal"
android:scaleHeight="50%"
android:scaleWidth="80%" />
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/test_img"
android:scaleGravity="center_vertical|center_horizontal"
android:scaleHeight="50%"
android:scaleWidth="80%" />
第二步:在xml中引用
<ImageView
android:id="@+id/scaleimage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/scale_drawable"/>
第三步,在程序中设置level
ImageView scaleImage=(ImageView)findViewById(R.id.scaleimage);
ScaleDrawable scale=(ScaleDrawable)scaleImage.getDrawable();
scale.setLevel(10000);
这里设置level为10000表示可以整个显示图片。
十、Shape Drawable:在xml中定义图形。可以自定义一个图形,包括边框、渐变、圆角等。例子:
第一步:shape_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
<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>
第二步:xml中引用
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="shape例子"
android:background="@drawable/shape_drawable"/>
相关推荐
在Android开发中,Drawable是图形和图像的基本元素,它用于绘制视图的背景、按钮、图标等。系统提供了多种预定义的Drawable类型,如Shape、BitmapDrawable等,但有时我们可能需要实现更复杂的视觉效果,这时就需要...
在Android开发中,drawable资源是不可或缺的一部分,它主要用于定义图形、形状、背景等视觉元素,还可以用来改变控件的外观。本篇文章将深入探讨如何利用drawable资源来改变Android应用中的控件外观。 首先,...
本示例探讨的是如何使用Android的`drawable`资源来实现一个按钮的三种不同状态:正常状态、按压状态和焦点状态。这些状态的切换可以提供更好的用户体验,让用户清楚地感知到他们的操作。 首先,我们创建一个XML文件...
在这个例子中,`<gradient>`标签内的属性用于定义渐变的具体细节。`android:startColor`和`android:endColor`分别定义了渐变开始和结束的颜色,`android:type`定义了渐变的类型(这里是线性渐变),`android:angle`...
在Android开发中,Drawable是用于表示图形资源的重要类,它涵盖了图像、颜色、形状等多种视觉元素。本资源包“Android高级应用源码-drawable(图片).zip”显然是一个专注于探讨如何在Android应用中高效、灵活地使用...
在这个例子中,我们定义了一个状态选择器,它会根据视图的不同状态显示不同的图片。例如,当用户点击某个按钮并使其保持聚焦状态时,会显示`pic2`;而当按钮失去焦点时,则会恢复到默认的图片`pic1`。 #### 三、...
在AndroidProject7这个项目中,你可能已经看到了如何在实际应用中使用这些Drawable和尺寸单位的例子。通过深入理解这些概念,你可以更好地控制UI元素的外观和交互,提升应用的用户体验。不断探索和实践,你将能够...
在Android开发中,State List Drawable(状态列表绘制对象)是一种非常重要的资源类型,它允许我们根据组件的状态(如被按下、被聚焦、被选中等)来改变其显示的图像。这个实例“Android State List Drawable状态...
这个库名为`android-gif-drawable`,它优化了GIF在Android控件中的显示性能,解决了原生Android API在处理GIF时的一些局限性。 首先,我们要理解Android原生对GIF支持的不足。Android SDK并没有提供内置的API来直接...
在这个例子中,`<vector>`标签定义了图形的大小和视口,`<path>`标签则描述了图形的具体形状,`android:pathData`属性用SVG路径语法定义了形状的轮廓,`android:fillColor`则指定了填充色。 Android Studio 2.0之后...
在这个例子中,我们定义了一个名为`button_drawable`的Selector资源。它包含了两个状态: - 当RadioButton处于启用且被选中的状态时,会显示`@drawable/check`图片。 - 当RadioButton处于启用但未被选中的状态时,...
每个`<item>`标签代表一个帧,`android:drawable`引用帧的资源,`android:duration`设置该帧显示的时间,单位为毫秒。持续时间越短,动画速度越快。 3. **在代码中加载和播放动画**:在Activity或View中,我们可以...
### 可绘制资源(Drawable资源)在Android中的运用与解析 在Android开发中,`Drawable`资源扮演着至关重要的角色,它们是图像的一种抽象表示,主要用于界面设计中的图标、背景和其他视觉元素。`Drawable`资源的灵活...
在这个例子中,`@drawable/ico_day_mark_future`是图像资源的引用,`android:drawablePadding`用来设置图像与文本之间的距离。 在Java代码中,我们可以动态地设置这些属性。首先,我们需要获取到图像资源,然后创建...
在这个例子中,"切图"是指将游戏人物的不同动作分解成多个图像(帧),然后根据游戏逻辑在适当的时候显示相应的帧,以实现人物的动画效果。这通常涉及到Bitmap的加载和位图操作,例如使用Bitmap.createBitmap()方法...
总的来说,"android-gif-drawable 支持fig显示的view.rar" 提供的资源可能包含一个示例项目,演示了如何在Android应用中使用Android-Gif-Drawable库来展示和控制GIF动态图。开发者可以参考这个例子,学习如何在自己...
在ExmLeak这个压缩包文件中,你可以找到具体的代码实现,通过分析和实践这些例子,你将更好地理解和掌握如何避免Android应用中的内存泄漏问题。记住,良好的内存管理是提升应用性能和稳定性的重要因素。
在这个例子中,我们有三帧图片,每帧显示时间为100毫秒。你可以根据实际需求调整帧数和持续时间。 **步骤2:设置视图背景** 在你的Activity或Fragment中,为一个视图(例如ImageView)设置`frame_animation.xml`...
在Android开发中,Drawable是用于绘制图形对象的重要类...这个例子中的Drawable动画演示了如何利用帧动画技术,结合图片资源,实现一个动态效果。开发者可以根据实际需求,调整动画参数和图片序列,以达到理想的效果。
在上面的例子中,我们通过设置`android:state_pressed`属性来区分两种状态:按下和未按下。 - 当`ImageButton`被按下时,系统会检查`imageselector.xml`文件中是否有对应`android:state_pressed="true"`的项,如果...