开发者社区> 爆米花9958> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Drawable解析4——StateListDrawable和AnimationDrawable

简介: 1、估计StateListDrawable是大家用的最多一个drawable了,所有的控件背景基本上都使用了StateListDrawable,以实现其在不同状态下显示不同的效果,例如按钮的按下、选中、默认、禁用等多种模式状态。
+关注继续查看

1、估计StateListDrawable是大家用的最多一个drawable了,所有的控件背景基本上都使用了StateListDrawable,以实现其在不同状态下显示不同的效果,例如按钮的按下、选中、默认、禁用等多种模式状态。StateListDrawable用于管理一组drawable,每个drawable都对应一组状态,状态的选择类似于java中的switch-case组合,按照顺序比较状态,当遇到匹配的的状态,就返回对应的drawable,因此需要把最精确的匹配放置到最前面,整体按照从精确到粗略的顺序排列。在xml文件中使用selector作为根节点来定义StateListDrawable,并使用item作为子节点定义不同状态下的drawable。selector和item的属性如下:


  • 定义一个state_list_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/button_normal" android:state_focused="false" android:state_pressed="false"/>
    <item android:drawable="@drawable/button_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/button_focused" android:state_focused="true"/>

</selector>
  • 当然我也可以不使用drawable,直接使用颜色也可以,编写state_list_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

   <item android:state_focused="false" android:color="#ffffff"/>
    <item android:state_focused="true" android:color="#ff0000"/>

</selector>

  • 在activity_main.xml中为一个Button和EditText分别设置背景
 <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/state_list_drawable"
        android:text="按键效果" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@drawable/state_list_color" >
    </EditText>

2、AnimationDrawable代表一个动画,既支持逐帧动画又支持补间动画(补间动画已经属于动画的范畴了,但既然他也是Drawable,那就说一下吧)。先说下帧动画的使用方法,在xml文件中使用animation-list作为根节点定义AnimationDrawable,使用Item设置进行播放发每一帧所需的Drawable资源。可以使用android:oneshot属性设置是否循环播放。
写个例子:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<itemandroid:drawable="@drawable/anim1"
android:duration="300"/>
<itemandroid:drawable="@drawable/anim2"
android:duration="300"/>
<itemandroid:drawable="@drawable/anim3"
android:duration="300"/>
</animation-list>

定义了AnimationDrawable之后,需要主动调用AnimationDrawable的start方法播放动画,注意在onCreate方法中调用start方法是没有任何效果的,这是因为此时View还没有完成初始化,可以使用handler来实现延迟播放动画,代码如下:
 mHandler.postDelayed(new Runnable() {

                        public void run() {
                            (mAnimationDrawable.start();
                        }

                    }, 300);

再说下补间动画的使用, 补间动画使用set作为根节点进行定义,结构如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true"|"false"]
android:duration="持续时间">
<alpha/>设置透明度的改变
<scale/>设置图片进行缩放改变
<translate/>设置图片进行位移变换
<rotate/>设置图片进行旋转

举个例子,在res\anim\my_anim.xml定义
<?xml version="1.0" encoding="UTF-8"?>
    android:interpolator="@android:anim/linear_interpolator"
    android:duration="5000">
    <!-- 定义缩放变换 -->
    <scale android:fromXScale="1.0"  
        android:toXScale="1.4"  
        android:fromYScale="1.0"  
        android:toYScale="0.6"  
        android:pivotX="50%" 
        android:pivotY="50%" 
        android:fillAfter="true" 
        android:duration="2000"
    /> 
    <!-- 定义位移变换 -->        
    <translate android:fromXDelta="10"
        android:toXDelta="130"
        android:fromYDelta="30"
        android:toYDelta="-80"
        android:duration="2000"
    />
</set>

在java代码中如下调用
mImageView2 = (ImageView) findViewById(R.id.imageView2);
        mAnimationDrawable2=AnimationUtils.loadAnimation(this, R.anim.my_anim);
        // 设置动画结束后保留结束状态
        mAnimationDrawable2.setFillAfter(true);
        mButton1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mImageView2.startAnimation(mAnimationDrawable2);
            }
        });

看下最终效果吧:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
在Ubuntu上安装Redis详细步骤
在Ubuntu上安装Redis详细步骤
70 0
ubuntu 18.04安装hdp 3.1.0最新完整版(含安装包)
hdp平台提供centos、ubuntu等平台的安装与使用,本文以ubuntu 18.04操作系统为基础,介绍hdp3.1.0在该平台上的安装与配置,并提供安装包下载,手把手教您搭建属于您的大数据平台。
317 0
DistributedLog
我们在2016年五月开源了DistributedLog项目,引起了社区的广泛关注。大家常常问起的问题之一就是DistributedLog与Apache Kafka相对比,各有什么优劣。
1366 0
gif-drawable的使用及详解
下载gif-drawable包和Demo的链接:http://pan.baidu.com/s/1eQxVKRo 本帖原创,转载的朋友请注明转载地址》:http://www.cnblogs.com/zxxiaoxia/     好久没有写博客了,今天来更新一下。
712 0
一些窍门 drawable
java.lang.Object       android.graphics.drawable.DrawableKnown Direct Subclasses   BitmapDrawable, ClipDrawable, ColorDrawable, DrawableContainer, Gra...
636 0
PrintWriter和ServletOutputStream的区别
1. PrintWriter是以字符为单位,对所有的信息进行处理,而ServletOutputStream仅对二进制的资料进行处理。 2. PrintWriter在输出字符文本时内部需要将字符串转换成某种字符集编码的字节数组,使用他的好处就是不需要自己来完成从字符串到字节数组的转换。转换的字符集编码是通过设置setContentTpye或setCharacterEncoding或se
1060 0
141
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载