Android中Drawable分类汇总(下)

转载 http://www.devdiv.com/forum.php?mod=viewthread&tid=126942


七、ScaleDrawable

        ScaleDrawable是对一个Drawable进行缩放操作,可以根据level属性控制这个drawable的缩放比率,也可以设置它在容器中的对齐方式。

        在xml文件中使用scale作为根节点来创建RotateDrawable。

        创建ScaleDrawable的代码如下:

1 <?xml version="1.0" encoding="utf-8"?>
2 <!-- android:scaleGravity=""可以设置缩放的对齐方式 -->
3 <scale xmlns:android="http://schemas.android.com/apk/res/android"
4     android:drawable="@drawable/smiley_smile"
5     android:scaleWidth="100%"
6     android:scaleHeight="100%"
7     >
8      
9 </scale>

        效果如下图所示:

QQ截图20120606150541.png


图6-10  ScaleDrawable运行效果图


八、 RotateDrawable

        RotateDrawable 是对一个Drawable进行旋转操作,可以根据level属性控制这个drawable旋转角度,也可以设置相对于它所在容器的对齐方式。

        在xml文件中使用rotate作为根节点来定义RotateDrawable.

        创建RotateDrawable的代码如下:

1 <?xml version="1.0" encoding="utf-8"?>
2 <rotate xmlns:android="http://schemas.android.com/apk/res/android"
3     android:drawable="@drawable/smiley_smile"
4     android:pivotX="50%"
5     android:pivotY="50%"
6     >
7      
8  
9 </rotate>

        效果如下图所示:

QQ截图20120606151807.png

图6-11  RotateDrawable运行效果图


九、AnimationDrawable

        AnimationDrawable 对应于Android中的帧动画,就是把一系列的drawable按照一定的顺序,一帧一帧的播放,并且可以使用android:oneshot属性设置是否循环播放。

        在xml文件中使用animation-list作为根节点定义AnimationDrawable,使用item设置需要播放的每一帧使用的drawable资源,以及每一帧持续的时常。

        下面的代码定义了一个包含五帧的AnimationDrawable,帧间隔为300毫秒,代码如下:

01 <?xml version="1.0" encoding="utf-8"?>
02 <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
03     android:oneshot="false">
04     <item
05         android:drawable="@drawable/level1"
06         android:duration="300"
07         />
08     <item
09         android:drawable="@drawable/level2"
10         android:duration="300"
11         />
12     <item
13         android:drawable="@drawable/level3"
14         android:duration="300"
15         />
16     <item
17         android:drawable="@drawable/level4"
18         android:duration="300"
19         />
20     <item
21         android:drawable="@drawable/level5"
22         android:duration="300"
23         />
24 </animation-list>

        定义了AnimationDrawable之后需要主动调用AnimationDrawable的start播放动画,需要注意的是,当我们在Activity的oncreate方法中调用start方法时会没有任何效果,那是因

        为view还没有初始化完成,无法播放动画,所以需要使用handler来延迟播放动画,具体实现代码如下:

1 mHandler.postDelayed(new Runnable() {
2          
3         @Override
4         public void run() {
5                 // TODO Auto-generated method stub
6                 ((AnimationDrawable)mDrawable).start();
7                  
8         }
9 }, 1000);

十、LayerDrawable

        LayerDrawable 管理一组drawable,每个drawable都处于不同的层,当它们被绘制的时候,按照顺序全部都绘制到画布上。虽然这些drawable会有交差或者重叠的区域,但是它们是位于不同的层,彼此之间不会影响。

        在xml文件中使用layer-list作为根节点来定义LayerDrawable,通过item子节点定义每一层的drawable,layer-list没有属性节点,只包含item子节点。

        下面的xml定义了一个包含三层的LayerDrawable,为了清楚的看到它们分别位于不同的层,可以给每一层都设置了一些透明度,代码如下:

1 <?xml version="1.0" encoding="utf-8"?>
2 <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
3     <item android:drawable="@drawable/layer1" />
4     <item android:drawable="@drawable/layer2" />
5     <item android:drawable="@drawable/layer3" />
6 </layer-list>

        效果如下图所示:

QQ截图20120606155548.png


图6-12  LayerDrawable运行效果图


十一、LevelListDrawable

        管理一组drawable,每一个drawable都对应一个level范围,当它们被绘制的时候,根据level属性值选取对应的一个drawable绘制到画布上。

        在xml文件中使用level-list作为根节点来定义LevelListDrawable,通过item子节点定义每一层的drawable,level-list没有属性节点,只包含item子节点。

        创建LevelListDrawable的代码如下:

01 <?xml version="1.0" encoding="utf-8"?>
02 <level-list xmlns:android="http://schemas.android.com/apk/res/android" >
03  
04     <item
05         android:maxLevel="2000"
06         android:drawable="@drawable/level1" />   
07     <item
08         android:maxLevel="4000"
09         android:drawable="@drawable/level2" />
10     <item
11         android:maxLevel="6000"
12         android:drawable="@drawable/level3" />
13     <item
14         android:maxLevel="8000"
15         android:drawable="@drawable/level4" />
16     <item
17         android:maxLevel="10000"
18         android:drawable="@drawable/level5" />
19  
20 </level-list>

        效果如下图所示:

QQ截图20120606161047.png


图6-13  LevelListDrawable运行效果图1

QQ截图20120606161055.png


图6-14  LevelListDrawable运行效果图2


十二、StateListDrawable

        StateListDrawable管理一组drawable,每一个drawable都对应着一组状态,状态的选择类似于java中的switch-case组合,按照顺序比较状态,当遇到匹配的状态后,就返回对应的drawable,因此需要把最精确的匹配放置在最前面,按照从精确到粗略的顺序排列。

        StateListDrawable在Android中使用的非常广泛,所有控件的背景基本上都使用了StateListDrawable,比如按钮就具有很多状态,按下状态、选中状态、默认状态、禁用状态等等,像这样在不用的状态下显示效果不一样的时候,就是需要使用StateListDrawable的时候。

        在xml文件中使用selector作为根节点来定义StateListDrawable,并使用item定义不同状态下的drawable。

        创建StateListDraw的代码如下:

01 <?xml version="1.0" encoding="utf-8"?>
02 <selector xmlns:android="http://schemas.android.com/apk/res/android" >
03     <item android:state_focused="false"
04         android:state_pressed="false"
05         android:drawable="@drawable/gradient_normal"
06         />
07      
08     <item android:state_pressed="true"
09         android:drawable="@drawable/gradient_pressed"
10         />
11      
12     <item android:state_focused="true"
13         android:drawable="@drawable/gradient_focused"
14         />
15  
16 </selector>

        效果如下图所示:

QQ截图20120606163955.png


图6-15  Normal状态下StateListDrawable运行效果图

QQ截图20120606164003.png


图6-16  Focused状态下StateListDrawable运行效果图

QQ截图20120606164009.png


图6-17  Pressed状态下StateListDrawable运行效果图


十三、TransitionDrawable

        TransitionDrawable 是LayerDrawable的子类,不过它只负责管理两层drawable,并且提供了一个透明度变化的动画,可以控制从一层drawable过度到另外一层drawable的动画效果。

        在xml文件中使用transition作为根节点来定义TransitionDrawable,通过item子节点定义两层使用的drawable。

        创建TransitionDrawable的代码如下:

1 <?xml version="1.0" encoding="utf-8"?>
2 <transition xmlns:android="http://schemas.android.com/apk/res/android" >
3     <item android:drawable="@drawable/smiley_smile"/>
4     <item android:drawable="@drawable/smiley_smile_glasses"/>
5  
6 </transition>

        在使用AnimationDrawable的时,需要主动调用startTransition方法启动两个层之间的切换动画,也可以调用reverseTransition方法启动逆向切换动画,它们都可以接受一个毫秒

数,作为动画的持续时间。代码如下:

1 mHandler.postDelayed(new Runnable() {
2          
3         @Override
4         public void run() {
5                 // TODO Auto-generated method stub
6                 ((TransitionDrawable)mDrawable).startTransition(2000);
7         }
8 }, 1000);

        效果如下图所示:

QQ截图20120606165324.png


图6-18  TransitionDrawable运行效果图1

QQ截图20120606165330.png


图6-19  TransitionDrawable运行效果图2


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值