深入分析Android动画(一)

动画的分类:

①View动画

  View动画顾名思义其作用对象为View,包含平移、缩放、旋转、透明,这四类变化分别对应着Animation的子类TranlateAnimation、ScaleAnimation、RotateAnimation和AlphaAnimation。虽然有对应的类,不过,在Android动画中,还是建议用XML来定义,其对应的标签如下所示

View动画的XML描述语法的固定格式

(注:android:interpolator表示动画集合所采用的插值器,插值器影响动画的速度,默认为@android:anim/accelerate_decelerate_interpolator,即加减速插值器,关于插值器的概念将会在下面介绍

android:shareInterpolator表示集合中的动画和集合共享同一个插值器,如果集合不指定插值器,那么子动画就需要单独指定插值器或者使用默认值。)

<?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"]>
    <translate
        android:fromXDelta="float"
        android:fromYDelta="float"
        android:toXDelta="float"
        android:toYDelta="-float"
        android:duration="float"
        />
    <scale
        android:fromXScale="float"
        android:fromYScale="float"
        android:toXScale="float"
        android:toYScale="-float"
        android:duration="float"
        />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float"
        android:duration="float"
        />
    <alpha 
        android:fromAlpha="float"
        android:toAlpha="float"
        android:duration="float"
        />
    ...
</set>
    

 在使用View动画时,就不得不提View的动画坐标体系

  View动画的主体是View,更准确的说是View的副本(影子),View动画更改的只是显示,其x,y坐标仍然没有改变,响应事件的位置没有改变,也就是说view本身并没有改变。

也因此,不要使用View动画做交互性操作,例如点击。现在View动画已经很少人使用了,不过View动画简单已用,可以用来做一些简单的不需要交互的动画。

其坐标系是以View的左上角为原点,横向向右为x轴正方向,纵向向下为y轴正方向,在平移中toXDelta为正数表示以原点为参考沿x轴向右移动,相反,反之,旋转时正数角度表示顺时针

②属性动画

   属性动画是API11新加入的特性,和View动画不同,它可以对任何对象做动画,甚至还可以没有对象,动画默认时间间隔300ms,默认帧率10ms/帧。其可以达到的效果是:在一个时间间隔内完成对对象从一个属性值到另一个属性值得改变。常用属性动画类ValueAnimator、ObjectAnimator和AnimationSet,其中ObjectAnimator继承于ValueAnimator.

  代码实现

    例如改变一个对象(obj)的translationY属性,可以写为ValueAnimator.ofFloat(obj,"translationY",100);

   XML实现

    anim_property_animation.xml

 1 <set xmlns:android="http://schemas.android.com/apk/res/android"
 2      android:ordering=["sequentially"|"together"]>
 3     <objectAnimator
 4         android:propertyName="string"
 5         android:duration="int"
 6         android:valueFrom="float|int|color"
 7         android:valueTo="float|int|color"
 8         android:startOffset="int"
 9         android:repeatCount="int"
10         android:repeatMode=["restart"|"reverse"]
11         android:valueType=["colorType"|"intType"]>
12 
13     </objectAnimator>
14     <animator
15     android:duration="int"
16     android:valueFrom="float|int|color"
17     android:valueTo="float|int|color"
18     android:startOffset="int"
19     android:repeatCount="int"
20     android:repeatMode=["restart"|"reverse"]
21     android:valueType=["colorType"|"intType"]>
22         
23     </animator>
24 </set>

  在代码中使用

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.anim_property_animation);
set.setTarget(button);
set.start();

③插值器与估值器

  TimeInterpolator中文翻译为时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比。系统预置的有LinearInterpolator(线性插值器:匀速动画)、AccelerateDecelerateInterpolator(加速减速插值器:动画两头慢中间快)和DecelerateInterpolator(减速插值器:动画越来越慢)等。

  TypeEvaluator,估值器,它的作用是根据当前属性改变的百分比来计算改变后的属性值。系统预置的有IntEvaluator(针对整型属性)和FloatEvaluator(针对浮点型属性),ArgbEvaluator(针对Color属性)

④属性动画的监听器AnimatorUpdateListener和AnimatorListener

 1  public static interface AnimatorListener {
 2         /**
 3          * <p>Notifies the start of the animation.</p>
 4          *
 5          * @param animation The started animation.
 6          */
 7         void onAnimationStart(Animator animation);
 8 
 9         /**
10          * <p>Notifies the end of the animation. This callback is not invoked
11          * for animations with repeat count set to INFINITE.</p>
12          *
13          * @param animation The animation which reached its end.
14          */
15         void onAnimationEnd(Animator animation);
16 
17         /**
18          * <p>Notifies the cancellation of the animation. This callback is not invoked
19          * for animations with repeat count set to INFINITE.</p>
20          *
21          * @param animation The animation which was canceled.
22          */
23         void onAnimationCancel(Animator animation);
24 
25         /**
26          * <p>Notifies the repetition of the animation.</p>
27          *
28          * @param animation The animation which was repeated.
29          */
30         void onAnimationRepeat(Animator animation);
31     }

如上图代码所示AnimatorListener监听了动画的开始、结束、取消和重复播放,同时系统提供了AnimatorListenerAdapter适配器方便我们使用,我们可以继承这个类并有选择的实现方法。

1 public static interface AnimatorUpdateListener {
2         /**
3          * <p>Notifies the occurrence of another frame of the animation.</p>
4          *
5          * @param animation The animation which was repeated.
6          */
7         void onAnimationUpdate(ValueAnimator animation);
8 
9     }

如上图所示,AnimatorUpdateListener 监听了动画的整个过程,动画每播放一帧,onAnimationUpdate就被调用一次。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏极乐技术社区

『组件』大转盘、刮刮乐、老虎机……

组件 框架为开发者提供了一系列基础组件,开发者可以通过组合这些基础组件进行快速开发。 什么是组件: 组件是视图层的基本组成单元。 组件自带一些功能与微信风格的样...

5636
来自专栏Python

Python终端输出打印彩色字体的方法

一  实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。    转义序列是以ESC开头,即用\033来完成(ESC的A...

2415
来自专栏新工科课程建设探讨——以能源与动力工程专业为例

2.2.2 HTML标签简介

HTML(HyperText Mark-up Language)是由HTML标签嵌套和组合的描述性文本,HTML标签可以描述文本(p,div等)、表格(tabl...

1312
来自专栏everhad

android自定义控件一站式入门

Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理。 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自Vie...

2810
来自专栏黒之染开发日记

css3动画在手机端的流畅度比较

我发现即使都是用css3的transition做动画,有的属性在动画播放时却会不流畅,出现定格动画的效果,这里做个比较,方便我以后做动画。

3732
来自专栏欧阳大哥的轮子

Android中的各种Drawable类详解

图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,这样就会增加学习和使用的成本,因此系统提供了一个被称之为Draw...

1572
来自专栏7号代码

Android应用界面开发——自定义控件(实现俯卧撑计数器)

在介绍自定义控件之前,先学习一下关于尺寸(dp,sp,px)和Inflater的知识。

2033
来自专栏新工科课程建设探讨——以能源与动力工程专业为例

2.2.2 HTML标签简介

HTML(HyperText Mark-up Language)是由HTML标签嵌套和组合的描述性文本,HTML标签可以描述文本(p,div等)、表格(tabl...

1510
来自专栏闻道于事

CSS样式表基础

层叠样式表:Cascading Style Sheets,是一种用来表现HTML等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态...

2665
来自专栏happyJared

IDEA快捷键拆解系列(六):Code篇

  以下是关于Code导航项及其每一子项的拆解介绍,其中,加粗部分的选项是博主认为比较重要的。

1412

扫码关注云+社区

领取腾讯云代金券