Android中的动画分为三类, 即帧动画、补间动画和属性动画。帧动画使用简单,就是把一系列图片按照一定的顺序进行排列,然后顺序播放,在实际的开发中一般不使用(因为容易出现OOM)。下面介绍今天的主角。
优点:执行效率高, 使用简单。
缺点:不具备交互性(相对于属性动画)。比如通过平移把view从A点移动到B点,此时点击B点不能触发对象的点击事件, 而点击A点可以触发。
1、常用属性:
android:interpolator 动画的差值器, 影响动画的速率, 可以不写 默认使用加速减速差值器
android : shareInterpolator 表示动画集合是否共用一个差值器, 如果集合没有指定,那么子组件如果需要 则需要单独指定, 如果为true 自动画的差值器没有效果
android : duration 动画的时间 默认为300ms,刷新频率为 10ms/帧
android : fillAfter 动画结束后view停留的位置, true 表示停留在结束位置,false 表示动画结束放回开始位置
各种动画的独有属性
透明度动画
android: fromAlpha view透明度的起始值
android:toAlpha view透明度的结束值
平移动画
android : fromXDelta 表示X轴的起始值
android : toXDelta 表示X轴的结束值
android : fromYDelta 表示Y轴的起始值
android:toYDleta 表示Y轴的结束值
旋转动画
android : fromDegrees 旋转开始的角度
android : toDegrees 旋转结束的角度
android : pivotX 旋转轴点X轴坐标值
android : pivotY 旋转轴点Y轴坐标值
缩放动画
android : fromXScale 水平方向旋转的起始值
android : toXScale 水平方向旋转的结束值
android : fromYScale 垂直方向旋转的起始值
android : toYScale 垂直方向旋转的结束值
android : pivotX 旋转轴点X轴的坐标值
三、补间动画的自定义
实现步骤:
1、自定义一个类 继承 Animation
2、重写 initialize() 方法 进行初始化操作
3、重写 applyTransformation() 实现自定义动画, 一般需要借助于 Camera类(android.graphics.Camera)
applyTransformation方法 的两个参数
float interpolatedTime : 差值器完成的时间 取值范围 0.0 - 1.0
Transformation t : 转换器对象 可以获取一个矩(Matrix)阵对象
示例代码如下: (本段代码摘自 《Android开发艺术探索》)
android:delay 表示动画延迟的时间
android:animationOrder 表示子组件动画的顺序 normal 顺序显示 reverse 逆序显示 random 随机显示
android:animation 引用一个动画 表示子组件显示的动画
b. 在 res/anim 目录下定义需要引入的动画
使用动态代码实现的方式如下:
activity之间的切换默认是自带动画效果的, 有时为了满足产品需求 ,需要更改动画效果。具体实现如下,
调用 overridePendingTransition(int enterAnim, int exitAnim) 参数分别为进入动画和退出动画的资源ID
注意: 该方法需要在startActivity() 和 finish() 之后调用动画才会生效。
一、概念介绍:
补间动画又叫视图动画,是Android最早支持的动画,是通过对某一对象不断做图片变换(平移, 旋转, 缩放, 透明度)来实现动画效果的,是一种渐变式动画,支持自定义。优点:执行效率高, 使用简单。
缺点:不具备交互性(相对于属性动画)。比如通过平移把view从A点移动到B点,此时点击B点不能触发对象的点击事件, 而点击A点可以触发。
二、相关属性介绍及使用
名称 | 标签 | 对应的Java类 | 效果 |
透明度动画 | <alpha> | AlphaAnimation | 改变view的透明度 |
平移动画 | <translate> | TranslateAnimation | 移动view |
旋转动画 | <rotate> | RotateAnimation | 旋转view |
缩放动画 | <scale> | ScalaAnimation | 放大或缩小view |
1、常用属性:
android:interpolator 动画的差值器, 影响动画的速率, 可以不写 默认使用加速减速差值器
android : shareInterpolator 表示动画集合是否共用一个差值器, 如果集合没有指定,那么子组件如果需要 则需要单独指定, 如果为true 自动画的差值器没有效果
android : duration 动画的时间 默认为300ms,刷新频率为 10ms/帧
android : fillAfter 动画结束后view停留的位置, true 表示停留在结束位置,false 表示动画结束放回开始位置
各种动画的独有属性
透明度动画
android: fromAlpha view透明度的起始值
android:toAlpha view透明度的结束值
平移动画
android : fromXDelta 表示X轴的起始值
android : toXDelta 表示X轴的结束值
android : fromYDelta 表示Y轴的起始值
android:toYDleta 表示Y轴的结束值
旋转动画
android : fromDegrees 旋转开始的角度
android : toDegrees 旋转结束的角度
android : pivotX 旋转轴点X轴坐标值
android : pivotY 旋转轴点Y轴坐标值
缩放动画
android : fromXScale 水平方向旋转的起始值
android : toXScale 水平方向旋转的结束值
android : fromYScale 垂直方向旋转的起始值
android : toYScale 垂直方向旋转的结束值
android : pivotX 旋转轴点X轴的坐标值
android : pivotY 旋转轴点的Y轴的坐标值
2、xml实现动画(此处使用移动动画进行示例,其他动画操作类似)
xml实现动画(此处使用移动动画为例, 其他的实现类似)
a、在res/anim目录下创建一个xml文件, 进行动画的实现。b、在代码中通过 Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim);获取动画对象 然后把动画添加到view中并开始动 画,view.startAnimation(animation), 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100"
android:toXDelta="300"
android:fromYDelta="100"
android:toYDelta="300"
android:duration="3000"/>
</set>
在Java文件中进行引用
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim);
view.startAnimation(animation);
3、代码实现动画
TranslateAnimation animation = new TranslateAnimation(100, 300, 100, 300);
animation.setDuration(3000);
view.startAnimation(animation);
三、补间动画的自定义
实现步骤:
1、自定义一个类 继承 Animation
2、重写 initialize() 方法 进行初始化操作
3、重写 applyTransformation() 实现自定义动画, 一般需要借助于 Camera类(android.graphics.Camera)
applyTransformation方法 的两个参数
float interpolatedTime : 差值器完成的时间 取值范围 0.0 - 1.0
Transformation t : 转换器对象 可以获取一个矩(Matrix)阵对象
示例代码如下: (本段代码摘自 《Android开发艺术探索》)
public class Rotate3dAnimation extends Animation {
private int mCenterX;
private int mCenterY;
private float mFromDegrees;
private float mToDegrees;
private float mDepthZ;
private boolean isReverse; //是否反向
private Camera mCamera;
public Rotate3dAnimation(int mCenterX, int mCenterY, float mFromDegrees, float mToDegrees, float mDepthZ, boolean isReverse) {
this.mCenterX = mCenterX;
this.mCenterY = mCenterY;
this.mFromDegrees = mFromDegrees;
this.mToDegrees = mToDegrees;
this.mDepthZ = mDepthZ;
this.isReverse = isReverse;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mCamera = new Camera();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
Matrix matrix = t.getMatrix();
int centerX = mCenterX;
int centerY = mCenterY;
float degrees = mFromDegrees + (mToDegrees - mFromDegrees) * interpolatedTime;
Camera camera = mCamera;
camera.save();
if (isReverse)
camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
else
camera.translate(0.0f, 0.0f, mDepthZ * (1 - interpolatedTime));
camera.rotateY(degrees);
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
四、补间动画的特殊使用
1、 layoutAnimation 的使用
layoutAnimation 作用于viewGroup 表示为viewGroup添加一个动画,当加载viewGroup的子组件时, 会具有该动画效果
实现步骤:
a. 在res/anim 目录下创建一个xml 文件 进行layoutAnimation的设置
<?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/anim_item"/>
android:delay 表示动画延迟的时间
android:animationOrder 表示子组件动画的顺序 normal 顺序显示 reverse 逆序显示 random 随机显示
android:animation 引用一个动画 表示子组件显示的动画
b. 在 res/anim 目录下定义需要引入的动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="1"
android:toAlpha="0"
android:duration="3000"/>
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:duration="3000"/>
</set>
c. 在xml 布局文件中通过
android:layoutAnimation 属性引入定义的layoutAnimation 文件,
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@anim/anim_layout"
android:background="#fff4f7f9"
android:divider="#ffdddbdb"
android:dividerHeight="1dp"
android:id="@+id/listView"/>
使用动态代码实现的方式如下:
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(controller);
2、 自定义activity之间切换的动画效果
activity之间的切换默认是自带动画效果的, 有时为了满足产品需求 ,需要更改动画效果。具体实现如下,
调用 overridePendingTransition(int enterAnim, int exitAnim) 参数分别为进入动画和退出动画的资源ID
注意: 该方法需要在startActivity() 和 finish() 之后调用动画才会生效。
private void goActivity(Class clzz){
Intent intent = new Intent();
intent.setClass(this, clzz);
startActivity(intent);
finish();
overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
}
Fragment 之间也可以自定义切换动画, 由于Frangment是API11 引入的, 所以要采用v4包下的Fragment(解决兼容性问题) 。通过使用FragmentTransaction类中的
setCustomAnimations( int enter, int exit) 实现切换动画。