每日一道面试题(第7期)---Android补间动画与属性动画的区别

栏目: IOS · Android · 发布时间: 6年前

内容简介:零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无意中发现了这个补间动画是根据我们设置好的view起始形态与终止形态,通过插值器与duration(时长)自动计算出中间view的平滑变化而实现动画效果。补间动画有TranslateAnimation(平移)、ScaleAnimation(缩放)、RotateAnimation(旋转)、AlphaAnimatio(渐变)四个类,这些只是很基本的四种动画效果,如果我们需要在此基础上更为复杂的动画效果,可以继承这四个类进行装饰。

零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣。无意中发现了这个 每日一道面试题 ,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下来。所以不如把每一次的思考、理解以及别人的见解记录下来。不仅加深自己的理解,更要激励自己坚持下去。

补间动画

补间动画是根据我们设置好的view起始形态与终止形态,通过插值器与duration(时长)自动计算出中间view的平滑变化而实现动画效果。

补间动画有TranslateAnimation(平移)、ScaleAnimation(缩放)、RotateAnimation(旋转)、AlphaAnimatio(渐变)四个类,这些只是很基本的四种动画效果,如果我们需要在此基础上更为复杂的动画效果,可以继承这四个类进行装饰。

一般情况下我们都是在xml文件中定义补间动画,属性设置大致有起始值、终止值、时长(duration)、插值(interpolator,即动画的变化速度,加速、减速、匀速、抛物线速度)四个属性,四种动画效果的标签---translate、scale、rotate、alpha。具体属性设置及意义如下:

<!--平移-->
    <translate
        <!--水平方向、竖直方向初始的view位置-->
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        <!--水平方向、竖直方向终止点的view位置-->
        android:toXDelta="100%"
        android:toYDelta="100%"
        <!--动画持续时间-->
        android:duration="@integer/animation_duration"/>
    <!--缩放-->
    <scale
        <!--水平方向、竖直方向初始的view缩放大小-->
        android:fromXScale="0.5"
        android:fromYScale="0.5"
        <!--水平方向、竖直方向终止点的view缩放大小-->
        android:toXScale="1.0"
        android:toYScale="1.0"
        <!--指定缩放中心点的坐标-->
        android:pivotX="50%"
        android:pivotY="50%"
        <!--动画持续时间-->
        android:duration="@integer/animation_duration"/>
    <!--旋转-->
    <rotate
        <!--起始旋转角度-->
        android:fromDegrees="0"
        <!--终止旋转角度-->
        android:toDegrees="1800"
        <!--旋转中心点-->
        android:pivotY="50%"
        android:pivotX="50%"
        <!--动画持续时间-->
        android:duration="@integer/animation_duration"/>
    <!--渐变-->
    <alpha
        <!--起始透明度-->
        android:fromAlpha="1"
        <!--终止透明度-->
        android:toAlpha="0.5"
        <!--动画持续时间-->
        android:duration="@integer/animation_duration"/>
复制代码

java代码设置

Animation animation = AnimationUtils.loadAnimation(this, R.anim.activity_open_enter);
animation.start();
imageView.setAnimation(animation);
复制代码

属性动画

属性动画更为强大。补间动画只能自定义两个关键帧在旋转、位移、缩放、透明度四个方面的变化,而属性动画可以定义任何属性的变化。另外,补间动画只能对UI组件执行动画,但属性动画几乎可以对任何对象执行动画(不管它是否在屏幕上显示)。

属性动画有三个关键的类---ValueAnimation、ObjectAnimation、AnimationSet

ValueAnimation

属性动画主要的时间引擎,负责计算各个帧的属性值。它定义了属性动画绝大部分核心功能,包括计算各帧的属性值,负责处理更新事件、按属性类型值控制计算规则等。

ValueAnimation创建动画步骤:

  • 使用ValueAnimation的静态方法ofInt()、ofFloat、ofObject()创建ValueAnim实例。
  • 通过setXxx()设置动画持续时间、插值方式、重复次数等
  • 调用start方法启动动画
  • 上面三个步骤仅仅是计算出了各个帧的属性值,我们需要注册AnimationUpdateListener监听器,在监听器中监听ValueAnimation计算出来的值的改变,应用到指定对象上
ValueAnimator valueAnimator = ValueAnimator.ofInt(0,100);
        valueAnimator.setDuration(1000 * 3);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //获得变化的属性值
                int time = (int) animation.getAnimatedValue();
                ...//对指定对象进行属性值更新操作
        }
});
复制代码

一般来说,ValueAnimation、本身并不显示任何动画,它更像是一个数值计算器。通过ofXxx方法指定计算类型,通过steXxx方法设置计算中值的变化方式,产生一段有规律的数字,让开发者自己为指定对象动态的设置属性。

ObjectAnimation

ObjectAnim类继承了ValueAnimation类,可以直接将ValueAnimation计算出来的值应用到指定对象的指定属性上。

ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);
animator.setDuration(2000);
animator.start();
复制代码

ofFloat方法与ValueAnimation中不同的是第一个参数是执行动画的对象,第二个参数是需要操作的属性,后面是一个可变长数组,表示属性值的起始于终止值。

第二个参数需要操作的属性在第一个参数对象中需要有get和set方法。ObjectAnimation内部是通过反射机制获得set方法动态的设置对象属性。可以直接使用的的属性有:

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

AnimationSet

那么多炫酷的动画,当然不可能只是靠单一一个ObjectAnimation来实现的,这就需要多个ObjectAnimation进行组合,就需要AnimationSet类了。

AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator animator1 = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);
ObjectAnimator animator4 = ObjectAnimator.ofFloat(imageView, "translationX", 0,500);
animatorSet.play(animator1).after(animator2).with(animator3).before(animator4);
animatorSet.setDuration(2000);
animatorSet.start();
复制代码

AnimationSet的play方法表示播放当前动画,其余还有组合方法:

  • after(Animator anim) : 将现有动画插入到传入的动画之后执行。
  • after(long delay):将现有的动画延迟指定的毫秒后执行。
  • before(Animator anim):将现有的动画插入到传入的动画之前执行。
  • with(Animator anim):将现有的动画和传入的动画同时执行。
  • playSequentially(Animator... items):表示按顺序执行这些动画.
  • playTogether(Animator... items);表示这些动画一起执行.

区别

  • 属性动画在补间动画的基础上定义了更多高级的功能
  • 补间动画只能对UI组件执行动画,但属性动画几乎可以对任何对象执行动画,不管它是否显示在屏幕上
  • 最重要的一点:补间动画只是在视图层次进行了改变,对象的属性并没有改变。而属性动画是真正的改变了属性值,根据设置动态的属性值实现动画效果。一个很好的例子就是一个图片在采用补间动画进行平移后,点击平移后的图片是不会有点击事件发生,点击平移前的位置会有点击事件发生(虽然执行动画后这里看起来什么也没有)。而属性动画则会对新位置响应点击事件。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Parsing Techniques

Parsing Techniques

Dick Grune、Ceriel J.H. Jacobs / Springer / 2010-2-12 / USD 109.00

This second edition of Grune and Jacobs' brilliant work presents new developments and discoveries that have been made in the field. Parsing, also referred to as syntax analysis, has been and continues......一起来看看 《Parsing Techniques》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具