Android中属性动画和补间动画的区别

转载:http://blog.csdn.net/wzy_1988/article/details/50587248

前言

Android属性动画和补间动画,既是日常工作中经常接触到的技术,也是面试常考的问题。 
这篇博客主要是为了介绍Android的属性动画使用,同时带着大家总结一下关于面试过程中常被面试到的动画问题。

关于补间动画,可以参考之前的博客:Android动画学习——Tween Animation


为什么引入属性动画

Android3.0之前提供的补间动画机制还算相对比较健全的,比如你的需求中只需要对View进行移动、缩放、旋转和淡入淡出的操作,那么补间动画已经足够健全了。但是,如果一旦需求超出了这四种操作,补间动画就无能为力了。 
例如,我们需要改变View的宽度,这个时候就不能通过补间动画实现。此外,补间动画还有一个最大的缺陷,就是它只是改变了View的显示效果而已,并不会真正的改变View的属性。具体来说,例如屏幕左上角有一个Button,使用补间动画将其移动到右下角,此刻你去点击右下角的Button,它是绝对不会响应点击事件的,因此其作用区域依然还在左上角。只不过是补间动画将其绘制在右下角而已。


属性动画


ObjectAnimator

ObjectAnimator是属性动画框架中最重要的实现类,创建一个ObjectAnimator只需要通过它的静态工厂类直接返回一个ObjectAnimator对象。参数包括一个对象和对象的属性名字,但这个属性必须有get和set函数,内部会通过Java反射机制来调用set函数修改对象的属性值。

我们举一个例子,在5秒内,让一个ImageView平移一段距离,代码如下:

private void startAnimator() {
    ObjectAnimator animator = ObjectAnimator.ofFloat(mImageView, "translationY", 300);
    animator.setDuration(5000);
    animator.start();
}

通过ObjectAnimator的静态工厂方法,创建一个ObjectAnimator对象。第一个参数是需要操纵的View,第二个参数则是需要操纵的属性,而最后一个参数是一个可变数组参数,需要传进去该属性变化的一个取值过程,这里只设置了一个参数,即变化到300。

在使用ObjectAnimator的时候,有一点非常重要,那就是要操纵的属性必须具有get、set方法,不然ObjectAnimator就无法生效。下面列举出一些可以直接使用的属性:

  • translationX、translationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标开始的位置。
  • rotation、rotationX、rotationY:这三个属性控制着View对象围绕它的支点进行2D和3D的旋转。
  • scaleX和scaleY:这两个属性控制着View对象围绕它的支点进行2D缩放。
  • pivotX和pivotY:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认情况下,该支点的位置就是View对象的中心点。
  • alpha:它表示View对象的alpha透明度。
  • x、y:这是两个简单的实用的属性,它描述了View对象在它的容器中最终的位置。

上面提到ObjectAnimator操作的属性必须在View中提供get和set方法,那如果我们想改变一个View的宽度,但是View中并没有提供宽度的get和set方法,那是不是我们就没有办法使用ObjectAnimator了呢?

答案当然是否定的,我们可以通过封装的机制,来为View提供一个width属性的get和set方法。示例代码如下:

import android.view.View;

public class WrapperView {
    private View mTarget;

    public WrapperView(View target) {
        this.mTarget = target;
    }

    public int getWidth() {
        return mTarget.getLayoutParams().width;
    }

    public void setWidth(int width) {
        mTarget.getLayoutParams().width = width;
        mTarget.requestLayout();
    }
}


一个简单的封装就达到了我们需要的效果,其他View没有提供get和set方法的属性大家也可以参考这种方式进行封装。


ValueAnimator

ValueAnimator是整个属性动画中最核心的一个类,前面介绍的ObjectAnimator也是继承自ValueAnimator。通过前面对ObjectAnimator的介绍,我们知道属性动画的实现机制是通过不断的地对View属性进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类负责计算的。 
它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮助我们完成从初始值平滑过渡到结束值这样的效果。 
ValueAnimator本身不提供任何动画效果,它更像一个数值发生器,用来产生具有一定规律的数字,从而让调用者来控制动画的实现过程。通常情况下,在ValueAnimator的AnimatorUpdateListener中监听数值的变化,从而完成动画的切换。 
示例代码提供了一个TextView利用ValueAnimator计时器的效果:

private void startTimeClock() {
    final ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 60);
    valueAnimator.setDuration(1000 * 60);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int time = (int) valueAnimator.getAnimatedValue();
            Log.e(TAG, "time=" + time);
            mTextView.setText(time + "");
        }
    });
    valueAnimator.start();
}

AnimatorSet

在补间动画学习时,我们知道可以利用AnimationSet将补间动画组合使用,同样的,属性动画也提供了AnimatorSet这个类来帮我们实现组合属性动画的效果。 
AnimatorSet这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ObjectAnimator或者ValueAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包含了以下四个方法:

  • after(Animator anim) : 将现有动画插入到传入的动画之后执行。
  • after(long delay):将现有的动画延迟指定的毫秒后执行。
  • before(Animator anim):将现有的动画插入到传入的动画之前执行。
  • with(Animator anim):将现有的动画和传入的动画同时执行。

有了这个方法,我们就可以完成组合动画的逻辑了。例如我们想让一个TextView先从屏幕外移动到屏幕内,然后旋转360度,同时旋转过程中进行淡入淡出的效果,就可以写出如下代码:

private void multiAnimator() {
    // 移动动画
    ObjectAnimator transAnimator = ObjectAnimator.ofFloat(mTextView, "translationX", -500f, 300f);

    // 旋转动画
    ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(mTextView, "rotation", 0f, 360f);

    // 淡入淡出
    ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mTextView, "alpha", 1f, 0f, 1f);

    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.play(rotationAnimator).with(alphaAnimator).after(transAnimator);
    animatorSet.setDuration(5000);
    animatorSet.start();
}



Animator监听器

一个完整的动画具有start、Repeat、End、Cancel四个过程,Android提供了接口,让我们能够很容易监听到这些事件。示例代码如下:

animatorSet.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
        Log.e(TAG, "onAnimationStart");
    }

    @Override
    public void onAnimationEnd(Animator animation) {
        Log.e(TAG, "onAnimationEnd");
    }

    @Override
    public void onAnimationCancel(Animator animation) {
        Log.e(TAG, "onAnimationCancel");
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
        Log.e(TAG, "onAnimationRepeat");
    }
});


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 补间动画是一种基于属性动画动画效果,它可以让视图在一段时间内平滑地从一种状态过渡到另一种状态。补间动画的实现方式比较简单,使用起来也比较灵活,可以用于实现各种动画效果。 补间动画可以对视图的位置、大小、透明度等属性进行动画效果的设置,常见的补间动画包括: 1. 透明度动画(AlphaAnimation):可以控制视图的透明度,让视图在一段时间内逐渐变得透明或不透明。 2. 位移动画(TranslateAnimation):可以控制视图在屏幕上的位置,让视图在一段时间内沿着指定的路径平移。 3. 缩放动画(ScaleAnimation):可以控制视图的大小,让视图在一段时间内逐渐变大或变小。 4. 旋转动画(RotateAnimation):可以控制视图的旋转角度,让视图在一段时间内沿着指定的轴线旋转。 使用补间动画需要先创建相应的动画对象,然后将动画对象与需要执行动画的视图进行绑定,最后启动动画。可以使用XML文件或代码来创建补间动画,下面是一个简单的代码示例: ```java // 创建透明度动画对象 AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f); // 设置动画持续时间 alphaAnimation.setDuration(1000); // 设置动画重复次数 alphaAnimation.setRepeatCount(Animation.INFINITE); // 设置动画模式 alphaAnimation.setRepeatMode(Animation.REVERSE); // 将动画对象与视图进行绑定 view.startAnimation(alphaAnimation); ``` 在这个示例,我们创建了一个透明度动画对象,设置了动画持续时间为1000毫秒,重复次数为无限次,模式为反转模式,然后将动画对象与视图进行绑定,最后启动动画。这样就可以让视图在一段时间内逐渐变得透明或不透明,并且重复执行动画效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值