自定义控件三部曲之动画篇(十)——联合动画的XML实现与使用示例

前言:不畏人生,或许才能方得始终;大胆拼,大胆闯是要有一定资本的,在能力不到的时候,就只有选择忍气吞声!

相关博客:
《Android自定义控件三部曲文章索引》
:http://blog.csdn.net/harvic880925/article/details/50995268

上篇给大家讲了有关AnimatorSet的代码实现方法,这篇我们就分别来看看如何利用xml来实现ValueAnimator、ObjectAnimator和AnimatorSet;
在文章最后,将利用AnimatorSet来实现一个路径动画,效果图如下:
这里写图片描述
(这里实现的是一个动画菜单,在点击菜单按钮时,弹出各个菜单)
####一、联合动画的XML实现
在xml中对应animator总共有三个标签,分别是

<animator />:对应ValueAnimator
<objectAnimator />:对应ObjectAnimator
<set />:对应AnimatorSet

下面我们逐个来看各个标签的用法
####1、animator
#####(1)、animator所有字段及意义
下面是完整的animator所有的字段及取值范围:

<animator
    android:duration="int"
    android:valueFrom="float | int | color"
    android:valueTo="float | int | color"
    android:startOffset="int"
    android:repeatCount="int"
    android:repeatMode=["repeat" | "reverse"]
    android:valueType=["intType" | "floatType"]
    android:interpolator=["@android:interpolator/XXX"]/>
  • **android:duration:**每次动画播放的时长
  • **android:valueFrom:**初始动化值;取值范围为float,int和color,如果取值为float对应的值样式应该为89.0,取值为Int时,对应的值样式为:89;当取值为clolor时,对应的值样式为 #333333;
  • **android:valueTo:**动画结束值;取值范围同样是float,int和color这三种类型的值;
  • **android:startOffset:**动画激活延时;对应代码中的startDelay(long delay)函数;
  • **android:repeatCount:**动画重复次数
  • **android:repeatMode:**动画重复模式,取值为repeat和reverse;repeat表示正序重播,reverse表示倒序重播
  • **android:valueType:**表示参数值类型,取值为intType和floatType;与android:valueFrom、android:valueTo相对应。如果这里的取值为intType,那么android:valueFrom、android:valueTo的值也就要对应的是int类型的数值。如果这里的数值是floatType,那么android:valueFrom、android:valueTo的值也要对应的设置为float类型的值。非常注意的是,如果android:valueFrom、android:valueTo的值设置为color类型的值,那么不需要设置这个参数;
  • android:interpolator:设置加速器;有关系统加速器所对应的xml值对照表如下:
    这里写图片描述
    #####
    (2)、将xml加载到程序中

    在定义了一个xml后,我们需要将其加载到程序中,使用的方法如下:
ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(MyActivity.this,R.animator.animator);
valueAnimator.start();

通过loadAnimator将animator动画的xml文件,加载进来,根据类型进行强转。
#####(3)、简单示例
下面我们就举个例子来看看如何来使用xml生成对应的animator动画
先看看整体效果图:
这里写图片描述
在效果图中可以看到,我们生成了一个动画,动态了改变了当前控件的坐标位置。
我们先在res/animator文件夹下生成一个动画的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
          android:valueFrom="0"
          android:valueTo="300"
          android:duration="1000"
          android:valueType="intType"
          android:interpolator="@android:anim/bounce_interpolator"/>

在这里,我们将valueType设置为intType,所以对应的android:valueFrom、android:valueTo都必须是int类型的值;插值器使用bounce回弹插值器
然后看看加载到程序中过程:

ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(MyActivity.this,
       R.animator.animator);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
   
   @Override
   public void onAnimationUpdate(ValueAnimator animation) {
   
       int offset = (int)animation.getAnimatedValue();
       mTv1.layout( offset,offset,mTv1.getWidth()+offset,mTv1.getHeight() + offset);
   }
});
valueAnimator.start();

由于我们xml中根属性是<animator/>所以它对应的是ValueAnimator,所以在加载后,将其强转为valueAnimator;然后对其添加控件监听。在监听时,动态改变当前textview的位置。有关这些代码就不再细讲了,如果看到前面的文章,这段代码应该是无比熟悉的。
最后的效果就是开头时所演示的效果。
源码在文章底部给出
有关android:valueFrom、android:valueTo取值为color属性时的用法,这里就不讲了,因为在xml中使用color属性,我也不会用;尝试了下,不成功,也不想尝试了,没什么太大意义,下面我们会讲如何在objectanimator中使用color属性;
####2、objectAnimator
#####(1)字段意义及使用方法
同样,我们先来看看它的所有标签的意义:

<objectAnimator
    android:propertyName="string"
    android:duration="int"
    android:valueFrom="float | int | color"
    android:valueTo="float | int | color"
    android:startOffset="int"
    android:repeatCount="int"
    android:repeatMode=["repeat" | "reverse"]
    android:valueType=["intType" | "floatType"]
    android:interpolator=["@android:interpolator/XXX"]/>

意义:

  • **android:propertyName:**对应属性名,即ObjectAnimator所需要操作的属性名。
    其它字段的意义与animator的意义与取值是一样的,下面再重新列举一下。
  • **android:duration:**每次动画播放的时长
  • **android:valueFrom:**初始动化值;取值范围为float,int和color;
  • **android:valueTo:**动画结束值;取值范围同样是float,int和color这三种类型的值;
  • **android:startOffset:**动画激活延时;对应代码中的startDelay(long delay)函数;
  • **android:repeatCount:**动画重复次数
  • **android:repeatMode:**动画重复模式,取值为repeat和reverse;repeat表示正序重播,reverse表示倒序重播
  • **android:valueType:**表示参数值类型,取值为intType和floatType;与android:valueFrom、android:valueTo相对应。如果这里的取值为intType,那么android:valueFrom、android:valueTo的值也就要对应的是int类型的数值。如果这里的数值是floatType,那么android:valueFrom、android:valueTo的值也要对应的设置为float类型的值。非常注意的是,如果android:valueFrom、android:valueTo的值设置为color类型的值,那么不需要设置这个参数;
  • **android:interpolator:**设置加速器;

下面我们就看看如何使用:

ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(MyActivity.this,
        R.animator.object_animator);
animator.setTarget(mTv1);
animator.start();

同样是使用loadAnimator加载对应的xml动画。然后使用animator.setTarget(mTv1);绑定上动画目标。因为在xml中,没有设置目标的参数,所以我们必须通过代码将目标控件与动画绑定。
#####(2)、使用示例
我们先写一个动画的xml:

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:propertyName="TranslationY"
                android:duration="2000"
                android:valueFrom="0.0"
                android:valueTo="400.0"
                android:interpolator="@android:anim/accelerate_interpolator"
                android:valueType="floatType"
                android:repeatCount="1"
                android:repeatMode="
  • 47
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 49
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值