Drawable解析4——StateListDrawable和AnimationDrawable

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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);
            }
        });

看下最终效果吧:

相关文章
|
XML Java Android开发
Drawable解析3——LayerDrawable、TransitionDrawable、NinePatchDrawable和LevelListDrawabl
1、前两节我们已经说了8个Drawable了,本节继续,第一个,LayerDrawable,表示层图形对象。LayerDrawable用于管理一组drawable,每个drawable处于不同的层,当绘制时会按照顺序将其全部绘制到画布上。
1091 0
|
XML Android开发 数据格式
Drawable解析2——GradientDrawable、ShapeDrawable、InsetDrawable和RotateDrawable
继承上一节,这一节接着说四个子类 1、GradientDrawable表示一个渐变区域,可以实现线性渐变、发散渐变、和平铺渐变。
1300 0
|
XML Java Android开发
Drawable解析1——ColorDrawable、BitmapDrawable、ClipDrawabl和ScaleDrawable
Drawable资源是Android应用中使用最广泛的资源,它不仅可以使用各种格式的图片资源,也可以使用多种xml文件资源。
953 0
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
87 0
|
3月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
68 0
|
3月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
75 0
|
3月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
96 0
|
12天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
12天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多