Android的动画分为了三种, 分别是 帧动画、View动画、属性动画

一:帧动画

帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放。
帧动画的使用很简单,总共就两个步骤:
1、在res/drawable目录下定义一个XML文件,根节点为系统提供的animation-list,然后放入定义更好的图片;
2、使用AnimationDrawable类播放第一步定义好的Drawable中的图片,形成动画效果;
代码示例,第一步,创建Drawable文件:

<?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/image01" android:duration="500"/><item android:drawable="@drawable/image02" android:duration="500"/><item android:drawable="@drawable/image03" android:duration="500"/>
</animation-list>

上述xml中,有些属性我们要了解到:
1、android:oneshot=“false”: 表示是否重复播放动画,还是只播放一次;
2、每个item都有Drawable和duration属性,Drawable表示我们要播放的图片;duration表示这张图播放的时间;

代码示例,第二步,用AnimationDrawable播放动画:

    Button button = (Button) findViewById(R.id.bt_001);button.setBackgroundResource(R.drawable.frame_animation);//把Drawable设置为button的背景//拿到这个我们定义的Drawable,实际也就是AnimationDrawableAnimationDrawable animationDrawable = (AnimationDrawable) button.getBackground();animationDrawable.start();//开启动画

实际上,从名字也可以看出,AnimationDrawable是一个Drawable的子类,所以我们定义的xml文件也是防在res/rawable目录下的

二:View动画(也称补间动画)

2.1:View动画简介

view动画也称为补间动画,因为我们只需要拿到一个view,设定它开始和结束的位置,中间的view会自动由系统补齐,而不需要帧动画每一幅图都是提前准备好的。

View动画是Android一开始就提供的比较原始的动画,主要支持四种效果:平移、缩放、旋转、透明度变化(渐变) 四种基本效果,我们可以再这四种基础效果的基础上,选择其中的几种进行组合。

View动画的四种基本效果对应了四个Animation的子类,如下:

名称 标签 子类 效果
平移动画 TranslateAnimation 移动View
缩放动画 ScaleAnimation 放大缩小View
旋转动画 RotateAnimation 旋转View
透明度动画 AlphaAnimation 改变View透明度

比如创建一个平移动画translate_animation.xml, 也是需要把xml文件放在res/anim目录下:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:fromXDelta="100"android:fromYDelta="0"android:toXDelta="0"android:toYDelta="0"/>

scale_animation.xml : (pivotX和pivotY表示以缩放中心的位置。)

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:fromXScale="0.0"android:fromYScale="0.0"android:pivotX="50%"android:pivotY="50%"android:toXScale="1.0"android:toYScale="1.0"/>

rotate_animation.xml:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"android:fromDegree="0"android:toDegree="1800"android:pivotX = "50%"android:pivotY="50%"android:duration = "3000"/>

渐变动画alpha_animation.xml:(interpolator表示动画插值器, 可以控制动画的变化速率, 比如前200ms很慢,中间600ms很快,最后200ms又很慢。)

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:fromAlpha="1.0"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:toAlpha="0.0" />

pivot 这个属性主要是在translate 和 scale 动画中,这两种动画都牵扯到view 的“物理位置“发生变化,所以需要一个参考点。 而pivotX和pivotY就共同决定了这个点;它的值可以是float或者是百分比数值。

以 pivotX 为例,说明其取不同的值的含义:
10:距离动画所在view自身左边缘10像素
10% :距离动画所在view自身左边缘 的距离是整个view宽度的10%
10%p:距离动画所在view父控件左边缘的距离是整个view宽度的10%

除了用xml来设置View动画,也可以用代码直接搞定,如

Animation translateAnimation = new TranslateAnimation(0,500,0,500);// 创建平移动画的对象:平移动画对应的Animation子类为TranslateAnimation// 参数分别是:// 1. fromXDelta :视图在水平方向x 移动的起始值// 2. toXDelta :视图在水平方向x 移动的结束值// 3. fromYDelta :视图在竖直方向y 移动的起始值// 4. toYDelta:视图在竖直方向y 移动的结束值translateAnimation.setDuration(3000);// 播放动画直接 startAnimation(translateAnimation)//如:mButton.startAnimation(translateAnimation);

其他几个动画也类似,就不一一例举,看构造方法即可。


2.2:View动画的组合动画–AnimationSet

我们可以使用AnimationSet把View动画的平移、缩放、旋转、渐变都揉在一起,也是既能通过代码实现,也可以通过xml实现

xml实现:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"><scaleandroid:duration="3000"android:fromXScale="0.0"android:fromYScale="0.0"android:pivotX="50%"android:pivotY="50%"android:toXScale="1.0"android:toYScale="1.0"/><alphaandroid:duration="3000"android:fromAlpha="1.0"android:toAlpha="0.5" /><rotateandroid:fromDegrees="0"android:toDegrees="720"android:pivotX = "50%"android:pivotY="50%"android:duration = "3000" /><translateandroid:fromXDelta="0"android:toXDelta="100"android:fromYDelta="0"android:toYDelta="100" />
</set>

代码实现:

    AnimationSet setAnimation = new AnimationSet(true);// 特别说明以下情况// 因为在下面的旋转动画设置了无限循环(RepeatCount = INFINITE)// 所以动画不会结束,而是无限循环// 所以组合动画的下面两行设置是无效的, 以后设置的为准setAnimation.setRepeatMode(Animation.RESTART);setAnimation.setRepeatCount(1);// 设置了循环一次,但无效// 旋转动画Animation rotate = new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);rotate.setDuration(1000);rotate.setRepeatMode(Animation.RESTART);rotate.setRepeatCount(Animation.INFINITE);// 平移动画Animation translate = new TranslateAnimation(TranslateAnimation.RELATIVE_TO_PARENT,-0.5f,TranslateAnimation.RELATIVE_TO_PARENT,0.5f,TranslateAnimation.RELATIVE_TO_SELF,0,TranslateAnimation.RELATIVE_TO_SELF,0);translate.setDuration(10000);// 透明度动画Animation alpha = new AlphaAnimation(1,0);alpha.setDuration(3000);alpha.setStartOffset(7000);// 缩放动画Animation scale1 = new ScaleAnimation(1,0.5f,1,0.5f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);scale1.setDuration(1000);scale1.setStartOffset(4000);// 将创建的子动画添加到组合动画里setAnimation.addAnimation(alpha);setAnimation.addAnimation(rotate);setAnimation.addAnimation(translate);setAnimation.addAnimation(scale1);// 使用mButton.startAnimation(setAnimation);

2.3:View动画的使用场景

  • 场景一:LayoutAnimation

LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,然后,当它的子元素出场时都会具有这种效果。这种效果常用与ListView,有的ListView的每个item都以一定的动画形式出现,就是用到的LayoutAnimation。

LayoutAnimation也是一个View动画, 使用方式有三步:
1、定义LayoutAnimation的xml文件;
2、指定具体的入场动画;
3、为ViewGroup指定android:layoutAnimation属性,引用这个LayoutAnimation的xml文件;
第一步,定义LayoutAnimation的xml文件:(其中animationOrder有三种选项: normal、reverse、random。)

// res/anim/anim_layout.xml
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/anim_item"/>

第二步,指定具体动画,也就是第一步中引用的anim_item:

// res/anim/anim_item.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"android:duration="300"android:interpolator="@android:anim/accelerate_interpolator"android:shareInterpolator="true" ><alphaandroid:fromAlpha="0.0"android:toAlpha="1.0" /><translateandroid:fromXDelta="500"android:toXDelta="0" />
</set>

第三步,为ViewGroup指定android:layoutAnimation属性:

<ListViewandroid:id="@+id/list"android:layout_width="match_parent"android:layout_height="match_parent"android:layoutAnimation="@anim/anim_layout"android:background="#fff4f7f9"android:cacheColorHint="#00000000"android:divider="#dddbdb"android:dividerHeight="1.0px"android:listSelector="@android:color/transparent" />
  • 场景二:Activity的切换效果

Activity有默认的切换效果,但是我们可以定制,主要用到overridePendingTransition(int enterAnima, int exitAnima)这个方法:

Intent intent = new Intent(this,TestActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);

注意, 这个方法必须在startActivity或者finish方法之后调用才会生效。

  • 场景三:Fragment的切换效果

可以使用FragmentTransaction的setCustomAnimation方法添加切换动画。


2.4:动画的监听

Animation.addListener(new AnimatorListener() {@Overridepublic void onAnimationStart(Animation animation) {//动画开始时执行}@Overridepublic void onAnimationRepeat(Animation animation) {//动画重复时执行}@Overridepublic void onAnimationCancel()(Animation animation) {//动画取消时执行}@Overridepublic void onAnimationEnd(Animation animation) {//动画结束时执行}});

三:属性动画

属性动画可以看作是增强版的补间动画,与补间动画的不同之处体现在:
补间动画只能定义两个关键帧在透明、旋转、位移和倾斜这四个属性的变换,但是属性动画可以定义任何属性的变化。
补间动画只能对 UI 组件执行动画,但属性动画可以对任何对象执行动画。

与补间动画类似的是,属性动画也需要定义几个方面的属性:
动画持续时间。默认为 300ms,可以通过 android:duration 属性指定。
动画插值方式。通过 android:interploator 指定。
动画重复次数。通过 android:repeatCount 指定。
重复行为。通过 android:repeatMode 指定。
动画集。在属性资源文件中通过 <set …/> 来组合。
帧刷新率。指定多长时间播放一帧。默认为 10 ms。

属性动画 API

API 作用
Animator 提供创建属性动画的基类,基本不会直接使用这个类。
ValueAnimator 属性动画用到的主要的时间引擎,负责计算各个帧的属性值,基本上其他属性动画都会直接或间接继承它;
ObjectAnimator ValueAnimator 的子类,对指定对象的属性执行动画。
AnimatorSet Animator 的子类,用于组合多个 Animator。

除了这些 API,属性动画还提供了一个 Evaluator ,用来控制属性动画如何计算属性值。
IntEvaluator:计算 int 类型属性值的计算器。
FloatEvaluator: 用于计算 float 类型属性值的计算器。
ArgbEvaluator: 用于计算十六进制形式表示的颜色值的计算器。
TypeEvaluator: 可以自定义计算器。

使用 ValueAnimator 创建动画的步骤:
调用 ValueAnimator 的 ofInt()、ofFloat() 或者 ofObject() 静态方法创建 ValueAnimator 实例。
调用 ValueAnimator 的 setXxx() 等方法设置持续时间,插值方式、重复次数等。
调用 ValueAnimator 的 start() 方法启动动画。
为 ValueAnimator 注册 AnimatorUpdateListener 监听器,在该监听器中可以监听 ValueAnimator 计算出来的值改变,并将这些值应用到指定对象上。

属性动画的一般使用:
定义属性动画和补间动画等类似,有两种方式:
使用 ValueAnimator 或者 ObjectAnimator 的静态工厂方法创建动画。
使用资源文件来定义动画。

属性动画的使用:
创建 ValueAnimator 或 ObjectAnimator 对象 —— 即可以从 XML 资源文件加载该动画也可以直接调用 ValueAnimator 或者 ObjectAnimator 的静态工厂方法创建动画。
根据需要为 Animator 对象设置属性。
如果需要监听 Animator 的动画开始事件,动画结束事件、动画重复事件、动画值改变事件,并根据事件提供响应处理代码,需要为Animator 对象设置监听器。
如果有多个动画需要同时播放,需要使用 AnimatorSet 组合这些动画。
调用 Animator 对象的 start 启动动画。

代码示例:

private void startAnim() {ObjectAnimator animator0 = ObjectAnimator.ofFloat(mImageViews.get(0),"alpha",1F,0.5F);ObjectAnimator animator1 = ObjectAnimator.ofFloat(mImageViews.get(1), "translationY",200F);ObjectAnimator animator2 = ObjectAnimator.ofFloat( mImageViews.get(2),"translationX", 200F);ObjectAnimator animator3 = ObjectAnimator.ofFloat(mImageViews.get(3),"translationY",-200F);ObjectAnimator animator4 = ObjectAnimator.ofFloat(mImageViews.get(4), "translationX",-200F);AnimatorSet set = new AnimatorSet();set.setDuration(500);set.setInterpolator(new BounceInterpolator());set.playTogether(animator0,animator1,animator2,animator3,animator4);set.start();mFlag = false;
}

Android -- 三种动画(帧动画、View动画、属性动画)相关推荐

  1. Android动画学习记录二(属性动画、估值器和插值器)

    Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) Android动画学习记录二(属性动画.估值期和插值器) 一.补间动画缺陷 二.属性 ...

  2. 【转】浅析Android动画(二),属性动画高级实例探究

    2019独角兽企业重金招聘Python工程师标准>>> ObjectAnimator实现属性动画 为了写好Android动画这几篇博客,在动笔之前我是下过很大决心的,我对自己的要求是 ...

  3. 【Codecs系列】HEVC中三种Intra帧类型的区别:BLA/IDR/CRA

    Date:2022.1.26 文章目录 1.参考 2.三种Intra帧类型 3.深入理解BLA/IDR/CRA 4.HEVC中的non-IRAP帧的NUT 1.参考 LA.CRA.IDR 解释 IDR ...

  4. 视频提取关键帧工具类KeyFramesExtractUtils.py,动态支持三种取帧方式,关键参数可配置,代码经过优化处理,效果和性能更好。

    同步上一期视频关键帧提取方法: 视频提取关键帧的三种方式[已调通]_君临天下tjm的博客-CSDN博客_视频关键帧提取关键代码如下:# -*- coding: utf-8 -*-"" ...

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

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

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

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

  7. Android 三种动画的总结

    在看动画相关的代码的时候看到过 anim,animator 目录,资源文件中的有 <set> 作为根节点的,也有 <animate-list> 作为根节点的.虽然知道它们这是跟 ...

  8. android录音波浪动画_Android 自定义 view 实现波浪动画进度条

    最近在做项目时需要实现这样一种动画,类似于波浪形的进度动画,粗略的看了一下,发现好像类似于正余弦曲线实现的,但是Android 没有相关的API,所以需要我们动手画出来,所以现在在此记录一下学习过程, ...

  9. android刷新时的圆形动画_Android自定义view渐变圆形动画

    本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...

最新文章

  1. 没想到!大数据发现微信上使用最多的表情竟是...原谅很多人不知道
  2. solver.prototxt参数说明(一)
  3. Linux 利用yum源安装php7.0+nginx
  4. Zookeeper_watch机制核心讲解
  5. Linux下查看txt文档
  6. 计算机主机后面辐射大,电脑的背面辐射大吗
  7. C#:根据特定分隔符分割字符串
  8. Unity AssetsBundle
  9. 全面解析用户故事地图
  10. arcgis怎么压缩tif文件_PDF文件怎么压缩?这个方法一看就会!
  11. java制作oa审批流程,传智播客JAVA培训OA项目 审批流转模块
  12. 国内外主流的三维GIS软件
  13. Visual Studio Code下c语言环境的安装与运行
  14. ssh连接远程服务器报错:ssh_exchange_identification: read: Connection reset by peer
  15. L1和L2简单易懂的理解
  16. 玩了下朋友刚买的iphone4s,太鸡冻了,太幸福了
  17. Meta Learning在NLP领域的应用
  18. JavaScript入门 Day1
  19. 获取当天或某天的开盘价
  20. 百趣代谢组学文献分享:大麦盐胁迫响应机制的组学分析

热门文章

  1. 一种快速简单而又有效的低照度图像恢复算法
  2. 互联网晚报 | 1月13日 星期四 | 恒驰5首车下线;抖音电商测试快递服务“音尊达”;中国移动10086 App月底停止运营...
  3. JSteg信息隐藏算法
  4. 网络天才网页中文版_【在线猜谜类网页游戏】网络天才网页版在线玩
  5. html 拓扑图 开源,GitHub - pylixm/zJTopo: 开源拓扑图工具类jTopo的扩展,jtopo是一个不错的拓扑图,基于html5 canvas,功能强大...
  6. 【AWS】一、如何在AWS免费撸一年的服务器
  7. 小米无线蓝牙耳机Air2 SE如何连接MacPro
  8. 经纬度与距离的换算关系
  9. python opencv 三维重建_三维重建 3D Reconstruction
  10. 关于Verilog 写法