在看动画相关的代码的时候看到过 anim,animator 目录,资源文件中的有 <set> 作为根节点的,也有 <animate-list> 作为根节点的。虽然知道它们这是跟动画有关的,但是却不知道在代码中应该怎么使用它们而且也不知道还可以怎么写。所以这篇博客是对 Android 中的 3 种动画进行一次 “鸟瞰”,对它们进行一次梳理。

本博客中的内容来自:
https://developer.android.com/guide/topics/resources/animation-resource.html
https://developer.android.com/guide/topics/graphics/view-animation.html
https://developer.android.com/guide/topics/graphics/drawable-animation.html
https://developer.android.com/guide/topics/graphics/prop-animation.html

概述

Android 将动画分成了两大类:

  • 属性动画(Property Animation)
  • View 动画(View Animation)

View 动画又分成了两类:补间动画(Tween Animation)跟帧动画(Frame Animation)。

属性动画

基类: Animator
资源文件所在路径: res/animator/filename.xml
语法:

<setandroid:ordering=["together" | "sequentially"]><objectAnimatorandroid:propertyName="string"android:duration="int"android:valueFrom="float | int | color"android:valueTo="float | int | color"android:startOffset="int"android:repeatCount="int"android:repeatMode=["repeat" | "reverse"]android:valueType=["intType" | "floatType"]/><animatorandroid:duration="int"android:valueFrom="float | int | color"android:valueTo="float | int | color"android:startOffset="int"android:repeatCount="int"android:repeatMode=["repeat" | "reverse"]android:valueType=["intType" | "floatType"]/><set>...</set>
</set>

根节点只能是 <set>,<objectAnimator>, 或者 <animator><set> 中可以嵌套 <set>
这三种类型分别对应的类为:AnimatorSet,ObjectAnimator 跟 ValueAnimator 。

应用动画:

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,R.anim.property_animator);
set.setTarget(myObject);
set.start();

插值器: TimeInterpolator

ViewPropertyAnimator

为了更加方便的使用属性动画,Android 提供了该类。该类可以对 View 的多个属性同时进行动画操作。
相较于 ObjectAnimator,使用该类更加简洁,可读性更高,而且在涉及到多个属性时比前者的效率更高。
下面举个例子,同时移动 View 的 x 跟 y 轴坐标:

使用多个 ObjectAnimator 实现:

ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f);
ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.playTogether(animX, animY);
animSetXY.start();

使用一个 ObjectAnimator 实现:

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();

使用 ViewPropertyAnimator 实现:

myView.animate().x(50f).y(100f);

补间动画

基类: Animation
资源文件所在路径: res/anim/filename.xml
语法:

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

根节点只能是 <alpha>, <scale>, <translate>, <rotate>, 或者 <set><set> 中可以嵌套 <set>
分别对应的类型为 XxxAnimation 跟 AnimationSet 。补间动画提供的动画很有限,只有上面这几种。

插值器: Interpolator
因为 Interpolator 继承自 TimeInterpolator,所以补间动画中提供的插值器也可以在属性动画中使用。

设置插值器的值:
Android 内置了多个插值器,有些插值器提供了一些属性,在使用它们的时候可以给这些属性进行赋值。比如 AccelerateInterpolator 提供了 factor 属性;cycleInterpolator 提供了 cycles 属性。

首先在 res/anim/ 目录下创建 xml 文件
语法如下:

<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"android:attribute_name="value"/>

需要注意的是,插值器的名称开头首字母必须为小写。
举个栗子:

<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"android:tension="7.0"/>

小贴士:

有时候 AS 的代码提示功能并不能提示出插值器中有哪些属性,这时候就可以这样做:
1. 打开系统的 attrs.xml 文件
2. 搜索要使用的插值器的名字
这时候就可以看到该插值器提供的所有属性了。

应用动画:

ImageView image = (ImageView) findViewById(R.id.image);
Animation animation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(animation);

调用 startAnimation() 会立刻执行动画,可以调用 Animation 的 setStartTime() 来设置动画的开始时间,然后在调用 View 的 setAnimation() 来添加动画。

帧动画

基类: AnimationDrawable
资源文件所在路径: res/drawable/filename.xml
语法:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot=["true" | "false"] ><item
      android:drawable="@[package:]drawable/drawable_resource_name"android:duration="integer" />
</animation-list>

根节点必须为 <animation-list>,包含一个或者多个 <item>
onshot 为 true 表示动画只播放一次。
item 中的 drawable 属性表示该帧要显示的图像,duration 属性表示该帧显示的时间

应用动画:

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();

如果想要在 Activity 启动以后就立刻显示动画,不要在 onCreate() 中执行,因为此时 AnimationDrawable 还没有完全的绑定到 Window 中。正确的做法是在 onWindowFocusChanged() 方法中开启动画。

下面给出一个完整的栗子:
先来看看效果图:

首先需要图片资源


先将它们放置到 drawable 目录下,依次命名为 run1,run2,run3
然后在 drawable 目录下新建一个 xml 文件,命名为 run.xml:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false"><item android:drawable="@drawable/run1" android:duration="100"/><item android:drawable="@drawable/run2" android:duration="100"/><item android:drawable="@drawable/run3" android:duration="100"/></animation-list>

然后编写布局文件,修改 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><ImageView
        android:id="@+id/image"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

很简单,只有一个 ImageView 。
最后就是让他动起来,修改 MainActivity.java

public class MainActivity extends AppCompatActivity {private ImageView mImageView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mImageView = (ImageView) findViewById(R.id.image);mImageView.setBackgroundResource(R.drawable.run);}@Overridepublic void onWindowFocusChanged(boolean hasFocus) {if (hasFocus) {((AnimationDrawable) mImageView.getBackground()).start();} else {((AnimationDrawable) mImageView.getBackground()).stop();}}
}

属性动画跟 View 动画的比较

  1. View 动画只能用在 View 上,并且支持的操作很少,只有 scale,translate,rotate 跟 alpha 这 4 种。而属性动画可以作用在任意一个对象的任意一个属性上。
  2. View 动画并没有改变 View 的属性,比如使用 View 动画将 View 从 A 点 移动到了 B 点以后,实际上 View 还是位于 A 点,B 点只是它的 “影子” 而已。如果这时候去点击 B 点处的 View 是没有任何反应的。而使用属性动画就会真实的改变 View 属性。
  3. View 动画相比起属性动画,使用起来会简单一些。如果 View 动画已经可以满足需求则没有必要使用属性动画。最好的方式就是根据不同的场景选择适合的动画。

Android 三种动画的总结相关推荐

  1. Android 三种动画 (帧动画 、补间动画、属性动画)

    1.帧动画 帧动画是依次展示n张静态图片,造成动画的错觉,类似看视频一样. 使用方式 在drawable目录下定义XML文件,根节点为animation-list,然后放入定义更好的图片 onesho ...

  2. Android -- 三种动画(帧动画、View动画、属性动画)

    Android的动画分为了三种, 分别是 帧动画.View动画.属性动画 一:帧动画 帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放. 帧动画的使用很简单,总 ...

  3. android三种动画的区别,TranslateAnimation详解

    Android JDK为我们提供了4种动画效果,分别是: AlphaAnimation,RotateAnimation, ScaleAnimation, TranslateAnimation.今天我想 ...

  4. Android开发—三种动画实现原理及使用

    Android动画目前分为三种: Frame Animation 帧动画,通过顺序播放一系列图像从而产生动画效果,.图片过多时容易造成OOM(Out Of Memory内存用完)异常. Tween A ...

  5. Android的三种动画详解(帧动画、View动画、属性动画)

    Android的动画分为了三种, 分别是 帧动画.View动画.属性动画. 1.帧动画 帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放. 帧动画的使用很简单, ...

  6. android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码

    Android精选源码 Android百种动画效果定制的侧滑菜单库 android实现仿qq身边的人 android底部导航,动画切换效果 android强大的TextView效果 Android精美 ...

  7. 19.React Native动画Animated效果三种动画类型二;

    目录 1.介绍 2.Animated.decay() 2.1方法 2.1.1value参数值 2.1.2config参数有以下这些属性: 2.2示例-执行缩放 2.2.1初始化缩放值 2.2.2绑定缩 ...

  8. android圆形点击效果,Android 三种方式实现自定义圆形页面加载中效果的进度条

    [实例简介] Android 三种方式实现自定义圆形页面加载中效果的进度条 [实例截图] [核心代码] ad376a86-a9aa-49bc-8cea-321bcff2c0c3 └── AnimRou ...

  9. Android的三种动画

    Android动画详解 帧动画 补间动画 属性动画 帧动画   所谓帧动画其实很好理解,就是通过在一定的时间间隔内,将一组图片顺序播放出来,从而打到动画的效果,我们通过简单的帧动画例子来说明一下.   ...

最新文章

  1. C - Catch That Cow POJ - 3278
  2. html的高度自适应,CSS布局自适应高度解决方法
  3. C++对象的内存分析(5)
  4. python考试pass or fail_python-pytest学习(十二)-标记失败xfail
  5. mysql5.6.22编译安装教程_Linux CentOS6.0下编译安装MySQL 5.6.22
  6. IPSec隧道配置案例(手动模式)
  7. 《zabbix中文支持》-4
  8. sax解析xml案例一
  9. ftp 上传文件夹_8uftp上传工具,8uftp上传工具的使用方法
  10. mac remix导入本地项目
  11. 建议电脑电源标准逐步去掉-12V、3.3V
  12. 虚幻引擎插件 - Maya LiveLink - 安装和使用
  13. PDF有限制不能编辑怎么办?
  14. 谷歌翻译影响vue_[Vue源码分析]谷歌翻译后,Vue双向数据绑定失效了?
  15. oracle工程师 的职业,数据库工程师的职业规划
  16. TeamViewer的安装和使用方法
  17. 有没有集工作记录、项目时间线于一身的便签软件?
  18. mac 锤子android助手,Mac+Android好帮手 锤子SmartFinder
  19. 深入理解设计模式-抽象工厂模式
  20. 微博下载|微博app下载

热门文章

  1. 法国访问学者签证办理经验
  2. Java中如何大小写字母进行转换(ASCII编码)
  3. Jenkins 之 单节点 对接GitHub搭建自动化部署项目环境 与 实战测试 (三)
  4. android app bundle Split APKs
  5. 零维系统热自燃问题求解
  6. 虚拟机桥接网段与本机不一致
  7. ArcGIS And ENVI:如何进行植被指数的提取并制作成专题地图?
  8. HDP2.5更换集群IP
  9. 聚类算法评价指标之DBI指数及Python实现
  10. Node.js Web开发_设置Node.js(1)