#.动画的本质
无论手机还是电视,都以一定频率在不停刷新屏幕画面,当前一般为60Hz。
手机屏幕一般1s刷新了60次屏幕画面,如果这些画面连在一起呈现出了一个“动画”的效果,用户就认为看到了动画。
无论这个效果是用什么方式来实现的,其实用户只是需要在屏幕中看到这个效果。它可以通过很多种方式来实现,例如:覆写View的onDraw()、通过SurfaceView、通过估值器不停回调更新、通过Handler不停发送延迟消息更新。
而Android本身提供了三种机制来供开发者更便捷地实现动画,这也就是我们开发者口中经常说到的Android三种动画:补间动画、属性动画、帧动画
#.Android三类动画简介:
1.补间动画:
通过渐进操作View的影像,实现动画。注意它仅仅实现一个动画效果,未真正改变View任何属性。
例如View用补间动画移动后,位置并未变化,若设置了点击事件,点击原来位置有反应,点击最后动画停止位置无反应。
能进行4种效果的变化:平移、放缩、旋转、透明度。
2.属性动画:
通过渐进改变View对象的属性值,实现动画。(这里的属性可以是该对象java类中任意已实现set/get方法的属性)
会真实改变属性值,但要注意位置变化时View的getLeft()/getRight()/getTop()/getBottom()等四个边界的原始偏移坐标不会变化,改变的是View左上角当前的坐标值getX()/getY()。
3.帧动画:
设置了一组图片,通过快速切换这些图片的显示,实现动画效果
#.三种动画示例及属性说明
1.补间动画
在src/anim下定义anim_set.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 可以定义一个个单独的动画,也可以将这些动画组合起来定义在一个xml中 -->
<!-- 组合的方式更常见一些 -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--透明度变化-->
<alpha
android:duration="1000"
android:fromAlpha="0"
android:toAlpha="1"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
/>
<!--平移-->
<translate
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:startOffset="3000"
android:toXDelta="500"
android:toYDelta="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
/>
<!--旋转-->
<rotate
android:duration="3000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toDegrees="360"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
/>
<!--缩放-->
<scale
android:duration="3000"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="4000"
android:toXScale="0.5"
android:toYScale="0.5"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
/>
</set>
java代码中的调用:
Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim_set);
view.startAnimation(anim);
状态监听接口:
public static interface AnimationListener {
//开始
void onAnimationStart(Animation animation);
//结束
void onAnimationEnd(Animation animation);
//重复
void onAnimationRepeat(Animation animation);
}
//添加方法
public void setAnimationListener(Animation.AnimationListener listener)
##.Animation属性详解:
以下内容摘自Android - 动画(帧动画,补间动画,属性动画,以及插值器) - 简书
(通用属性)
属性名称 | 作用 | 备注 |
duration | 动画执行的时间 | 以毫秒为单位 |
fillEnabled | 动画结束时,是否还原到开始动画前的状态 | true或者false |
fillBefore | 与fillEnabled相同 | 无 |
fillAfter | 动画结束时,是否将保持动画最后时的状态 | true或者false |
repeatMode | 重复类型 | reverse:表示倒序回访,restart:表示重新放一遍,这个属性必须与repeatCount联合使用,因为牵扯到重复,即重复播放时的播放类型。 |
repeatCount | 动画重复的次数 | infinite:表示无限循环 |
interpolator | 设定的插值器,它主要用来为动画设置一些特殊的效果,比方说:加速运动、减速运动、动画结束的时候弹起等等。 | 下面会详细介绍 |
alpha属性详解
属性名称 | 作用 | 备注 |
fromAlpha | 动画开始时的透明度 | 变化范围为0.0-1.0,0.0表示完全透明,1.0表示完全不透明 |
toAlpha | 动画结束时的透明度 | 同上 |
rotate属性详解
属性名称 | 作用 | 备注 |
fromDegrees | 动画开始时旋转的角度位置 | float类型;正值代表顺时针方向度数,负值代码逆时针方向度数 |
toDegrees | 动画结束时旋转到的角度位置 | 同上 |
pivotX | 旋转点X轴坐标 | 请看下面的备注 |
pivotY | 旋转点Y轴坐标 | 同上 |
pivotX:float类型,可以是数值、百分数、百分数p三种样式,比如50、50%、50%p; 当为数值时,表示在当前View的左上角,即原点处加上50px,做为旋转点X坐标,如果是50%;表示在当前控件的左上角加上自己宽度的50%做为旋转点X坐标;如果是50%p,那么就是表示在当前控件的左上角加上父控件宽度的50%做为旋转点X坐标
canle属性详解
属性名称 | 作用 | 备注 |
fromXScale | 起始的X方向上相对自身的缩放比例 | 型float,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍 |
toXScale | 结尾的X方向上相对自身的缩放比例 | 类型float |
fromYScale | 起始的Y方向上相对自身的缩放比例 | 类型float |
toYScale | 结尾的Y方向上相对自身的缩放比例 | 类型float |
pivotX | 缩放起点X轴坐标 | 可以是数值、百分数、百分数p |
pivotY | 缩放起点Y轴坐标 | 取值及意义与pivotX一样 |
Translate属性详解
属性名称 | 作用 | 备注 |
fromXDelta | 起始点X轴坐标 | 可以是数值、百分数、百分数p 三种样式 |
fromYDelta | 起始点Y坐标 | 同上 |
toXDelta | 结束点X坐标 | 无 |
toYDelta | 结束点Y坐标 | 无 |
2.属性动画
一般直接用java来实现:
//指定要操作的View、要操作的属性、初始值、结束值
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mRvFl, "rotation", 0f, 360f);
objectAnimator.setDuration(2000);
objectAnimator.start();
状态监听接口:
public static interface AnimatorListener {
//开始
void onAnimationStart(Animator animation);
//结束
void onAnimationEnd(Animator animation);
//取消
void onAnimationCancel(Animator animation);
//重复
void onAnimationRepeat(Animator animation);
}
//添加方法
public void addListener(AnimatorListener listener);
3.帧动画
(虽然不是Drawable,但其实使用起来,就像是在使用Drawable)
在src/drawable下定义帧动画frame_anim.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<!-- oneshot属性定义是否只播放一次,false表示循环播放 -->
<!-- duration 延时时间 单位毫秒 -->
<item
android:drawable="@drawable/pic_01"
android:duration="200" />
<item
android:drawable="@drawable/pic_02"
android:duration="200" />
<item
android:drawable="@drawable/pic_03"
android:duration="200" />
<item
android:drawable="@drawable/pic_04"
android:duration="200" />
<item
android:drawable="@drawable/pic_05"
android:duration="200" />
<item
android:drawable="@drawable/pic_06"
android:duration="200" />
<item
android:drawable="@drawable/pic_07"
android:duration="200" />
</animation-list>
java代码中的调用:
AnimationDrawable anim = (AnimationDrawable) getResources().getDrawable(R.drawable.frame_anim);
imageView.setImageDrawable(anim);
//开始播放
anim.start();
..........
//停止播放
anim.stop();
相关参考:
《Android开发艺术探索》
Android - 动画(帧动画,补间动画,属性动画,以及插值器) - 简书