项目中好久没用过动画了,所以关于动画的知识都忘光了。知识总是不用则忘。正好最近的版本要添加比较炫酷的动画效果,所以也借着这个机会,写博客来整理和总结关于动画的一些知识。也方便自己今后的查阅。

Android中的动画分为三类。

  • View animation:视图动画,也叫做 Tween(补间)动画。
  • Drawable animation:也叫做Frame 动画,帧动画。
  • Property animation: 属性动画。支持Android3.0以上版本。

我们根据类别,来分别介绍。

视图动画

视图动画是一种比较古老的,使用方式比较简单的动画。它可以在一个视图容器内执行一系列的简单变换(比如大小,旋转等)。它控制的是整个view。它支持四种效果。透明度旋转缩放位移。分别对应着 Animation的四个子类,AlphaAnimation,RotateAnimation,ScaleAnimationTranslateAnimation

但是视图动画有一点需要特别注意,那就是不具备交互性。什么意思呢?比如 一个Button进行了平移变换,已经从之前的A点,移动到了B点。但是你点击B点,该Button没反应,相反你点击A点,该Button才有反应。(虽然它的视图已经不显示在A点了)。所以说 视图动画改变的只是View的显示,却没有改变View的真实布局属性值。

视图动画可以通过Xml或Android代码中定义。使用起来比较方便。

如果在xml文件中使用动画,文件目录是res/anim/filename.xml,并且View动画既可以是单个动画,也可以由一系列动画组成:
它具体的使用方式如下:

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

在代码中这样应用。

//@author  www.yaoxiaowen.com
//本文地址: http://www.cnblogs.com/yaoxiaowen/p/7499556.html
Animation myAnim = AnimationUtils.loadAnimation(this, R.anim.filename);
myView.startAnimation(myAnim);

而如果不借助于xml文件,直接在java代码中定义,则类似这样使用:

//旋转动画, 旋转参考系为自身中心点
//@author  www.yaoxiaowen.com
//本文地址: http://www.cnblogs.com/yaoxiaowen/p/7499556.html
RotateAnimation ra = new RotateAnimation(0, 360, RotateAnimation.RELATIVE_TO_SELF, 0.5F,RotateAnimation.RELATIVE_TO_SELF, 0.5F);ra.setDuration(5000);
myView.startAnimation(ra);

知道了基本用法,那么我们下面要做的,就是熟悉相关api了。。(具体api内容,参考了该篇博客,在此表示感谢)。

Animationabstract的,它也是AlphaAnimation等视图动画的基类。

Animation类相关属性方法如下:

xml属性 java方法 解释
android:detachWallpaper setDetachWallpaper(boolean) 是否在壁纸上运行
android:duration setDuration(long) 动画持续时间,毫秒为单位
android:fillAfter setFillAfter(boolean) 控件动画结束时是否保持动画最后的状态
android:fillBefore setFillBefore(boolean) 控件动画结束时是否还原到开始动画前的状态
android:fillEnabled setFillEnabled(boolean) 与android:fillBefore效果相同
android:interpolator setInterpolator(Interpolator) 设定插值器(指定的动画效果,譬如回弹等)
android:repeatCount setRepeatCount(int) 重复次数
android:repeatMode setRepeatMode(int) 重复类型有两个值,reverse表示倒序回放,restart表示从头播放
android:startOffset setStartOffset(long) 调用start函数之后等待开始运行的时间,单位为毫秒
android:zAdjustment setZAdjustment(int) 表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal

除此之外,Animation还有一些常用的方法:

Animation类的方法 解释
reset() 重置Animation的初始化
cancel() 取消Animation动画
start() 开始Animation动画
setAnimationListener(AnimationListener listener) 给当前Animation设置动画监听
hasStarted() 判断当前Animation是否开始
hasEnded() 判断当前Animation是否结束

Alpha相关属性:

xml属性 java方法 解释
android:fromAlpha AlphaAnimation(float fromAlpha, …) 动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
android:toAlpha AlphaAnimation(…, float toAlpha) 动画结束的透明度,同上

Rotate相关属性:

xml属性 java方法 解释
android:fromDegrees RotateAnimation(float fromDegrees, …) 旋转开始角度,正代表顺时针度数,负代表逆时针度数
android:toDegrees RotateAnimation(…, float toDegrees, …) 旋转结束角度,正代表顺时针度数,负代表逆时针度数
android:pivotX RotateAnimation(…, float pivotX, …) 缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:pivotY RotateAnimation(…, float pivotY) 缩放起点Y坐标,同上规律

Scale相关属性:

xml属性 java方法 解释
android:fromXScale ScaleAnimation(float fromX, …) 初始X轴缩放比例,1.0表示无变化
android:toXScale ScaleAnimation(…, float toX, …) 结束X轴缩放比例
android:fromYScale ScaleAnimation(…, float fromY, …) 初始Y轴缩放比例
android:toYScale ScaleAnimation(…, float toY, …) 结束Y轴缩放比例
android:pivotX ScaleAnimation(…, float pivotX, …) 缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:pivotY ScaleAnimation(…, float pivotY) 缩放起点Y轴坐标,同上规律

Translate相关属性:

xml属性 java方法 解释
android:fromXDelta TranslateAnimation(float fromXDelta, …) 起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:fromYDelta TranslateAnimation(…, float fromYDelta, …) 起始点Y轴从标,同上规律
android:toXDelta TranslateAnimation(…, float toXDelta, …) 结束点X轴坐标,同上规律
android:toYDelta TranslateAnimation(…, float toYDelta) 结束点Y轴坐标,同上规律

另外还有一个AnimationSet,它代表的是一系列动画的组合。
在代码当中我们可以这样使用:

//@author  www.yaoxiaowen.com
//本文地址: http://www.cnblogs.com/yaoxiaowen/p/7499556.html
AnimationSet as = new AnimationSet(true);
as.setDuration(1000);AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(1000);
as.addAnimation(aa);TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 200);
ta.setDuration(1000);
as.addAnimation(ta);btn7.startAnimation(as);

但是值得注意的是,如果我们对AnimationSet设置了一些属性,那么有些属性会影响到它所包含的子控件,而有些则不会。API文档上是这样解释的。

The way that AnimationSet inherits behavior from Animation is important to understand. Some of the Animation attributes applied to AnimationSet affect the AnimationSet itself, some are pushed down to the children, and some are ignored, as follows:

  • duration, repeatMode, fillBefore, fillAfter: These properties, when set on an AnimationSet object, will be pushed down to all child animations.
  • repeatCount, fillEnabled: These properties are ignored for AnimationSet.
  • startOffset, shareInterpolator: These properties apply to the AnimationSet itself.

视图动画是供View使用的,而View基类中和动画相关的常用方法如下:

View类的常用动画操作方法 解释
startAnimation(Animation animation) 对当前View开始设置的Animation动画
clearAnimation() 取消当View在执行的Animation动画

帧动画

帧动画是一种比较简单的动画,利用多张图片就像放电影那样轮流播放,然后就形成了动画效果。或者说像播放幻灯片也是一个道理。因为它实质上就是多张图,所以它也叫作 Drawable动画。系统提供了 AnimationDrawable类来使用 帧动画。该类和 Animation没有继承关系。

Goole官方demo给出的使用方式如下:

 <!-- Animation frames are wheel0.png through wheel5.pngfiles inside the res/drawable/ folder --><animation-list android:id="@+id/selected" android:oneshot="false"><item android:drawable="@drawable/wheel0" android:duration="50" /><item android:drawable="@drawable/wheel1" android:duration="50" /><item android:drawable="@drawable/wheel2" android:duration="50" /><item android:drawable="@drawable/wheel3" android:duration="50" /><item android:drawable="@drawable/wheel4" android:duration="50" /><item android:drawable="@drawable/wheel5" android:duration="50" /></animation-list>

在java代码中加载使用该动画。

 // Load the ImageView that will host the animation and// set its background to our AnimationDrawable XML resource.ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image);img.setBackgroundResource(R.drawable.spin_animation);// Get the background, which has been compiled to an AnimationDrawable object.AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();// Start the animation (looped playback by default).frameAnimation.start();

对于帧动画,注意以下几点就ok了。

  • android:oneshot属性:true表示动画只播放一次,然后停止在最后一帧上,false表示动画循环播放。
    item代表每一帧的图片, android:drawable表示具体图片引用,android:duration表示每一帧停留的时间。
  • AnimationDrawable#start()方法不可以在Activity#onCreate()方法中调用,这和AnimationDrawable还未完全附着到window上有关,因此最好的调用时机是在Activity#onWindowFocusChanged()方法中。

Activity或fragment的切换动画

跳转Activity时,系统有默认的切换效果,不过我们也可以自定义,只要直接调用Activity中的一个方法即可,

/*** @author  www.yaoxiaowen.com* @param enterAnim   进入Activity时,所需要的动画资源id, 传递 0 代表 不使用动画效果* @param exitAnim   离开Activity时,所需要的动画资源id, 传递 0 代表 不使用动画效果*/
public void overridePendingTransition (int enterAnim, int exitAnim)

但是该方法必须要紧跟着startActivity(Intent)finish()方法后面立即被调用,否则没效果。
类似下面这样

//www.yaoxiaowen.com
@Override
public void finish() {super.finish();overridePendingTransition(0, R.anim.exit_anim);
}

而Fragment也可以添加切换动画。则要使用FragmentTransaction中的这个方法。

FragmentTransaction setCustomAnimations (int enter, int exit)

不过要注意,Activityfragment添加的动画都应该是 视图动画,而不是属性动画。


作者: www.yaoxiaowen.com

博客地址: www.cnblogs.com/yaoxiaowen/

github: https://github.com/yaowen369

欢迎对于本人的博客内容批评指点,如果问题,可评论或邮件(yaowen369@gmail.com)联系

欢迎转载,转载请注明出处.谢谢

Android动画(一)-视图动画与帧动画相关推荐

  1. Android 动画(四)---逐帧动画

    1创建逐帧动画资源---文件res/drawable/animated_rocket.xml <?xml version="1.0" encoding="utf-8 ...

  2. android 逐帧动画自动播放以及逐帧动画与渐变动画结合的停止问题

    关于逐帧动画的自动播放: android 逐帧动画一般不能直接在onCreat()方法里直接调用.start(),否则只是播放动画的第一帧,可重写onWindowFocusChanged(boolea ...

  3. Android性能优化 _ 大图做帧动画卡?优化帧动画之 SurfaceView滑动窗口式帧复用

    (ps:粗斜体表示引导方案逐步进化的关键点) SurfaceView逐帧解析 & 帧复用 简单回顾下上一篇的内容:原生帧动画在播放前解析所有帧,对内存压力大.SurfaceView可以精细地控 ...

  4. html逐帧动画,CSS秘密花园: 逐帧动画

    <CSS Secrets>是@Lea Verou最新著作,这本书讲解了有关于CSS中一些小秘密.是一本CSSer值得一读的一本书,经过一段时间的阅读,我.@南北和@彦子一起将在W3cplu ...

  5. css3动画效果(旋转,帧动画)

    一.css动画属性 animation是css3的动画属性,也是简写,其中包含以下几种值可配置 默认值:none 0 ease 0 1 normal 值 描述 animation-name 需要绑定到 ...

  6. 小程序canvas动画解决方案,绘制一个帧动画

    目前还有个问题:android上面无卡顿,但是ios直接把微信卡掉! wxml <canvas style='width:{{windowWidth}}px;height:{{height}}p ...

  7. Android 帧动画 xml 方式实现

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  8. 安卓动画全解:补间动画(视图动画)、布局动画、属性动画、逐帧动画。动画Animation属性、Alpha属性、Scale属性、Translate属性、Rotate属性,动画集AnimationSet

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓动画全解:补间动画(视图动画).布局动画.属性动画.逐帧动画. 主要内容包含:动画Animation属性.Alpha属性.Scale属性.Tran ...

  9. android动画不占cpu如何实现,【实战总结】帧动画调优实践

    原标题:[实战总结]帧动画调优实践 原文链接:https://www.zybuluo.com/avenwu/note/876161 APP架构师整理发布,转载请联系作者获得授权. 1.背景 在做动画的 ...

  10. Android逐帧动画和补间动画

    本篇博客来看一下Android中的逐帧动画和补间动画. 一.逐帧动画 逐帧动画也叫Drawable Animation. 在Android中实现逐帧动画,就是由设计师给出一系列状态不断变化的图片, 开 ...

最新文章

  1. 【Python】函数递归实例之字符串反转、汉诺塔问题分析
  2. html怎样做登录页面,使用HTML 5和CSS3制作登录页面完整步骤
  3. 2016重庆计算机一级考试题型,重庆计算机一级考试真题2016年最新(笔试+上机).doc...
  4. 使用Optuna的XGBoost模型的高效超参数优化
  5. 内购订单进行二次处理_「物流图表」复杂业务场景下的订单管理系统搭建
  6. java命令行参数是什么_Java实验课:命令行参数是什么?
  7. 微信聊天机器人,不使用iChat,可以群聊
  8. 总结----20个最常见的算法面试问题
  9. 疯狂java 视频_疯狂Java讲义配书视频教程 下载
  10. 理解Aode Air,理解RIA开发
  11. 个人博客网站的设计与实现
  12. 快去抢票!今天开始!2020元旦春节火车票购票日程攻略来了
  13. 小文一篇,说说:where、:has和:is的特殊性吧
  14. Word查找替换详细用法及通配符一览表
  15. xcode 软件˙∆集~
  16. 使用mock模拟数据,实现图片文字向上的轮播
  17. js闭包是什么?对js闭包的理解
  18. Netscape与IE的浏览器之争
  19. 打开了ros中的rviz,显示不了机器人模型
  20. Python网络爬虫实践(1):爬取网易云音乐播放量大于1000万的歌单

热门文章

  1. UA MATH563 概率论的数学基础2 随机变量1 随机变量与分布函数
  2. UA MATH571B 试验设计II 简单试验的分析方法
  3. VC++ 使用BitBlt函数显示位图
  4. vue-jwt 实战
  5. [PM Tools]软件项目进度跟踪表v4.0
  6. .Net Core 环境安装
  7. ubuntu中minicom安装和使用
  8. Mysql foreignkey 相关
  9. WCF - Versus Web Service
  10. 处理器与内存和硬盘的交互