Drawable资源通常保存在/res/drawable目录,可分为图片资源(*.png、*.jpg、*.gif等格式)、XML资源等,Android SDK会在编译应用中自动加载该图片资源,并在R资源清单类中生成该资源的索引。使用方法如下:
Java代码中:[<package_name>.]R.drawable.<file_name>
xml代码中:[<package_name>.]@drawable/<file_name>
为了在程序中获得实际的Drawable对象,Resources提供了Drawable getDrawable(int id)方法来获得实际的Drawable对象。
1.StateListDrawable资源
StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景、前景图片时,StateListDrawable对象所显示的Drawable对象会随目标组件状态的改变自动切换。定义StateListDrawable对象的XML文件的根元素为<selector../>,
该元素可以包含多个<item../>子元素,该元素可指定如下属性:
>android:color或android:drawable:指定颜色或Drawable对象;
>android:state_xxx:指定一个特定状态;
实例:http://blog.csdn.net/u012637501/article/details/46529865
2.LayerDrawable资源
与StateListDrawable有点类似,LayerDrawabe也可以包含一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会被绘制在最上面。定义LayerDrawable对象的XML文件的根元素为<layer-list.../>,该元素可以包含多个<item.../>元素,该元素可指定如下属性:
>android:drawable:指定作为LayerDrawable元素之一的Drawable对象;
>android:id:为该Drawable对象指定一个标识;
>android:butom/top/left/Right:用于指定一个长度值指定将该Drawable对象绘制到目标组件的指定位置.
语法格式如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 指定一个Drawable元素 -->
<item
android:id="@android:id/background"
android:drawable="@drawable/grow"/>
</layer-list>
源码实战:自定义进度条的风格
(1)res/drawable/mybar.xml
功能:进度条外观风格
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 指定一个Drawable元素,用于定义进度条轨道背景 --> <item android:id="@android:id/background" android:drawable="@drawable/image02"/> <!-- 指定一个Drawable元素,用于定义轨道上已完成部分的外观--> <item android:id="@android:id/progress" android:drawable="@drawable/image01"/> </layer-list>
注意:@android:id/background和@android:id/progress标明Drawable元素的ID,是Android系统自带的,均有各自的功能,用户不能自行定义i。
(2)res/drawable/layout_logo/xml
功能:图片叠加效果
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <bitmap android:gravity="center" android:src="@drawable/image03" /> </item> <item android:left="25dp" android:top="25dp"> <bitmap android:gravity="center" android:src="@drawable/image01" /> </item> <item android:left="50dp" android:top="50dp"> <bitmap android:gravity="center" android:src="@drawable/image02" /> </item> </layer-list>
(3)MainActivity.java
功能:通过子线程模拟进度条进度
package com.example.layerdrawabletest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.ProgressBar; public class MainActivity extends Activity { private int[] data = new int[100]; int hasData = 0; int status = 0; ProgressBar bar; // 创建一个负责更新的进度的Handler Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == 0x111) { bar.setProgress(status); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bar = (ProgressBar) findViewById(R.id.progressBar); // 启动线程来执行任务 new Thread(new Runnable() { public void run() { while (status < 100) { status = doWork(); // 获取耗操作的完成百分比 handler.sendEmptyMessage(0x111); // 发送消息 } } }).start(); } // 模拟一个耗时任务 public int doWork() { data[hasData++] = (int) (Math.random() * 100); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } return hasData; } }
(4)效果演示
3.ShapeDrawable资源
ShapeDrawable用于定义一个基本的几何图形(如矩形、圆形、线条等),定义ShapeDrawable的XML文件的根元素是<shape.../>元素,该元素可指定如下属性:
>android:shape=["rectangle"|"oval"|"line"|"ring"]:指定定义哪种类型的几何图形
另外,<shape../>元素下可以包含多个子元素,如<corners../>、<gradient.../>等
定义ShapeDrawable对象的完整语法格式如下:
- <? xml version="1.0" encoding="utf-8"?>
- <shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape=["rectangle"|"oval"|"line"|"ring"]>
- <!-- 定义几何图形的四个角的弧度 -->
- <corners
- android:radius="integer"
- android:topLeftRadius="integer"
- android:topRightRadius="integer"
- android:bottomLeftRadius="integer"
- android:bottomRightRadius="integer"/>
- <!-- 定义使用渐变色填充 -->
- <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"]/>
- <!-- 定义几何形状的内边框 -->
- <padding
- android:left="integer"
- android:top="integer"
- android:right="integer"
- android:bottom="integer"/>
- <!-- 定义几何形状的大小 -->
- <corners
- android:width="integer"
- android:color="color"
- android:dashWidth="integer"
- android:dashGap="integer"/>
- <!-- 定义使用单种颜色填充 -->
- <solid
- android:color="color"/>
- <!-- 定义几何形状绘制边框 -->
- <stroke
- android:width="integer"
- android:color="color"
- android:dashWidth="integer"
- android:dashGap="integer"/>
- </shape>
实例:http://blog.csdn.net/u012637501/article/details/46529865
4.ClipDrawable资源
ClipDrawable代表从其他位图上截取的一个"图片片段"。在XML文件中定义ClipDrawable对象使用<clip../>元素,该元素具有以下属性:
>android:drawable:指定截取的源Drawable对象
>android:clipOrientation:指定截取方向,可设置水平截取或垂直截取
>android:gravity:指定截取时的对齐方式
该元素的语法为:
- <? xml version="1.0" encoding="utf-8"?>
- <clip xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/drawable_resource"
- android:clipOritentation=["horizontal"|"vertical"]
- android:gravity=["top"|....]>
注:使用ClipDrawable对象对可调用setLevel(int level)方法来设置截取的区域大小,当level为0时,截取的图片片段为空;当level为10000时,截取整张图片。
5.AnimationDrawable资源(/res/anmi)
AnimationDrawable代表一个动画,Android支持传统的逐帧动画(类似于电影方式,即一张图片一张图片地切换)和补间动画(通过平移、变化计算得到)。
(1)定义补间动画的思路是
设置一张图片的开始状态(包括透明度、位置、缩放比、旋转度),然后,设置该图片的结束状态(包括透明度、位置、缩放比、旋转度),在设置动画的持续时间,Android系统会使用动画效果把这张图片从开始状态变换到结束状态。在XML资源文件中以<set../>元素作为根元素,该元素的属性有:
>android:interpolator="@anim/interpolator_resource" 作用:指定指定动画的变化速度
>android:shareInterpolator=["true"|"false"] 作用:指定<set../>元素下所有的变换效果使用相同的动画速度
>android:duration="integer(持续的时间)" 作用:设置动画的持续时间
根元素包含如下4个子元素:
◇<alpha.../>:设置透明度的改变
◇<scale.../>:设置图片进行缩放改变
◇<translate.../>:设置图片进行位移变换
◇ <rotate.../>:设置图片进行旋转
注:除<set.../>根元素外,<alpha.../>、<scale.../>等子元素都可以指定一个android:interpolator属性,通过该属性可以指定动画的变化速度,如匀速、正加速、负加速、无规则变速等,Android系统的R.anim类就包含大量的常量来定义这些速度,如linear_interpolator(匀速变换)、accelerate_interpolator(加速变换)、decelerate_interpolator(减速变换)。
(2)设置补间动画的语法格式
- <? xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@anim/interpolator_resource"
- android:shareInterpolator=["true"|"false"]
- android:duration="integer(持续的时间)">
- <!--设置透明度的改变-->
- <alpha
- android:fromAlpha="float"
- android:toAlpha="float"/>
- <!--设置图片进行缩放改变-->
- <scale
- android:fromXScale="float"
- android:toXScale="float"
- android:fromYScale="float"
- andrroid:toYScale="float"
- android:pivotX="float"
- android:pivotY="float"/>
- <!--设置图片进行位移改变-->
- <translate
- android:fromXDelta="float"
- android:toXDelta="float"
- android:fromYDelta="float"
- android:toYDelta="float"/>
- <!--设置图片进行旋转改变-->
- <rotate
- android:fromDegress="float"
- android:toDegress="float"
- android:pivotX="float"
- android:pivotY="float"/>
- </set>
注释:上面语法格式中包含了大量的fromXxx,toXxxx属性,用于定义图片的开始状态和结束状态。另外,当进行缩放变换(scale)、旋转(rotate)变换时,还需要指定pivotX、pivotY两个属性,用于指定变换的"中心点"("旋转轴")。
源码实战:自定义Activity切换风格
(1)res/values/activityTheme.xml
功能:自定义Activity窗口显示风格,并通过android:windowAnimationStyle属性设置Activity进入与退出的切换风格,其中@anim/zoom_enter和@anim/zoom_exit分别代表的是进入动画和退出动画。
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="mTheme" parent="android:style/Theme.NoTitleBar"> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">false</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowAnimationStyle">@style/activity_bottom_in_top_out</item> <item name="android:windowSoftInputMode">stateHidden</item> </style> <style name="activity_bottom_in_top_out" parent="@android:style/Animation.Translucent"> <item name="android:windowEnterAnimation">@anim/zoom_enter</item> <item name="android:windowExitAnimation">@anim/zoom_exit</item> </style> </resources>
(2)res/anim/zoom_enter.xml
功能:Activity进入动画效果
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" > <scale android:duration="@android:integer/config_mediumAnimTime" android:fromXScale="2.0" android:fromYScale="2.0" android:pivotX="50%p" android:pivotY="50%p" android:toXScale="1.0" android:toYScale="1.0" /> </set>
(3)res/anim/zoom_exit.xml
功能:Activity退出动画效果
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="1000" android:fromYDelta="0" android:toYDelta="100%" /> <alpha android:duration="1000" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>
(4)AndroidManifest.xml
功能:在清单文件中通过Android:theme属性指定应用或单个Activity的主题,即应用切换效果。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="suntektech.project.spq" android:versionCode="1" android:versionName="1.0" > <!-- 添加写sd卡的权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 添加访问网络权限 --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <!-- 设置应用支持的设备尺寸 --> <supports-screens android:smallScreens="false" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="false"/> <!-- android:screenOrientation="portrait"禁止横屏 --> <application android:allowBackup="true" android:icon="@drawable/icon" android:theme="@style/mTheme" android:label="@string/app_name"> <activity android:name="suntektech.project.spq.WelcomeActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
(5)效果演示