专栏首页Android中高级开发深入分析Android动画(一)

深入分析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 条评论
登录 后参与评论

相关文章

  • Android开发之漫漫长途 番外篇——自定义View的各种姿势1

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

    LoveWFan
  • Android开发之漫漫长途 XVII——动画

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

    LoveWFan
  • Android开发之漫漫长途 Ⅲ——Activity的显示之Window和View(2)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

    LoveWFan
  • android开发_mp3_player音乐播放器

    ============================================

    Hongten
  • Android开发(35) 使用android_serialport_api 操作串口斑马打印机

    使用安卓设备操作串口的问题。 我找到一个框架:android_serialport_api,这个框架被托管在:

    zhangyunfeiVir
  • Android使用内容提供者实现增删改查操作

    这里需要建立两个项目:SiYouShuJuKu(使用内容提供者暴露相关的操作),DQDYGApplication(使用内容解析者对第一个应用进行相关的解析)

    Dream城堡
  • android蓝牙测试

    注意点:在执行getBondedDevices时候会花费一点时间,一开始我不知道,“已配对”一直没出现,以为出错了。后来上了趟厕所回来发现就有了!!!!尴尬!

    提莫队长
  • 读取联系人

    Dream城堡
  • Android微信之简单文本分享(ShareSDK-Android Studio)

    ShareSDK的官方关于Android Studio的整合写的比较乱,整合的时候遇到了一些坑,自己总结下。

    专注APP开发
  • android 3d页面跳转

    py3study

扫码关注云+社区

领取腾讯云代金券