Android动画深入解析01
2016-08-06 18:25
591 查看
一,android动画分为好几种,常用的是view动画,包括 TranslateAnimation, ScaleAnimation,AlphaAnimation,RotateAnimation,第二种是Drawable动画(即帧动画),这种动画就是播放一组图片,但是要注意防止OOM,第三种动画是Api11以上也就是3.0引入的,PropertyAnimation(属性动画),低版本可以通过引入兼库来实现
view动画可以是一个set集合,组成一组动画
1, 平移动画 它可以让view在水平和竖直方向上完成平移动画效果;
android:fromXDelta 表示x的起始值,比如10;
android:toXDelta 表示x的结束值,比如100;
android:fromYDelta 表示Y的起始值,比如100;
android:toYDelta 表示Y的结束值,比如10;
2, 缩放动画 它可以让view具有放大和缩小的动画效果
android:fromXScale 水平方向缩放的起始值, 比如0.2;
android:toXScale 水平方向缩放的结束值,比如1.2;
android:fromYScale 竖直方向缩放的起始值,比如0.5;
android:toYScale 竖直方向缩放的结束值,比如0.6;
android:pivotX 缩放轴点的x坐标,他会影响缩放的效果
android:pivotY 缩放轴点的Y坐标 他会影响缩放的效果
这里要注意默认情况下轴点是view的中心点,这个时候在水平方向进行缩放的话会导致view向左右2个方向同时进行缩放,但是如果轴dia点设置在view的右边界,那么view就只会向左边进行缩放,反之,则向右边进行缩放
3, 旋转动画 可以让view具有旋转的动画效果,
android:fromDegrees 旋转开始的角度 比如0
android:toDegrees 旋转结束的角度 比如10
android:pivotX 旋转的轴点x坐标
android:pivotY 旋转的轴点Y坐标
在旋转动画中也有轴点的概念,他会影响到旋转的具体效果,在旋转动画中,轴点扮演者旋转的角色,即view是围绕着轴点进行旋转的,默认情况下轴点为view的中心点,考虑一种情况,view围绕着自己的中心和围绕自己的左下角旋转90度显然不是一种轨迹
4, 透明度动画 他可以改变view的透明度
android:fromAlpha 表示透明度的起始值 比如0.1;
android:toAlpha 表示透明度的结束值 比如0.2;
上面介绍的是view动画的xml格式,除了上面的属性外,view动画还有一些常用的属性
android:duration 动画持续的时间
android:fillAfter 动画结束以后view是否停留在结束位置,true表示view 停留在结束的位置 false则不停留
用法 AnimationUtils.loadAnimation(context, R.anim.res_name);
view.startAnimation(animation);
当然上述的xml也可以通过java代码来实现
比如
当然,如果你想对animation进行监听,可以通过Animation的setAnimationListener来监听动画的过程。
二,自定义view动画
自定义动画必须要继承Animation,然后重写initialize, applyTransformation这2个方法,
在initialize方法中初始化工作,
在applyTransformation方法中进行相应的矩阵变化,
很多时候需要采用camera来简化矩阵变化的过程,说矩阵比较复杂,主要是自定义view动画的过程主要就是矩阵变换的过程。这里真后悔大学的时候没有把线性代数学好。后期有需要自行脑补了。
三,帧动画(Drawable动画)
帧动画比较简单,就是按顺序播放一组事先定义的图片,类似于播放电影,不同于view动画,系统提供了另外一个类AnimationDrawable来使用帧动画,
1,自定义xml文件
然后将上述的Drawable作为view的背景并start即可
但是帧动画容易引起OOM,所以使用时尽量避免大图片
四,view动画的特殊使用场景
view 动画主要可以用来控制ViewGroup中view的出场效果,Activity之间的切换效果
1,LayoutAnimation
该动画作用于ViewGroup,为ViewGroup指定一个动画,这样当他的字元素出场时都会具有这样的动画效果,这种效果常被用在listview上,我们常看到listview中每个item出场都有一个动画,其实就是这么做的,首先定义xml文件
android:delay 表示子元素开始动画的延迟时间,比如元素入场动画时间周期为300ms,那么0.5表示每个元素都要延迟150ms才能播放入场动画,总体来说,第一个字元素延迟150ms开始播放入场动画,第二个字元素延迟300ms开始播放入场动画;
android:animationOrder 表示子元素动画的顺序,有三种选项 normal 正常顺序, reverse 逆向顺序, random 随即;
android:animation 为子元素指定具体的入场动画
为ViewGroup指定android:layoutAnimation属性,那么这个ViewGroup子元素出场就具有动画了
也可以通过代码来加载LayoutAnimation
2, Activity的切换效果
activity有默认的切换效果,如果需要自定义,那么我们会用到overridePendingTransition(int enterAnim, int exitAnim)这个方法。这个方法必须在startActivity(intent)或者finish()之后被调用才能生效
enterAnim Activity被打开时,所需的动画资源id
exitAnim Activity被关闭时,所需动画资源id
当启动一个Activity时
当退出一个Activity时
Fragment也可以添加动画,我们可以通过FragmentTransation.setCustomAnimations()方法添加切换动画。
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:fromAlpha="float" android:toAlpha="float" /> <rotate android:fromDegrees="float" android:toDegrees="float" android:pivotX="float" android:pivotY="float" /> <scale android:fromXScale="float" android:toXScale="float" android:fromYScale="float" android:toYScale="float" android:pivotY="float" android:pivotX="float" /> <translate android:fromXDelta="float" android:toXDelta="float" android:fromYDelta="float" android:toYDelta="float" /> </set>
view动画可以是一个set集合,组成一组动画
1, 平移动画 它可以让view在水平和竖直方向上完成平移动画效果;
android:fromXDelta 表示x的起始值,比如10;
android:toXDelta 表示x的结束值,比如100;
android:fromYDelta 表示Y的起始值,比如100;
android:toYDelta 表示Y的结束值,比如10;
2, 缩放动画 它可以让view具有放大和缩小的动画效果
android:fromXScale 水平方向缩放的起始值, 比如0.2;
android:toXScale 水平方向缩放的结束值,比如1.2;
android:fromYScale 竖直方向缩放的起始值,比如0.5;
android:toYScale 竖直方向缩放的结束值,比如0.6;
android:pivotX 缩放轴点的x坐标,他会影响缩放的效果
android:pivotY 缩放轴点的Y坐标 他会影响缩放的效果
这里要注意默认情况下轴点是view的中心点,这个时候在水平方向进行缩放的话会导致view向左右2个方向同时进行缩放,但是如果轴dia点设置在view的右边界,那么view就只会向左边进行缩放,反之,则向右边进行缩放
3, 旋转动画 可以让view具有旋转的动画效果,
android:fromDegrees 旋转开始的角度 比如0
android:toDegrees 旋转结束的角度 比如10
android:pivotX 旋转的轴点x坐标
android:pivotY 旋转的轴点Y坐标
在旋转动画中也有轴点的概念,他会影响到旋转的具体效果,在旋转动画中,轴点扮演者旋转的角色,即view是围绕着轴点进行旋转的,默认情况下轴点为view的中心点,考虑一种情况,view围绕着自己的中心和围绕自己的左下角旋转90度显然不是一种轨迹
4, 透明度动画 他可以改变view的透明度
android:fromAlpha 表示透明度的起始值 比如0.1;
android:toAlpha 表示透明度的结束值 比如0.2;
上面介绍的是view动画的xml格式,除了上面的属性外,view动画还有一些常用的属性
android:duration 动画持续的时间
android:fillAfter 动画结束以后view是否停留在结束位置,true表示view 停留在结束的位置 false则不停留
用法 AnimationUtils.loadAnimation(context, R.anim.res_name);
view.startAnimation(animation);
当然上述的xml也可以通过java代码来实现
比如
AlphaAnimation animation = new AlphaAnimation(0, 1); animation.setDuration(1000); view.startAnimation(animation);
当然,如果你想对animation进行监听,可以通过Animation的setAnimationListener来监听动画的过程。
二,自定义view动画
package com.mhua.viewdemo; import android.content.Context; import android.graphics.Camera; import android.graphics.Matrix; import android.util.AttributeSet; import android.view.animation.Animation; import android.view.animation.Transformation; /** * Created by android_swift on 16/8/6. */ public class Rotate3dAnimation extends Animation { private final float mFromDegrees; private final float mToDegrees; private final float mCenterX; private final float mCenterY; private final float mDepthZ; private final boolean mReverse; private Camera mCamara; public Rotate3dAnimation(Context context, AttributeSet attrs, float mFromDegrees, float mToDegrees, float mCenterX, float mCenterY, float mDepthZ, boolean mReverse) { super(context, attrs); this.mFromDegrees = mFromDegrees; this.mToDegrees = mToDegrees; this.mCenterX = mCenterX; this.mCenterY = mCenterY; this.mDepthZ = mDepthZ; this.mReverse = mReverse; } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); mCamara = new Camera(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); final float fromDegrees = mFromDegrees; float degress = fromDegrees + (mToDegrees - mFromDegrees) * interpolatedTime; final float centerX = mCenterX; final float centerY = mCenterY; final Camera camera = mCamara; final Matrix matrix = t.getMatrix(); camera.save(); if (mReverse){ camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); } else { camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime)); } camera.rotateY(degress); camera.getMatrix(matrix); camera.restore(); matrix.preTranslate(-centerX, -centerY); matrix.postTranslate(centerX, centerY); } }
自定义动画必须要继承Animation,然后重写initialize, applyTransformation这2个方法,
在initialize方法中初始化工作,
在applyTransformation方法中进行相应的矩阵变化,
很多时候需要采用camera来简化矩阵变化的过程,说矩阵比较复杂,主要是自定义view动画的过程主要就是矩阵变换的过程。这里真后悔大学的时候没有把线性代数学好。后期有需要自行脑补了。
三,帧动画(Drawable动画)
帧动画比较简单,就是按顺序播放一组事先定义的图片,类似于播放电影,不同于view动画,系统提供了另外一个类AnimationDrawable来使用帧动画,
1,自定义xml文件
<?xml version="1.0" encoding="utf-8"?> <anim-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" > <item android:drawable="@drawable/lottery_01" android:duration="80"> </item> <item android:drawable="@drawable/lottery_02" android:duration="80"> </item> <item android:drawable="@drawable/lottery_03" android:duration="80"> </item> <item android:drawable="@drawable/lottery_04" android:duration="80"> </item> <item android:drawable="@drawable/lottery_05" android:duration="80"> </item> <item android:drawable="@drawable/lottery_06" android:duration="80"> </item> <item android:drawable="@drawable/lottery_07" android:duration="80"> </item> <item android:drawable="@drawable/lottery_08" android:duration="80"> </item> <item android:drawable="@drawable/lottery_09" android:duration="80"> </item> <item android:drawable="@drawable/lottery_10" android:duration="80"> </item> <item android:drawable="@drawable/lottery_11" android:duration="80"> </item> <item android:drawable="@drawable/lottery_12" android:duration="50"> </item> </anim-list>
然后将上述的Drawable作为view的背景并start即可
view.setBackgroundResource(R.drawable.frame_animation); AnimationDrawable drawable = (AnimationDrawable)view.getBackground(); drawable.start();
但是帧动画容易引起OOM,所以使用时尽量避免大图片
四,view动画的特殊使用场景
view 动画主要可以用来控制ViewGroup中view的出场效果,Activity之间的切换效果
1,LayoutAnimation
该动画作用于ViewGroup,为ViewGroup指定一个动画,这样当他的字元素出场时都会具有这样的动画效果,这种效果常被用在listview上,我们常看到listview中每个item出场都有一个动画,其实就是这么做的,首先定义xml文件
<?xml version="1.0" encoding="utf-8"?> <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:delay="0.5" android:animationOrder="normal" android:animation="@anim/view_animation" > </layoutAnimation>
android:delay 表示子元素开始动画的延迟时间,比如元素入场动画时间周期为300ms,那么0.5表示每个元素都要延迟150ms才能播放入场动画,总体来说,第一个字元素延迟150ms开始播放入场动画,第二个字元素延迟300ms开始播放入场动画;
android:animationOrder 表示子元素动画的顺序,有三种选项 normal 正常顺序, reverse 逆向顺序, random 随即;
android:animation 为子元素指定具体的入场动画
为ViewGroup指定android:layoutAnimation属性,那么这个ViewGroup子元素出场就具有动画了
<ListView android:layout_width="match_parent" android:layout_height="match_parent" android:layoutAnimation="@anim/layout_animation" />
也可以通过代码来加载LayoutAnimation
Aninmation animation = AnimationUtils.loadAnimation(context, R.anim.layout_animation); LayoutAnimationController controller = new LayoutAnimationController(animation); controller.setDelay(0.5f); controller.setOrder(LayoutAnimationController.ORDER_NORMAL); viewGroup.setLayoutAnimation(controller);
2, Activity的切换效果
activity有默认的切换效果,如果需要自定义,那么我们会用到overridePendingTransition(int enterAnim, int exitAnim)这个方法。这个方法必须在startActivity(intent)或者finish()之后被调用才能生效
enterAnim Activity被打开时,所需的动画资源id
exitAnim Activity被关闭时,所需动画资源id
当启动一个Activity时
Intent intent = new Intent(context, TargetActivity.class); startActivity(intent); overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
当退出一个Activity时
@Override public void finish(){ super.finish(); overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim); }
Fragment也可以添加动画,我们可以通过FragmentTransation.setCustomAnimations()方法添加切换动画。
相关文章推荐
- Android 属性动画 源码解析 深入了解其内部实现
- Android 属性动画 源码解析 深入了解其内部实现
- Android 属性动画 源码解析 深入了解其内部实现
- Android 动画深入解析
- Android 属性动画 源码解析 深入了解其内部实现
- Android 动画深入解析
- Android 使用XML做动画UI的深入解析
- Android 属性动画 源码解析 深入了解其内部实现
- Android 属性动画(Property Animation) 源码解析 深入了解其内部实现
- Android 属性动画 源码解析 深入了解其内部实现
- Android 使用XML做动画UI的深入解析
- mars老师 [Android视频教学]01_20 XML解析
- android intent深入解析
- Android的Activity屏幕切换动画-左右滑动深入与实战
- [转]Android之父深入解析Android
- android输入法02:openwnn源码解析01—输入流程
- android 之动画的深入学习
- 深入剖析Android动画(Animation) (闪烁、左右摇摆、上下晃动等效果)
- android输入法01:SoftKeyboard源码解析01
- Android ApiDemos示例解析(156):Views->Layouts->TableLayout->01. Basic