补间动画也叫View动画,它只能针对View进行动画操作,且补间动画操作的只是View中可见的部分,即只操作界面,对于可点击区域等都不会进行操作。

  在Android中,补间动画的顶级类是Animation。补间动画包括对View的透明度、缩放、平移、旋转进行动画操作,对应的JAVA类分别是AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation。

  Android还提供了一个动画集合AnimationSet,可以将多个动画单体放入集合中共同进行,集合中的多个动画可以选择共享一套动画差值器和执行时间。

  本文将从两个角度介绍补间动画,第一是从补间动画的基本使用介绍,第二是介绍补间动画在实际开发中的其他应用,包括用于指定ViewGroup中View的动画的LayoutAnimation、用于控制Activity切换效果的动画等。

基本使用介绍

  补间动画可以写在XML文件中,也可以写在JAVA文件中,但官方推荐写在XML文件中,因为XML格式更加易于阅读。

  在补间动画的XML表示法中,我们可以使用<alpha>、<scale>、<translate>、<rotate>分别表示四种动画,也可以使用<set>标签表示一个动画集合。下面是一个包括所有属性的补间动画XML文件描述的示例,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillAfter="true"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:shareInterpolator="true"> <alpha
android:fromAlpha="0%"
android:toAlpha="100%" /> <scale
android:fromXScale="100%"
android:fromYScale="100%"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="200%"
android:toYScale="200%" /> <translate
android:fromXDelta="0%"
android:fromYDelta="0%"
android:toXDelta="100%"
android:toYDelta="100%" /> <rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" /> </set>

  上述代码中各个属性的详细解释如下:

android:interpolator:差值器,用来控制动画的速度
BounceInterpolator:弹跳效果;
AccelerateInterpolator:逐渐加速;
DecelerateInterpolator:逐渐减速;
AccelerateDecelerateInterpolator:先加速后减速;
OvershootInterpolator:到达目标点时“跑过头了”,再返回到目标点;
AnticipateInterpolator:移动之前先向后“助跑”;
AnticipateOvershootInterpolator:OvershootInterpolator和AnticipateInterpolator的组合效果;
CycleInterpolator:对于指定的动画,正向做一遍,反响做一遍
android:shareInterpolator:<set>标签中的动画是否共享差值器
android:duration:动画集合播放时间
android:fillAfter:动画结束后是否停留在最后的状态
<alpha>:透明度动画
android:fromAlpha:动画开始时候的透明度
android:toAlpha:动画结束时候的透明度
<scale>:缩放动画
android:fromXScale:动画开始时候X轴的缩放倍数
android:fromYScale:动画开始时候Y轴的缩放倍数
android:pivotX:缩放中心点X坐标
android:pivotY:缩放中心点Y坐标
android:toXScale:动画结束时候X轴的缩放倍数
android:toYScale:动画结束时候Y轴的缩放倍数
<translate>:平移动画
android:fromXDelta:动画开始时候X轴的坐标位置
android:fromYDelta:动画开始时候Y轴的坐标位置
android:toXDelta:动画结束时候X轴的坐标位置
android:toYDelta:动画结束时候Y轴的坐标位置
<rotate>:旋转动画
android:fromDegrees:动画开始时候的角度
android:toDegrees:动画结束时候的角度
android:pivotX:旋转中心点的X坐标
android:pivotY:旋转中心点的Y坐标

  除了使用XML格式编写动画代码,还可以在JAVA代码中编写动画代码,此时就需要用到AnimationSet、AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation这几个类了。下面是一个使用JAVA代码编写动画的代码:

AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, 0.5f, 0.5f);
TranslateAnimation translateAnimation = new TranslateAnimation(0.0f, 500.0f, 0.0f, 500.0f);
RotateAnimation rotateAnimation = new RotateAnimation(0.0f, 360.0f, 0.5f, 0.5f); AnimationSet set = new AnimationSet(true);
set.setDuration(1000);
set.addAnimation(alphaAnimation);
set.addAnimation(scaleAnimation);
set.addAnimation(translateAnimation);
set.addAnimation(rotateAnimation);
set.start();

其他使用方法

  上一章节中介绍了补间动画Animation的基本使用,这个章节将介绍补间动画的一些其他的使用方法。

LayoutAnimation

  LayoutAnimation用于统一地控制ViewGroup中每个View的动画效果,还可以控制每个View动画之间的间隔,达到依次入场的效果。例如,在下面的例子中,我们将控制一个ListView中所有Item的入场动画,达到所有Item依次入场的效果。

  ListView中有一个属性: android:layoutAnimation ,这个属性用于控制ListView作为一个ViewGroup,其内所有Item的动画。layout文件中ListView的布局代码如下:

<ListView
android:id="@+id/animate_main_lv_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@android:color/transparent"
android:divider="@android:color/darker_gray"
android:dividerHeight="1.0dip"
android:layoutAnimation="@anim/anim_layout_listview"
android:scrollbars="none" />

  我们需要新建一个动画文件anim_layout_listview.xml,在这个文件中编写LayoutAnimation,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/anim_item_listview"
android:animationOrder="normal"
android:delay="50%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator" />

  上述代码中各个属性的详细解释如下:

android:animation:每个Item都执行的动画
android:animationOrder:各Item的动画执行顺序,分为normal顺序、reverse逆序、random随机
android:delay:各Item之间的动画间隔,百分比,表示Item动画时长的百分比
android:interpolator:动画差值器

  我们还需要创建另一个动画文件anim_item_listview.xml,用于表示每个Item的动画,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fillAfter="true"
android:shareInterpolator="true"> <alpha
android:fromAlpha="0.1"
android:toAlpha="1.0" /> <translate
android:fromXDelta="500"
android:toXDelta="0" /> </set>

  每个Item都从透明都不透明,从右侧平移到左侧,且上下两个Item之间的动画间隔250ms(500ms * 50%)。

Activity切换动画

  Activity的切换动画一般需要四个动画,分别表示新Activity进入时候的动画、旧Activity退出时候的动画、新Activity退出时候的动画、旧Activity进入时候的动画,因此,本例中分别使用anim_activity_new_in.xml、anim_activity_new_out.xml、anim_activity_old_in.xml、anim_activity_old_out.xml四个动画文件表示。

  Activity的切换动画也有两种方式来控制,分别是通过JAVA代码控制和通过XML代码来配置。

  首先介绍使用JAVA代码控制的方式,先来看代码:

Intent intent = new Intent(context, NextActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.anim_activity_new_in, R.anim.anim_activity_old_out);

  可以看到,直接使用 overridePendingTransition() 方法来控制即可,在方法中设置两个参数,分别是新Activity进入和旧Activity退出的动画资源ID,通过这一行代码,就可以简单地实现Activity之间的切换动画。需要注意的是,这个方法必须在startActivity()方法或finish()方法之后调用,否则无效。

  上面这种方法只能控制单个Activity的切换动画,不能控制全局所有Activity的切换动画。如果想要控制项目中所有Activity的切换动画,就需要用到第二种方式:XML配置方式。

  在XML配置方式中,我们既可以控制所有Activity的切换动画,也可以控制单个Activity的切换动画,只需要选择在<application>总标签中或某个特定的<activity>标签中配置 android:theme 属性即可。android:theme属性指定了一个XML文件,下面贴出一个示例中的XML代码:

<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowAnimationStyle">@style/activityAnimation</item>
</style> <style name="activityAnimation" parent="@android:style/Animation">
<item name="android:activityCloseEnterAnimation">@anim/anim_activity_old_in</item>
<item name="android:activityCloseExitAnimation">@anim/anim_activity_old_out</item>
<item name="android:activityOpenEnterAnimation">@anim/anim_activity_new_in</item>
<item name="android:activityOpenExitAnimation">@anim/anim_activity_new_out</item>
</style>

  可以看到,在AppTheme中设置了 android:windowAnimationStyle 属性指定Activity切换的四种动画,然后在下面引用了这四种动画。这样就配置好了项目中所有Activity的切换动画。

【Android - 进阶】之Animation补间动画的更多相关文章

  1. Android中四种补间动画的使用示例(附代码下载)

    场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程 ...

  2. Android开发实战之补间动画和属性动画

    说起动画,其实一点也不陌生,在使用一款app的时候为了优化用户体验,多多少少的,都会加入动画. 安卓中的动画,分为两大类:补间动画和属性动画.本篇博文会详细介绍总结这两大动画,希望本篇博文对你的学习和 ...

  3. Android开发之Tween(补间动画)

    在android中动画主要有三种,①帧动画(http://blog.csdn.net/dmk877/article/details/45893017)这篇文章已经详细的进行了讲解,②补间动画这也是这篇 ...

  4. Android开发UI之补间动画-Tween Animation

    Tween Animation-补间动画 官网链接-http://developer.android.com/reference/android/view/animation/Animation.ht ...

  5. Android开发UI之补间动画-布局添加动画

    布局添加动画 使用步骤: 1.获取到布局的id RelativeLayout ly=(RelativeLayout)findViewById(R.id.layout); 2.设置动画样式 ScaleA ...

  6. Android Animation动画详解(一): 补间动画

    前言 你有没有被一些APP中惊艳的动画效果震撼过,有没有去思考,甚至研究过这些动画是如何实现的呢? 啥?你没有思考,更没有研究过? 好吧,那跟着我一起来学习下如何去实现APP中那些让我们惊羡的动画特效 ...

  7. Android基础笔记(十)- 帧动画、补间动画具体解释、对话框

    帧动画 补间动画Tween Animation 对话框以及面试中的注意点 帧动画 帧动画非常easy,我们首先看一下Google官方解释This is a traditional animation ...

  8. android104 帧动画,补间动画,属性动画

    ##帧动画FrameAnimation* 多张图片快速切换,形成动画效果* 帧动画使用xml定义 package com.itheima.frameanimation; import android. ...

  9. Android--Tween补间动画

    前言 Android除了支持逐帧动画之外,也提供了对补间动画的支持,补间动画就是指开发人员只需要指定动画的开始.动画结束的"关键帧",而动画变化的"中间帧"由系 ...

随机推荐

  1. Java线程池ThreadPoolExecutor初略探索

    在操作系统中,线程是一个非常重要的资源,频繁创建和销毁大量线程会大大降低系统性能.Java线程池原理类似于数据库连接池,目的就是帮助我们实现线程复用,减少频繁创建和销毁线程 ThreadPoolExe ...

  2. 如何获取比 dism.log 更详细的日志

    正文 在工作中,曾经遇到过一个问题. 有一个 component,名字叫做 Oxford Adaptive Learning Dictionary,是一款牛津词典的应用.这个 component,需要 ...

  3. Unity4-用户输入

    Input是一个类,可以接收用户的输入 使用AddComponentMenu("Demo1/InputTest1"),将脚本加入到工程中. //例子: void Update() ...

  4. 【java基础】程序员你真的理解反射机制吗?

    目录 前言 1.反射的概述 2.正式使用反射之前很有必要了解的Class类 3.反射的使用 前言 很多讲解反射的博客文章并没有详细讲解Class类,~当然包括之前的我也一样~,这样的文章只会让反射徒有 ...

  5. 第5天,python之路

    已经过了两三天了,东西一点没来写,今天慢慢的写吧. 还是会按Alex Li的流程来学习,编写     写出自己的东西 常用的数据类型 简单的有,str ,int , 常用的:  列表list[], 字 ...

  6. [转载]2.4 UiPath循环活动While的介绍和使用

    一.While循环的介绍 先判断条件是否满足, 如果满足, 再执行循环体, 直到判断条件不满足, 则跳出循环 二.While循环在UiPath中的使用 1. 打开设计器,在设计库中新建一个Flowch ...

  7. 小白学 Python(22):time 和 calendar 模块简单使用

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  8. [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询

    此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper 支持.net framework4.5.1 ...

  9. 解决vuex的数据刷新(F5)后会被初始化的问题

    介绍一个vuex的数据刷新(F5)后会被初始化的问题处理的插件:vuex-localstorage 实现的原理大概就是监听浏览器的刷新,关闭事件,把vuex的值存储到本地localstorage,刷新 ...

  10. 【idea】高德地图可以关爱一下高个汽车

    现状:1.交通事故时不时能看到大卡车,双层巴士在城市里限高区域时的车祸 原因分析:1.司机对路况不熟,驶入新的限高路,造成事故2.司机对车况不熟,临时换的车驾驶,忘记车高的变化3.司机路况车况都熟,道 ...