Android当中的四种Animation动画:
1.Tween Animation 变换动画
2.Frame Animation 帧动画
3.Layout Animation 布局动画
4.Property Animation 属性动画
实现原理:每次绘制视图时view所在的viewGroup函数获取该view的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧。如果动画没有完成,就继续调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。
Tween Animation
Alpha:渐变透明度动画
Scale:渐变尺寸缩放动画
Translate:位置移动动画
Rotate:旋转动画
共同属性:
(1)Duration:动画持续时间(单位:毫秒)
(2)fillAfter:设置为true,动画转换在动画结束之后被应用
(3)fillBefore:设置为true,动画转换在动画开始之前被应用
(4)interpolator:动画插入器(加速/减速插入器)
(5)repeateCount:动画重复次数
(6)repeateMode:顺序重复/倒序重复
(7)startOffeset:动画之间的时间间隔
Animation实现方式:
(1)配置文件(/res/anim)—— alpha、scale、translate、rotate
(2)java代码实现 —— AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation
示例:
java代码方式:
//创建Alpha动画,透明度从10%到100% Animation alpha = new AlphaAnimation(0.1f, 1.0f); //设置时间间隔为5秒 alpha.setDuration(5000); //开始播放 img.startAnimation(alpha);
加载布局文件方式:
<?xml version="1.0" encoding="utf-8"?> <ScaleAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:valueFrom="1.0" android:valueTO="2.0" </ScaleAnimation>
//创建动画 Animation scale = AnimationUtils.loadAnimation(TweenActivity.this, R.res.anim.scale_anim); //开始播放 img.startAnimation(scale);
AlphaAnimation 透明度动画
(1)fromAlpha:动画起始时的透明度
(2)toAlpha:动画终止时的透明度
0.0表示完全透明,1.0表示完全不透明
ScaleAnimation 伸缩动画
(1)fromXScale、toXScale:分别是动画起始和结束时x坐标的伸缩尺寸
(2)fromYScale、toYScale:分别是动画起始和结束时y坐标的伸缩尺寸
(3)pivotX、pivotY:分别是伸缩动画相对于x、y坐标开始的位置(50%、50%代表当前图片的中心位置)
TranslateAnimation 位移动画
(1)fromXDelta、fromYDelta:分别是位移之前的x、y坐标
(2)toXDelta、toYDelta:分别是位移之后的x、y坐标
RotateAnimation 旋转动画
(1)fromDegrees、toDegrees:分别是动画旋转前和旋转后的角度
(2)pivotX、pivotY:分别是旋转动画相对于x、y的坐标开始位置
实现动画续播:
(1)实现onAnimationListener接口
(2)设置延迟时间startOffset
(3)利用Animation的setRepeatCount和setRepeatMode来实现动画的循环播放
Activity切换动画:
使用overidePendingTransition方法
参数:第二个Activity进入时的动画,第一个Activity退出时的动画
LayoutAnimation布局动画
为view Groups添加动画
使用LayoutAnimationController
FramLayout逐帧动画
使用animation-list标签来分组一个item标签集合
定义要显示的图片
指定显示的时间(以毫秒为单位)
属性动画Animator与传统动画Animation
Animation是不断调用ondraw方法重绘界面来实现动画效果,Animator是调用操纵属性的get、set方法真实的改变一个属性。
Animation只是重绘了动画,响应位置没有发生相应的改变,不断的重绘界面,耗费资源
ObjectAnimator
//使用单个动画
ObjectAnimator.ofFloat(imageView, "TranslationX", 0F, 200F).setDuration(1000).start(); //使用多个动画连播
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat(translationX, 300f);
PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0.1f); ObjectAnimator.ofPropertyValusHolder(view, pvh1, pvh2).setDuration(1000).start();
//使用AnimatorSet实现动画连播 AnimatorSet set = new AnimatorSet(); set.playTogether(animator1, animator2, animator3); set.setDuration(1000); set.start();
使用PropertyValuesHolder和AnimatorSet都可以实现动画连播,AnimatorSet能实现更为精细的顺序控制。通过playTogether()、playSequentially()、animSet.play().with()、before()、after()这些方法来控制多个动画的协同工作方式,从而做到对多个动画播放顺序的精细控制。
动画的监听事件
一个完整的动画具有Start、Repeat、End、Cancel四个过程,通过Android提供的借口,可以很方便的监听到这四个事件。
animator.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) {} @Override public void onAnimationRepeat(Animator animation) {} @Override public void onAnimationEnd(Animator animation) {} @Override public void onAnimationCancel(Animator animation) {} });
可以使用AnimatorListenerApdater来选择实现我们关心的事件。
ValueAnimator
ValueAnimator本身不提供任何动画,它更像一个数值发生器,用来产生具有一定规律的数字,从而让调用者来控制动画的实现过程。
ValueAnimator animator = ValueAnimator.ofFloat(1, 100); animator.setTarget(view); animator.setDuration(1000).start(); animator.addUpdateListener(new AnimatorUpdateListener() { @Override private void onAnimationUpdate(ValueAnimator animation) { float value = animation.getAnimatedValue(); } });
view的animate方法
Android3.0后,Google给View增加了animate方法来直接驱动属性动画。
view.animate() .alpha(0) .y(300) .setDuration(300) .withStartAction(new Runnable() { @Override public void run() { } }) .withEndAction( { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { } }); } }).start();
Interpolators 插值器
通过插值器,可以定义动画变换速率
animator.setInterpolator();
自定义动画
applyTransfomation(float interpolatedTime, Transformation t);
public Animation myAnim() { Animation animation = new Animation() { float mCenterWidth; float mCenterHeight; int mRotateY = -50; Camera mCamera = new Camera(); @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); //设置默认时长 setDuration(2000); //动画结束后保留状态 setFillAfter(true); //设置默认插值器 setInterpolator(new BounceInterpolator()); mCenterHeight = height/2; mCenterWidth = width/2; } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); final android.graphics.Matrix matrix = t.getMatrix(); mCamera.save(); //使用Camera设置旋转的角度 mCamera.rotateY(mRotateY * interpolatedTime); //将旋转变换作用到matrix上 mCamera.getMatrix(matrix); mCamera.restore(); //通过pre方法设置矩阵作用前的偏移量来改变旋转中心 matrix.preTranslate(mCenterWidth, mCenterHeight); matrix.postTranslate(-mCenterWidth, -mCenterHeight); } }; return animation; }