Android动画

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android动画相关的知识,希望对你有一定的参考价值。

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;
    }

 







以上是关于Android动画的主要内容,如果未能解决你的问题,请参考以下文章

Android使用片段在viewpager中的页面滚动上放置动画

Android 动画布局和视图

如何在Android中加载带有动画的cardview GridView?

Android TV(leanback)中的持久标头片段(禁用动画)

片段交易动画:滑入滑出

java 将循环显示和不显示过渡动画添加到Android片段