您的位置:首页 > 移动开发 > Android开发

Android动画深入解析01

2016-08-06 18:25 591 查看
一,android动画分为好几种,常用的是view动画,包括 TranslateAnimation, ScaleAnimation,AlphaAnimation,RotateAnimation,第二种是Drawable动画(即帧动画),这种动画就是播放一组图片,但是要注意防止OOM,第三种动画是Api11以上也就是3.0引入的,PropertyAnimation(属性动画),低版本可以通过引入兼库来实现

<?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 动画 oom