教程索引
- Android 拖拽(Drag and Drop)教程
- Android 绘制(Drawables)教程
- Android 样式和主题(Styles and Themes)教程
- Android 动态壁纸(Live Wallpaper)教程
- Android 主屏幕小部件(Homescreen Widgets)教程
- Android 自定义视图(Custom Views)教程
- Android 支持不同大小屏幕(Support different screensize)教程
- Android 动画(animations)教程
- Android 触摸(Touch)教程
Android绘制教程
1. Drawables 简介
Drawable 资源是一个笼统的概念,暂且我就笼统地叫它绘制吧,使用它可以来一个图形。一个最简单的案例就是 bitmap 文件,在 Android 中可以通过 BitmapDrawable 类来封装该文件。Bitmaps 文件通常存放在 res/drawable-**目录下,当你创建一个 Android 项目的时候,伴随着也会默认创建几个 drawable 目录,drawable-hdpi|drawable-ldpi|drawable-mdpi|drawable-xhdpi,你可以为不同的 Android 设备提供不同尺寸的文件。如果你为不同尺寸的 Android 系统只提供一个文件,那么该文件在不同分辨率的设备上可能显示不同的效果。
Android 除了支持图形文件,还支持 XML drawables 和 9-patch 图形文件。XML drawables 被用来描述shapes(color, border, gradient),State 和 Transitions 等。9-patch 图形文件的作用是当图形整个扩大,例如某个文件充当 Button 的背景图片,当按钮变得很大的时候,背景图片也会变大,那么图片自然也会变得模糊,而9-patch可以给该图片划定一个区域,用来指定图片变大后,那一块也跟着变大,哪个区域不变。
2. 获取 Drawables
在XML文件中直接通过 @drawable/filename 来获取 Drawables,需要注意的是filename不包含扩展名。在Java代码中同样可以获取 Drawables。绝大多数的视图(Views)接受一个 resource ID来作为输出的参数。例如下面的例子展示了如何将一个 Drawables 作为 ImageView 的背景图片。
imageView.setImageResource(R.drawable.hello);
3. XML Drawables
3.1 Shape Drawables
Shape Drawables XML文件可以用来定义一个几何对象,你可以定义该几何对象颜色(colors), 边框(borders)以及渐变效果(gradients),并将该对象效果应用到视图(Views)上面。使用 Shape Drawables XML的优势在于,他们可以根据不同尺寸的手机自动调整大小。
下面我将定义一个 Shape Drawable -- myshape.xml
< shape
xmlns:android ="http://schemas.android.com/apk/res/android"
android:shape ="rectangle" >
< stroke
android:width ="2dp"
android:color ="#FFFFFFFF" />
< gradient
android:endColor ="#DDBBBBBB"
android:startColor ="#DD777777"
android:angle ="90" />
< corners
android:bottomRightRadius ="7dp"
android:bottomLeftRadius ="7dp"
android:topLeftRadius ="7dp"
android:topRightRadius ="7dp" />
</ shape >
接着我们将上面定义的 drawable 应用到你的 layout 中。注意下面例子中的第 5 行代码。
2 < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:layout_width ="match_parent"
4 android:layout_height ="match_parent"
5 android:background ="@drawable/myshape"
6 android:orientation ="vertical" >
7
8 < EditText
9 android:id ="@+id/editText1"
10 android:layout_width ="match_parent"
11 android:layout_height ="wrap_content"
12 >
13 </ EditText >
14
15 < RadioGroup
16 android:id ="@+id/radioGroup1"
17 android:layout_width ="match_parent"
18 android:layout_height ="wrap_content" >
19
20 < RadioButton
21 android:id ="@+id/radio0"
22 android:layout_width ="wrap_content"
23 android:layout_height ="wrap_content"
24 android:checked ="true"
25 android:text ="@string/celsius" >
26 </ RadioButton >
27
28 < RadioButton
29 android:id ="@+id/radio1"
30 android:layout_width ="wrap_content"
31 android:layout_height ="wrap_content"
32 android:text ="@string/fahrenheit" >
33 </ RadioButton >
34 </ RadioGroup >
35
36 < Button
37 android:id ="@+id/button1"
38 android:layout_width ="wrap_content"
39 android:layout_height ="wrap_content"
40 android:text ="@string/calc"
41 android:onClick ="myClickHandler" >
42 </ Button >
43
44 </ LinearLayout >
3.2 State Drawables
State Drawables可以用来指定不同的状态, 针对视图(View)的不同状态可以给该视图赋予不同的 drawable。最常见的例子就是根据按钮不同的状态,显示不同的 drawable。
< selector xmlns:android ="http://schemas.android.com/apk/res/android" >
< item android:drawable ="@drawable/button_pressed"
android:state_pressed ="true" />
< item android:drawable ="@drawable/button_checked"
android:state_checked ="true" />
< item android:drawable ="@drawable/button_default" />
</ selector >
3.3 Transition Drawables
< transition xmlns:android ="http://schemas.android.com/apk/res/android" >
< item android:drawable ="@drawable/first_image" />
< item android:drawable ="@drawable/second_image" />
</ transition >
final ToggleButton button = (ToggleButton) findViewById(R.id.button);
button.setOnClickListener( new OnClickListener() {
@Override
public void onClick( final View v) {
TransitionDrawable drawable = (TransitionDrawable) image.getDrawable();
if (button.isChecked()) {
drawable.startTransition(500);
} else {
drawable.reverseTransition(500);
}
}
});
4. 9-Patch Drawables
9 Patch drawables 是一些具有额外 1px 外边框的图片资源。在9-Patch 图片的上边和左边你可以定义一块区域, 当图片资源相对于视图而言太小的时候,这些区域将被缩放。在图片的右边和下面你也可以定义一块区域,如果视图可以添加文字信息,那么这些文字信息将被放置在这些区域,例如Button。
在 android-sdk/tool安装目录下,你可以找到 draw9patch 程序,使用该程序你可以轻松地绘制 9 Patch drawables。