Android--Tween补间动画
前言
Android除了支持逐帧动画之外,也提供了对补间动画的支持,补间动画就是指开发人员只需要指定动画的开始、动画结束的"关键帧",而动画变化的"中间帧"由系统计算并补齐。本篇博客就讲解如何在Android下使用补间动画,最后将以简单的Demo来演示。
本篇博客的主要内容:
- Animation
- AlphaAnimation
- RotateAnimation
- ScaleAnimation
- TranslateAnimation
- AnimationSet
- Animation变化坐标点的参照类型
- Animation的Interpolator
Animation
在Android中使用Tween补间动画需要得到Animation的支持,它处于"android.view.animation.Animation"包下,是一个抽象类,其中抽象了一些动画必须的方法,其子类均有对其进行实现,而在Android下完成补间动画也就是在操作Animation的几个子类。
补间动画和逐帧动画一样,可以使用XML资源文件定义,也可以使用Java代码定义。下面提供一些常用Animation中定义的属性,同样都提供了XML属性以及对应的方法,它们主要用来设定补间动画的一些效果:
- android:duration/setDuration(long):动画单次播放时间。
- android:fillAfter/setFillAfter(boolean):动画是否保持播放结束位置。
- android:fillBefore/setFillBefore(boolean):动画是否保持播放开始位置。
- android:interpolator/setInterpolator(Interpolator):指定动画播放的速度曲线,不设定默认为匀速。
- android:repeatCount/setRepeatCount(int):动画持续次数,如2,会播放三次。
- android:repeatMode/setRepeatMode(int):动画播放模式。
- android:startOffset/setStartOffset(long):动画延迟播放的时长,单位是毫秒。
Animation中内置的方法并不只有这些,还有一些其他的控制细节的方法,有需要可以查询官方文档,这里不再详细讲解。
上面提到,Android下对于补间动画的支持,主要是使用Animation的几个子类来实现,下面分别介绍Animation下的几个子类:
- AlphaAnimation:控制动画透明度的变化。
- RotateAnimation:控制动画旋转的变化。
- ScaleAnimation:控制动画成比例缩放的变化。
- TranslateAnimation:控制动画移动的变化。
- AnimationSet:以上几种变化的组合。
上面几个Animation也包含了补间动画的几种变化,如果需要使用XML资源文件定义补间动画,需要把XML资源文件定义在/res/anim/目录下,在需要使用的地方通过AnimationUtils.loadAnimation(int)方法指定XML动画ID来加载一段动画。AnimationUtils是动画工具类,其中实现了一些静态的辅助动画操作的方法。
例如:
/**
* 透明度变化
*/
protected void toAlpha() {
Animation anim=AnimationUtils.loadAnimation(ToXMLActivity.this, R.anim.anim_alpha);
iv_anim.startAnimation(anim);
}
AlphaAnimation
AlphaAnimation,是Animation的子类,它用来控制透明度改变的动画。创建该动画的时候要指定动画开始的透明度、结束时候的透明度和动画的持续时间。其中透明度可以使用0~1之间的float类型的数字指定,0为透明,1为不透明。
AlphaAnimation有两个构造函数,这里讲一个最常用最直观的,下面是它的完整签名:
AlphaAniamtion(float fromAlpha,float toAlpha)
上面方法指定以两个float类型的参数设定了动画开始(fromAlpha)和结束(toAlpha)的透明度。
使用Java代码定义AlphaAnimation动画:
/**
* 透明度变化
*/
protected void toAlpha() {
// 动画从透明变为不透明
AlphaAnimation anim = new AlphaAnimation(1.0f, 0.5f);
// 动画单次播放时长为2秒
anim.setDuration(2000);
// 动画播放次数
anim.setRepeatCount(2);
// 动画播放模式为REVERSE
anim.setRepeatMode(Animation.REVERSE);
// 设定动画播放结束后保持播放之后的效果
anim.setFillAfter(true);
// 开始播放,iv_anim是一个ImageView控件
iv_anim.startAnimation(anim);
}
同样可以使用XML资源文件设定AlphaAnimation,它需要使用<alpha.../>标签,为其添加各项属性:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillAfter="true"
android:fromAlpha="1.0"
android:repeatCount="2"
android:repeatMode="reverse"
android:toAlpha="0.5" >
</alpha>
在使用XML资源文件的时候,使用AnimationUtils.loadAnimation()方法加载它即可。
效果展示:
RotateAnimation
RotateAnimation,是Animation的子类,它用来控制动画的旋转,创建该动画时只要指定动画旋转的"轴心坐标"、开始时的旋转角度、结束时的旋转角度,并指定动画持续时间即可。
RotateAnimation有多个构造函数,这里讲一个参数最多的,下面是它的完整签名:
RotateAnimation(float fromDegrees,float toDegrees,int pivotXType,float pivotXVlaue,int pivotYType,float pivotYValue)
RotateAnimation中,fromDegrees和toDegrees分别指定动画开始和结束的旋转角度,pivotXType和pivotYType指定旋转中心的参照类型,它们以静态常量的形式定义在Animation中,pivotXVlaue和pivotYValue指定旋转中心的位置。
使用Java代码定义RotateAnimation:
/**
* 旋转变化
*/
protected void toRotate() {
// 依照图片的中心,从0°旋转到360°
RotateAnimation anim = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
anim.setDuration(2000);
anim.setRepeatCount(2);
anim.setRepeatMode(Animation.REVERSE);
iv_anim.startAnimation(anim);
}
同样可以使用XML资源文件定义RotateAnimation,它需要使用<rotate.../>标签,为其添加各项属性:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="2"
android:toDegrees="360" >
</rotate>
在使用XML资源文件的时候,使用AnimationUtils.loadAnimation()方法加载它即可。
效果展示:
ScaleAnimation
ScaleAnimation,是Animation的子类,它用来控制动画的缩放。创建该动画时要指定开始缩放的中心坐标、动画开始时的缩放比、结束时的动画缩放比,并指定动画的持续时间即可。
ScaleAnimation有多个构造函数,这里讲一个参数最多的,下面是它的完整签名:
ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
上面ScaleAnimation构造函数中,fronX、 toX、fromY、toY,分别指定了缩放开始和结束的坐标,pivotXType和pivotYType设定了缩放的中心类型,pivotXValue和pivotYValue设定了缩放中心的坐标。
使用Java代码定义ScaleAnimation:
/**
* 比例缩放变化
*/
protected void toScale() {
// 以图片的中心位置,从原图的20%开始放大到原图的2倍
ScaleAnimation anim = new ScaleAnimation(0.2f, 2.0f, 0.2f, 2.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
anim.setDuration(2000);
anim.setRepeatCount(2);
anim.setRepeatMode(Animation.REVERSE);
iv_anim.startAnimation(anim);
}
同样可以使用XML资源文件定义ScaleAnimation,它需要使用<scale.../>标签,为其添加各项属性:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:pivotX="50%"
android:pivotY="50%"
android:fromXScale="0.2"
android:fromYScale="0.2"
android:toXScale="2.0"
android:toYScale="2.0" >
</scale>
在使用XML资源文件的时候,使用AnimationUtils.loadAnimation()方法加载它即可。
效果展示:
TranslateAnimation
TranslateAnimation,是Animation的子类,它用来控制动画的移动。创建该动画只要指定动画开始时的位置、结束时的位置,并指定动画持续的时间即可。
TranslateAnimation有多个构造函数,这里讲一个参数最多的,下面是它的完整签名:
TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
上面TranslateAnimation构造函数中,它们指定了动画开始的点类型以及点位置和动画移动的X、Y点的类型以及值。
使用Java代码定义TranslateAnimation:
/**
* 移动变化
*/
protected void toTranslate() {
// 从父窗口的(0.1,0.1)的位置移动父窗口X轴20%Y轴20%的距离
TranslateAnimation anim = new TranslateAnimation(
Animation.RELATIVE_TO_PARENT, 0.1f,
Animation.RELATIVE_TO_PARENT, 0.2f,
Animation.RELATIVE_TO_PARENT, 0.1f,
Animation.RELATIVE_TO_PARENT, 0.2f);
anim.setDuration(2000);
anim.setRepeatCount(2);
anim.setRepeatMode(Animation.REVERSE);
iv_anim.startAnimation(anim);
}
在使用XML资源文件的时候,使用AnimationUtils.loadAnimation()方法加载它即可。
同样可以使用XML资源文件定义TranslateAnimation,它需要使用<translate.../>标签,为其添加各项属性:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="10%p"
android:toXDelta="20%p"
android:fromYDelta="10%p"
android:toYDelta="20%p"
android:duration="2000"
android:repeatCount="2"
android:repeatMode="reverse">
</translate>
在使用XML资源文件的时候,使用AnimationUtils.loadAnimation()方法加载它即可。
效果展示:
AnimationSet
AnimationSet,组合动画,,是Animation的子类。有些场景需要完成透明度变化、旋转、缩放、移动等多种变化,那么就可以使用AnimationSet来完成,它可以使用addAnimation(Animation)添加多个动画进行组合播放。
AnimationSet有多个构造函数,这里讲一个最常用的,下面是它的完整签名:
AnimationSet(boolean shareInterpolator)
它只有一个boolean的参数,指定是否每个动画分享自己的Interpolator,关于Interpolator的内容后面讨论,如果为false,则每个AnimationSet中的每个动画,使用自己的Interpolator。
使用Java代码定义AnimationSet:
/**
* 组合动画
*/
protected void toSetAnim() {
AnimationSet animSet = new AnimationSet(false);
// 依照图片的中心,从0°旋转到360°
RotateAnimation ra = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
ra.setDuration(2000);
ra.setRepeatCount(2);
ra.setRepeatMode(Animation.REVERSE); // 以图片的中心位置,从原图的20%开始放大到原图的2倍
ScaleAnimation sa = new ScaleAnimation(0.2f, 2.0f, 0.2f, 2.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
sa.setDuration(2000);
sa.setRepeatCount(2);
sa.setRepeatMode(Animation.REVERSE); // 动画从透明变为不透明
AlphaAnimation aa = new AlphaAnimation(1.0f, 0.5f);
// 动画单次播放时长为2秒
aa.setDuration(2000);
// 动画播放次数
aa.setRepeatCount(2);
// 动画播放模式为REVERSE
aa.setRepeatMode(Animation.REVERSE);
// 设定动画播放结束后保持播放之后的效果
aa.setFillAfter(true); animSet.addAnimation(sa);
animSet.addAnimation(aa);
animSet.addAnimation(ra); iv_anim.startAnimation(animSet);
}
同样可以使用XML资源文件定义AnimationSet,它需要使用<set.../>标签,为其添加各项属性:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" > <rotate
android:duration="2000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="2"
android:toDegrees="360" >
</rotate> <scale
android:duration="2000"
android:fromXScale="0.2"
android:fromYScale="0.2"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="2.0"
android:toYScale="2.0" >
</scale> <alpha
android:duration="2000"
android:fillAfter="true"
android:fromAlpha="1.0"
android:repeatCount="2"
android:repeatMode="reverse"
android:toAlpha="0.5" >
</alpha> </set>
在使用XML资源文件的时候,使用AnimationUtils.loadAnimation()方法加载它即可。
效果展示:
Animation变化坐标点的参照类型
上面看到,RotateAnimation、ScaleAnimation、TranslateAnimation都存在一对pivotXType,pivotYType参数,它们是用来指定点的参照类型,使用int类型以静态常量的形式定义在Animation中,它有如下个值:
- ABSOLUTE:以绝对坐标为参照。
- RELATIVE_TO_PARENT:以父容器为参照。
- RELATIVE_TO_SELF:以当前容器为参照。
细心的朋友有发现到,在使用XML定义动画资源的时候,没有关于pivotXType、pivotYType两个属性,其实它们结合到了设定点的坐标中中,以 pivotXValue、pivotYValue两个属性替代,其中如果需要设定为父容器为参照,需要在属性值后面加"p"即可。
Animation的Interpolator
补间动画定义的是动画开始、结束的关键帧,Android需要在开始帧、结束帧之间动态计算,插入大量帧,而Interpolator用于控制"插入帧"的行为。
Interpolator根据特定算法计算出整个动画所需要动态插入帧的密度和位置,简单来说,Interpolator负责控制动画的变化速率,用来设定与基本动画(Alpha、Scale、Rotate、Translate)的动画播放速率。
Interpolator是一个接口,它定义了的所有Interpolator都需要实现方法:float getInterpolation(float)方法,如果需要自定义动画的变化速率,只需要重写这个接口即可,Android已经为开发人员提供了一些Interpolator的实现类,这里介绍几个常用的:
- LineraInterpolator:动画以匀速的速度变化,默认值。
- AccelerateInterpolator:在动画开始的时候变化速度较慢,之后开始加速。
- AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,中间的时候加速。
- CycleInterpolator:动画循环播放特定的次数,变化速度按照正弦曲线变化。
- DecelerateInterpolator:在动画开始的地方速度较快,然后开始减速。
Android--Tween补间动画的更多相关文章
- Android开发之Tween(补间动画)
在android中动画主要有三种,①帧动画(http://blog.csdn.net/dmk877/article/details/45893017)这篇文章已经详细的进行了讲解,②补间动画这也是这篇 ...
- Android 学习笔记多媒体技术之 Drawable类+Tween(补间动画)+Frame(帧动画)
学习内容: 1.了解Drawable类的作用 2.如何使用Drawable... 3.了解Tween动画... 4.如何创建和使用Tween动画... 1.Drawable类... Drawabl ...
- Android(java)学习笔记199:Android中补间动画(Tween Animation)
本文主要简单介绍补间动画使用代码实现, 关于使用xml实现补间动画,可以参看:自定义控件三部曲之动画篇(一)——alpha.scale.translate.rotate.set的xml属性及用法 1. ...
- Android(java)学习笔记142:Android中补间动画(Tween Animation)
本文主要简单介绍补间动画使用代码实现, 关于使用xml实现补间动画, 可以参看:自定义控件三部曲之动画篇(一)——alpha.scale.translate.rotate.set的xml属性及用法 1 ...
- 高速上手Unity中最好的补间动画插件DFTween
出处:http://blog.csdn.net/u010019717 author:孙广东 时间:2015.3.17 23:00 DFTween 是一个在 Unity 游戏引擎中高 ...
- Android动画效果之Tween Animation(补间动画)
前言: 最近公司项目下个版本迭代里面设计了很多动画效果,在以往的项目中开发中也会经常用到动画,所以在公司下个版本迭代开始之前,抽空总结一下Android动画.今天主要总结Tween Animation ...
- Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation
程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...
- Android动画总结#补间动画(Tween Animation/View Animation) #帧动画(Frame Animation/Drawable Animation)#属性动画(PropertyAnimation)
1.共有三种动画,英文名字多种叫法如下 第一种动画:补间动画(Tween Animation/View Animation) 四个:RotateAnimation旋转. AlphaAnimation透 ...
- Android开发(26)--补间动画(Tween)的实现
补间动画(Tween Animation) 补间动画与逐帧动画在本质上是不同的,逐帧动画通过连续播放图片来模拟动画的效果,而补间动画则是通过在两个关键帧之间补充渐变的动画效果来实现的.补间动画的优点是 ...
随机推荐
- functools.wraps函数
原文地址:https://www.cnblogs.com/fcyworld/p/6239951.html 第一次见到functools.wraps是在 Flask Web开发 中,一直不明白怎么回事. ...
- [OC] 添加 pch 文件
第一步: Xcode左上角 File - New - File, Other - PCH File 第二步, 在图中位置,写入 pch 的路径. 路径可以将 pch 文件拖入终端来得到.
- linux使用storcli64查看硬盘信息
使用storcli查看硬盘信息: rpm -ivh storcli--.noarch.rpm cd /opt/MegaRAID/storcli/ ./storcli64 /c0(零) show 链接: ...
- 1062 Text Reverse
http://acm.hdu.edu.cn/showproblem.php?pid=1062 思路: 最主要的是通过getline函数存取字符串. 如何读取单个单词,并且反向输出? 用\n作为单个单词 ...
- win10自带的防火墙Windows Defender
Windows Defender防火墙(别名:windows守卫者)是微软公司自主研发的一款基于windows自身保护的一款系统. Windows Defender可以对系统进行实时监控,对于Wind ...
- banner | what is the "banner" ?
banner/横幅 获取 banner(横幅) 信息属于信息搜集 因为在 banner 信息中,可以获取到软件开发商.软件名称.服务类型.版本号等 而版本号有时候就会存在公开的 CVE 问 ...
- Hashlib加密,内置函数,安装操作数据库
hashlib模块的md5加密: md5同样的内容加密后是一样的 md5加密后是不可逆的.即能加密,没办法解密. 撞库: 只是针对简单的,因为同样的内容加密后是一样的,难一点就不行了. 登录密码:注册 ...
- Bootstarp 使用布局
实现 Bootstrap 基本布局 看到了一篇 20 分钟打造 Bootstrap 站点的文章,内容有点老,重新使用 Bootstrap3 实现一下,将涉及的内容也尽可能详细说明. 1. 创建基本的页 ...
- 2017 ES GZ Meetup分享:Data Warehouse with ElasticSearch in Datastory
以下是我在2017 ES 广州 meetup的分享 ppt:https://elasticsearch.cn/slides/11#page=22 摘要 ES最多使用的场景是搜索和日志分析,然而ES强大 ...
- Cordova/Ionic Android 开发环境搭建 - Windows系统
电脑操作系统 - windows 10 IDE - WebStorm 2019 Node v10.15.3 npm v6.4.1 Ionic v3 Angula v5 Cordova 移动设备 ...