Android动画基础之补间动画与逐帧动画
2016-11-15 23:35
441 查看
Android动画分类主要分三类:
Tweened Animation补间动画
Frame Animation帧动画
Property Animation属性动画
现在我们来介绍一下补间动画。Tweened Animation补间动画,是通过配置动画文件(xml文件/Java代码)对View的内容进行一系列图形变换(有平移、缩放、旋转、透明度)来实现动画效果。无需逐一定义每一帧,只要定义开始、结束的帧和指定动画持续时间。
XML文件存放目录如下:
我们首先来介绍一下Animation常用属性:
Animation.RELATIVE_TO_PARENT 常量以父组件参考定位
Animation.RELATIVE_TO_SELF 常量以自身参考定位
Animation.INFINITE 常量动画持续重复
Animation.RESTART 常量重新开始动画
Animation.REVERSE 常量反转动画效果
android:duration 一次动画效果消耗的时间,单位毫秒,值越小动画速度越快
android:fillAfter 设置为true,表示该动画转化在动画结束后应用
android:fillBefore 设置为true,表示该动画转化在动画开始后应用
android:fillEnable 设置为true,fillAfter、fillBefore才有效
android:repeatCount 表示动画循环的次数,默认为 0 次不循环,-1 为无限循环。
android:repeatMode 表示是循环的模式,reverse 是从一次动画结束开始,restart 是从动画的开始处循环
android:interpolator 是一个插值器资源,它可以控制动画的播放速度
android:shareInterpolator 表示是否与 set 中其他动画共享插值器,false为各自使用各自的插值器
android:startOffset 设置动画于多少毫秒之后启动
android:fromAlpha 表示动画开始时的透明度
android:toAlpha 表示动画结束时候的透明度
取值为[0.0,1.0],0代表完全透明,1代表不透明。
xml方式:
xml方式加载方式通过AnimationUtils.loadAnimation取得animation对象
Java代码方式:new AlphaAnimation(float fromAlpha, float toAlpha)
android:fromXDelta,fromYDelta 起始时X,Y座标
android:toXDelta,toYDelta 动画结束时X,Y的座标
android:fromXScale,fromYScale 动画开始前X,Y的缩放,0.0为不显示, 1.0为正常大小
android:toXScale,toYScale 动画最终缩放的倍数, 1.0为正常大小,大于1.0放大
android:pivotX,pivotY 动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从自身中间开始
xml方式:
Java方式:new ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)
android:fromDegrees 动画开始时的角度
android:toDegrees 动画结束时旋转角度,正代表顺时针
android:pivotX 属性为动画相对于组件的X坐标的开始位置
android:pivotY 属性为动画相对于组件的Y坐标的开始位置
xml方式:
Java方式:new RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,int pivotYType, float pivotYValue)
android:fromXDelta,fromYDelta 起始时X,Y座标
android:toXDelta,toYDelta 动画结束时X,Y的座标
xml方式
Java方式:new TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
xml方式加载方式通过AnimationUtils.loadAnimation再强转AnimationSet取得animation对象
Java方式:
动画监听器:
AccelerateInterpolator 加速,开始时慢中间加速
DecelerateInterpolator 减速,开始时快然后减速
AccelerateDecelerateInterolator 先加速后减速,开始结束时慢,中间加速
AnticipateInterpolator 反向,先向相反方向改变一段再加速播放
AnticipateOvershootInterpolator 反向加超越,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
CycleIinterpolator 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input)
LinearInterpolator 线性,线性均匀改变
OvershootInterpolator超越,最后超出目的值然后缓慢改变到目的值
补间动画缺点:
补间动画还有一个最大的缺陷,就是它只是改变了View的绘制位置而已,并不会真正的改变View的属性。具体来说,例如屏幕左上角有一个ImageView,使用补间动画将其移动到左下角,此刻你去点击左下角的ImageView,它是绝对不会响应点击事件的,因此其作用区域依然还在原来的位置。只不过是补间动画将其绘制在左下角而已。
上面就简单的介绍了Android动画基础的补间动画。我们接着来介绍另外一个动画基础——逐帧动画。
那么从字面上理解,逐帧动画Frame Animation就是一帧接着一帧的播放图片。
Frame Animation动画,也可以在xml文件中进行配置,同样在对于的资源文件存放在res\anim的目录下,配置文件的问节点是
我们看一下常用的逐帧动画属性:
android:drawable 每一帧动画的资源
android:duration 动画持续时间
android:oneshot 是否只显示一次,true为只显示一次,false为重复显示
xml实现方式示例如下:
xml方式加载方式,通过setImageResource()方法获取资源配置文件,通过getDrawable()方法取得组件的Drawable对象,通过AnimationDrawable的start()方法来启动动画。
纯Java实现方式如下:
从代码可以看出实现的方式都是一致的,我们看一下AnimationDrawable几个常用的api:
void start() - 开始播放动画
void stop() - 停止播放动画
addFrame(Drawable frame, int duration) - 添加一帧,并设置该帧显示的持续时间
void setOneShoe(boolean flag) - false为循环播放,true为仅播放一次
boolean isRunning() - 是否正在播放
好了,上述就是我们逐帧动画的介绍,补间动画和逐帧动画都是Android动画的基础,下篇我们来研究一下另一重点——Android动画之属性动画基础用法 。
Tweened Animation补间动画
Frame Animation帧动画
Property Animation属性动画
现在我们来介绍一下补间动画。Tweened Animation补间动画,是通过配置动画文件(xml文件/Java代码)对View的内容进行一系列图形变换(有平移、缩放、旋转、透明度)来实现动画效果。无需逐一定义每一帧,只要定义开始、结束的帧和指定动画持续时间。
动画类型 | xml标签配置 | Java代码实现 |
---|---|---|
渐变透明度 | alpha | AlphaAnimation |
渐变尺寸缩放 | scale | ScaleAnimation |
画面旋转 | rotate | RotateAnimation |
画面位置移动 | translate | TranslateAnimation |
组合动画 | set | AnimationSet |
我们首先来介绍一下Animation常用属性:
Animation.RELATIVE_TO_PARENT 常量以父组件参考定位
Animation.RELATIVE_TO_SELF 常量以自身参考定位
Animation.INFINITE 常量动画持续重复
Animation.RESTART 常量重新开始动画
Animation.REVERSE 常量反转动画效果
android:duration 一次动画效果消耗的时间,单位毫秒,值越小动画速度越快
android:fillAfter 设置为true,表示该动画转化在动画结束后应用
android:fillBefore 设置为true,表示该动画转化在动画开始后应用
android:fillEnable 设置为true,fillAfter、fillBefore才有效
android:repeatCount 表示动画循环的次数,默认为 0 次不循环,-1 为无限循环。
android:repeatMode 表示是循环的模式,reverse 是从一次动画结束开始,restart 是从动画的开始处循环
android:interpolator 是一个插值器资源,它可以控制动画的播放速度
android:shareInterpolator 表示是否与 set 中其他动画共享插值器,false为各自使用各自的插值器
android:startOffset 设置动画于多少毫秒之后启动
alpha渐变透明度动画
下面是AlphaAnimation特用属性:android:fromAlpha 表示动画开始时的透明度
android:toAlpha 表示动画结束时候的透明度
取值为[0.0,1.0],0代表完全透明,1代表不透明。
xml方式:
<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fillBefore="false" android:fromAlpha="1.0" android:toAlpha="0.0" />
xml方式加载方式通过AnimationUtils.loadAnimation取得animation对象
Animation animation = AnimationUtils.loadAnimation(this,R.anim.anim_alpha); mImageView.startAnimation(animation);
Java代码方式:new AlphaAnimation(float fromAlpha, float toAlpha)
Animation animation = new AlphaAnimation(1.0f, 0.0f); animation.setDuration(1000); animation.setFillBefore(false); mImageView.startAnimation(animation);
scale渐变尺寸缩放动画
下面是scale缩放动画属性:android:fromXDelta,fromYDelta 起始时X,Y座标
android:toXDelta,toYDelta 动画结束时X,Y的座标
android:fromXScale,fromYScale 动画开始前X,Y的缩放,0.0为不显示, 1.0为正常大小
android:toXScale,toYScale 动画最终缩放的倍数, 1.0为正常大小,大于1.0放大
android:pivotX,pivotY 动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从自身中间开始
xml方式:
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromXScale="0.5" android:fromYScale="0.5" android:pivotX="50%" android:pivotY="50%" android:repeatCount="1" android:repeatMode="reverse" android:startOffset="0" android:toXScale="2.0" android:toYScale="2.0" />
Java方式:new ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)
Animation animation = new ScaleAnimation(0.5f, 2.0f, 0.5f, 2.0f, 0.5f, 0.5f); animation.setDuration(1000); animation.setRepeatCount(1); animation.setRepeatMode(Animation.REVERSE); animation.setStartOffset(0); mImageView.startAnimation(animation);
rotate画面旋转动画
我们同样先介绍rotate的常用属性:android:fromDegrees 动画开始时的角度
android:toDegrees 动画结束时旋转角度,正代表顺时针
android:pivotX 属性为动画相对于组件的X坐标的开始位置
android:pivotY 属性为动画相对于组件的Y坐标的开始位置
xml方式:
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromDegrees="0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toDegrees="-360" />
Java方式:new RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,int pivotYType, float pivotYValue)
Animation animation = new RotateAnimation(0f, -360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animation.setDuration(1000); animation.setInterpolator(this, android.R.anim.accelerate_decelerate_interpolator); mImageView.startAnimation(animation);
translate画面位置移动动画
translate常用属性:android:fromXDelta,fromYDelta 起始时X,Y座标
android:toXDelta,toYDelta 动画结束时X,Y的座标
xml方式
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromXDelta="100" android:fromYDelta="0" android:interpolator="@android:anim/cycle_interpolator" android:toXDelta="0" android:toYDelta="0" />
Java方式:new TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
Animation animation = new TranslateAnimation(0, 100, 0, 0); animation.setDuration(1000); animation.setInterpolator(this, android.R.anim.accelerate_decelerate_interpolator); mImageView.startAnimation(animation);
set组合动画
xml方式:<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="1000" android:fillBefore="false" android:fromAlpha="1.0" android:toAlpha="0.0" /> <translate android:duration="1000" android:fromXDelta="100" android:fromYDelta="0" android:interpolator="@android:anim/cycle_interpolator" android:toXDelta="0" android:toYDelta="0" /> </set>
xml方式加载方式通过AnimationUtils.loadAnimation再强转AnimationSet取得animation对象
AnimationSet animation = (AnimationSet) AnimationUtils.loadAnimation(this, R.anim.anim_set); mImageView.startAnimation(animation);
Java方式:
AnimationSet animationSet = new AnimationSet(true); Animation translateAnimation = new TranslateAnimation(0, 100, 0, 0); translateAnimation.setDuration(1000); translateAnimation.setInterpolator(this, android.R.anim.accelerate_decelerate_interpolator); Animation alphaAnimation = new AlphaAnimation(1.0f, 0.0f); alphaAnimation.setDuration(1000); alphaAnimation.setFillBefore(false); animationSet.addAnimation(translateAnimation); animationSet.addAnimation(alphaAnimation); mImageView.startAnimation(animationSet);
动画监听器:
animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { //动画开始时调用 } @Override public void onAnimationEnd(Animation animation) { //动画结束时调用 } @Override public void onAnimationRepeat(Animation animation) { //动画重复时调用 } });
几种自带的动画插入器
用法:animation.setInterpolator(new AnticipateInterpolator());
AccelerateInterpolator 加速,开始时慢中间加速
DecelerateInterpolator 减速,开始时快然后减速
AccelerateDecelerateInterolator 先加速后减速,开始结束时慢,中间加速
AnticipateInterpolator 反向,先向相反方向改变一段再加速播放
AnticipateOvershootInterpolator 反向加超越,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
CycleIinterpolator 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input)
LinearInterpolator 线性,线性均匀改变
OvershootInterpolator超越,最后超出目的值然后缓慢改变到目的值
补间动画缺点:
补间动画还有一个最大的缺陷,就是它只是改变了View的绘制位置而已,并不会真正的改变View的属性。具体来说,例如屏幕左上角有一个ImageView,使用补间动画将其移动到左下角,此刻你去点击左下角的ImageView,它是绝对不会响应点击事件的,因此其作用区域依然还在原来的位置。只不过是补间动画将其绘制在左下角而已。
上面就简单的介绍了Android动画基础的补间动画。我们接着来介绍另外一个动画基础——逐帧动画。
逐帧动画
帧——就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。 一帧就是一副静止的画面,连续的帧就形成动画,所以对于经常看日番的朋友,对逐帧动画一定很熟悉,当我们看到帧数很高的动画就会不禁感叹一句燃烧经费。那么从字面上理解,逐帧动画Frame Animation就是一帧接着一帧的播放图片。
Frame Animation动画,也可以在xml文件中进行配置,同样在对于的资源文件存放在res\anim的目录下,配置文件的问节点是
我们看一下常用的逐帧动画属性:
android:drawable 每一帧动画的资源
android:duration 动画持续时间
android:oneshot 是否只显示一次,true为只显示一次,false为重复显示
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/image_1" android:duration="200"/> <item android:drawable="@drawable/image_2" android:duration="200"/> <item android:drawable="@drawable/image_3" android:duration="200"/> ··· </animation-list>
xml方式加载方式,通过setImageResource()方法获取资源配置文件,通过getDrawable()方法取得组件的Drawable对象,通过AnimationDrawable的start()方法来启动动画。
mImageView.setImageResource(R.anim.anim_frame); AnimationDrawable animationDrawable = (AnimationDrawable) mImageView.getDrawable(); animationDrawable.setOneShot(false); animationDrawable.start();
纯Java实现方式如下:
AnimationDrawable animationDrawable = new AnimationDrawable(); for (int i = 1; i <= N; i++) { int id = getResources().getIdentifier("image_" + i, "drawable", getPackageName()); Drawable drawable = getResources().getDrawable(id, null); animationDrawable.addFrame(drawable, 200); } animationDrawable.setOneShot(false); mImageView.setImageDrawable(animationDrawable); animationDrawable.start();
从代码可以看出实现的方式都是一致的,我们看一下AnimationDrawable几个常用的api:
void start() - 开始播放动画
void stop() - 停止播放动画
addFrame(Drawable frame, int duration) - 添加一帧,并设置该帧显示的持续时间
void setOneShoe(boolean flag) - false为循环播放,true为仅播放一次
boolean isRunning() - 是否正在播放
好了,上述就是我们逐帧动画的介绍,补间动画和逐帧动画都是Android动画的基础,下篇我们来研究一下另一重点——Android动画之属性动画基础用法 。
相关文章推荐
- Android基础笔记(十)- 帧动画、补间动画详解、对话框
- Android--Animotion动画详解-逐帧动画,补间动画,属性动画。
- Android基础笔记(十)- 帧动画、补间动画具体解释、对话框
- Android动画的使用(一):补间动画与逐帧动画
- Android基础-简单的动画实现 *补间动画 *透明度渐变 *旋转动画 *位移动画 *如果需要几个效果整合到一起,需要将所有效果全部放到set里
- Android基础-简单的动画实现 *补间动画 *透明度渐变 *旋转动画 *位移动画 *如果需要几个效果整合到一起,需要将所有效果全部放到set里
- Android动画之逐帧动画(Frame Animation)基础学习
- Android基础之Animation——补间动画学习
- Android基础笔记——动画(补间动画:Tween xml实现)
- Android中的动画,逐帧动画,补间动画
- Android动画基础-逐帧动画
- Android动画基础-补间动画
- Android逐帧动画和补间动画
- Android基础_帧动画 补间动画 属性动画(十一)
- Android动画--逐帧动画和补间动画简单介绍和基本用法(一)
- Android开发基础之-----------补间动画
- Android--逐帧动画、补间动画学习
- android基础笔记——补间动画(Tween)代码实现
- Android动画解析(一)-----逐帧动画和补间动画
- 初学Android,图形图像之混合使用逐帧动画和补间动画(三十七)