Android属性动画之实践篇

一,写在前面
       Android动画分为View动画,帧动画,属性动画。
      View动画包含四种动画:ScaleAnimation,TranslateAnimation,AlphaAnimation,RotateAnimation,分别对应缩放,平移,透明度,旋转。View动画有个特点:需要作用在具体的控件View上,可以采用xml文件,Java代码两种实现控件的动画效果。
     帧动画需要提供使用xml文件定义一个AnimationDrawable对象,具体来说是在xml文件中提供根节点<animation-list>,并定义若干<item>子节点,给<item>的android:drawable属性设置图片id。然后将AnimationDrawable对象设置为控件view的background,并通过AnimationDrawable$start方法来启动播放动画。 注意:使用帧动画时,尽量避免使用尺寸过大的图片,否则容易发生OOM。

     上面简单介绍了View动画和帧动画,由于不是本篇文章描述重点,故不提供相关代码展示两者的具体使用,有需要的哥们可以在网上自行查阅相关知识点。那为什么要使用属性动画呢?什么是属性动画呢?属性动画的实现方式有哪些呢?属性动画有哪些需要注意的呢?接下来结合理论加实践的方式一一解答。
二,属性动画的使用
      如果想实现一个按钮的背景色从绿色到红色的效果,View动画和帧动画都无法实现,那么这样属性动画就派上用场了。属性动画可以对任意对象的属性进行动画效果,并不仅仅指View对象。在API层面上来看,需要提供一个对象,并提供该对象的属性(这里听起来可能比较懵,是什么样的对象,什么样的属性呢?不懂没关系,后面展示一波代码就很容易理解了),属性动画可以在某一段时间内,实现对象的属性值从起始值到最终值的变化。在具体实现效果的层面来看,属性动画都是带来UI的变化。

      值得一提的是,属性动画的默认执行时间是300ms,执行一帧的时间是10ms。使用属性动画的API最低版本是11,也就是Android3.0版本。属性动画常用的几个类:ObjectAnimator,ValueAnimator,AnimatorSet。
它们直接关系如下图:
2.1,使用 xml文件,实现属性动画
      2.1.1 首先,需要在资源文件夹res目录下创建animator目录,并将属性动画相关的xml文件放在该目录下,在Java代码中使用R.animator.xxx来引用该资源文件。
     创建一个anim_set.xml文件,代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
    <objectAnimator
        android:propertyName="scaleX"
        android:duration="3000"
        android:valueType="floatType"
        android:valueFrom="1"
        android:valueTo="0.3"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:startOffset="1000"/>
    <objectAnimator
        android:propertyName="backgroundColor"
        android:duration="3000"
        android:valueFrom="0xFFFF0000"
        android:valueTo="0xFF00FF00"
        android:valueType="colorType"/>
</set>
第2行,<set>标签对应AnimatorSet对象,它是属性动画集合,可以在其里面存放多个子动画。
第3行,ordering属性表示多个子动画执行方式,有两种:sequentially(顺序执行),together(同时执行,属于默认值)。
第4行,<ObjectAnimator>标签对应ObjectAnimator对象,下面详细介绍它的一些属性:
     propertyName:属性动画作用对象的属性名称;
     duration:属性动画执行的时长,单位是ms;
     valueFrom:属性值的起始值;
     valueTo:属性值的结束值;

     valueType:属性的类型。有"floatType","intType","colorType"可选,分别代表浮点型,整型,颜色类型;
     repeatCount:属性动画重复执行的次数;
     repeatMode:属性动画重复的模式。有"reverse","restart"可选,分别表示逆向重复,连续重复。在本例中,逆向重复是指属性值从1->0.3,然后0.3->1,如果重复次数很多,依次类推;
     startOffset:表示延迟多长时间后再执行动画效果,单位是ms;

     2.1.2接下里,使用AnimatorInflater加载该xml文件,并作用于Button对象,并启动动画,具体Java代码如下:

    private void initAnimatorByXml() {
        Button btn = (Button)findViewById(R.id.btn);

        AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.anim_set);
        animatorSet.setTarget(btn);
        animatorSet.start();
    }

     上面代码比较好理解,这里不在阐述。实现效果:1s后,在3s内使一个按钮的宽度比例从1缩写到0.3,然后重复一次动画,在3s内从0.3扩大到1;接着,按钮的背景色在3s内,由红色->绿色的变化。
      注意:属性名称"scaleX","backgroundColor"是什么,为什么不可以是"abc"呢?后面会给出解释...


     2.2,使用Java代码,实现属性动画
     与View动画一样,属性动画既可以使用xml文件,也可以使用java代码动态的实现属性动画。直接上代码:

    private void initAnimatorByJava() {
        Button btn = (Button)findViewById(R.id.btn);

        ValueAnimator objectAnimator = ObjectAnimator.ofFloat(btn, "scaleX", 1f, 0.3f);
        objectAnimator.setDuration(3000);
        objectAnimator.setRepeatCount(1);
        objectAnimator.setRepeatMode(ValueAnimator.REVERSE);

        objectAnimator.start();
    }

     前面已经讲述过ValueAnimator是ObjectAnimator的父类,两者的区别:ValueAnimator的属性动画不需要作用于具体的对象,也没有属性名称;而ObjectAnimator的属性动画需要作用于具体的对象,有具体的属性名称,完成属性值从初始值到最终值的变化。

     上述代码实现的效果:在3s内使一个按钮的宽度比例从1缩写到

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值