AndroidView之动画篇(二)--补间动画(TweenAnimation)

一 前言

1.Android中的TweenAnimation由四种类型种类型:

Alpha

Scale

Translation

Rotate

2.定义TweenAnimation由两种方式:

xml资源文件和代码

3.与插值器组合可以实现丰富的效果

二 Alpha

    /**
     * 透明度
     */
    private void alpha() {
        AlphaAnimation alphaAnimation=new AlphaAnimation(0.0f,1f);
        //动画持续时间
        alphaAnimation.setDuration(3000);
        //设置动画结束之后的状态是否是动画的最终状态,true,表示是保持动画结束时的状态
        alphaAnimation.setFillAfter(true);
        //设置动画结束时的状态是否开始是的状态,ture,表示是开始时的状态
        alphaAnimation.setFillBefore(true);
        //设置动画重复模式,反转REVERSE和重新开始RESTART
        alphaAnimation.setRepeatMode(AlphaAnimation.REVERSE);
        //设置动画播发次数
        alphaAnimation.setRepeatCount(5);
        //开始动画
        ivAnimation.startAnimation(alphaAnimation);
    }

三 Scale

    private void scale() {
        ScaleAnimation scale = new ScaleAnimation(1.0f, 4.0f, 1.0f, 4.0f,
                Animation.RELATIVE_TO_SELF, 0.0f,
                Animation.RELATIVE_TO_SELF, 0.0f);
        scale.setDuration(2000);
        scale.setFillBefore(true);
        scale.setRepeatMode(AlphaAnimation.RESTART);
        scale.setRepeatCount(2);
        ivAnimation.startAnimation(scale);
    }

四 Translation

    private void translation() {
        TranslateAnimation translate=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0F,
                Animation.RELATIVE_TO_SELF,2f,Animation.RELATIVE_TO_SELF,0f,
                Animation.RELATIVE_TO_SELF,2F);
        translate.setDuration(1000);
        translate.setFillAfter(true);
        ivAnimation.startAnimation(translate);

    }

五Rotate

    private void translation() {
        TranslateAnimation translate=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0F,
                Animation.RELATIVE_TO_SELF,2f,Animation.RELATIVE_TO_SELF,0f,
                Animation.RELATIVE_TO_SELF,2F);
        translate.setDuration(1000);
        translate.setFillAfter(true);
        ivAnimation.startAnimation(translate);

    }

六 插值器(Interpolation)

InterPolation是干嘛的?
根据类型不同,采用不同的算法计算出在补间动画期间所需要插入帧的密度和位置,使得动画能以匀速、加速、减速、抛物线等多种速度进行变化。
AccelerateDecelerateInterpolator
在动画开始与介绍的地方速率改变比较慢,在中间的时候加速

AccelerateInterpolator
在动画开始的地方速率改变比较慢,然后开始加速

AnticipateInterpolator
开始的时候向后然后向前甩

AnticipateOvershootInterpolator
开始的时候向后然后向前甩一定值后返回最后的值

BounceInterpolator
动画结束的时候弹起

CycleInterpolator
动画循环播放特定的次数,速率改变沿着正弦曲线

DecelerateInterpolator
在动画开始的地方快然后慢

LinearInterpolator
以常量速率改变

OvershootInterpolator
向前甩一定值后再回到原来位置

    private void translation() {
        TranslateAnimation translate=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0F,
                Animation.RELATIVE_TO_SELF,2f,Animation.RELATIVE_TO_SELF,0f,
                Animation.RELATIVE_TO_SELF,2F);
        translate.setDuration(1000);
        translate.setFillAfter(true);
        //在动画开始的地方速率改变比较慢,然后开始加速
        translate.setInterpolator(new AccelerateInterpolator());
        ivAnimation.startAnimation(translate);

    }

七 其它

1.当setFillAfter与 setFillBefore一起使用时只有setFillAfter生效

2.结束动画方法有哪几种:

   private void translation() {
        TranslateAnimation translate=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0F,
                Animation.RELATIVE_TO_SELF,2f,Animation.RELATIVE_TO_SELF,0f,
                Animation.RELATIVE_TO_SELF,2F);
        translate.setDuration(1000);
        translate.setFillAfter(true);
        //在动画开始的地方速率改变比较慢,然后开始加速
        translate.setInterpolator(new AccelerateInterpolator());
        ivAnimation.startAnimation(translate);

        //结束动画方法1
        ivAnimation.clearAnimation();
        //结束动画方法2
        translate.cancel();
    }

3 动画监听

   private void translation() {
        TranslateAnimation translate=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0F,
                Animation.RELATIVE_TO_SELF,2f,Animation.RELATIVE_TO_SELF,0f,
                Animation.RELATIVE_TO_SELF,2F);
        translate.setDuration(1000);
        translate.setFillAfter(true);
        //在动画开始的地方速率改变比较慢,然后开始加速
        translate.setRepeatMode(AlphaAnimation.RESTART);
        translate.setRepeatCount(3);
        translate.setInterpolator(new AccelerateInterpolator());
        ivAnimation.startAnimation(translate);

//        //清除动画
//        ivAnimation.clearAnimation();
//        //同样cancel()也能取消掉动画
//        translate.cancel();


        translate.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                Log.e("============","动画开始了");
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Log.e("============","动画结束了");
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                Log.e("============","动画动画重复调用");

            }
        });


    }

全部代码

TweenAnimationActivity.class

package com.myanimation.chen.myanimation;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

/**
 * TweenAnimation
 * Created by xq on 2018/4/7.
 */

public class TweenAnimationActivity extends Activity {


    private ImageView ivAnimation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.aty_tween_animation);
        ivAnimation = findViewById(R.id.iv_animation);
    }


    public void onTween(View view) {

        switch (view.getId()) {
            case R.id.tv_alpha:
                //透明度
                alpha();
                break;
            case R.id.tv_scale:
                //比例
                scale();
                break;

            case R.id.tv_translation:
                //平移
                translation();
                break;

            case R.id.tv_rotate:
                //旋转
                rotate();
                break;


        }

    }


    /**
     * 透明度
     */
    private void alpha() {
        AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1f);
        //动画持续时间
        alphaAnimation.setDuration(3000);
        //设置动画结束之后的状态是否是动画的最终状态,true,表示是保持动画结束时的状态
        alphaAnimation.setFillAfter(true);
        //设置动画结束时的状态是否开始是的状态,ture,表示是开始时的状态
        alphaAnimation.setFillBefore(true);
        //设置动画重复模式,反转REVERSE和重新开始RESTART
        alphaAnimation.setRepeatMode(AlphaAnimation.REVERSE);
        //设置动画播发次数
        alphaAnimation.setRepeatCount(5);
        //开始动画
        ivAnimation.startAnimation(alphaAnimation);
    }


    private void scale() {
        ScaleAnimation scale = new ScaleAnimation(1.0f, 4.0f, 1.0f, 4.0f,
                Animation.RELATIVE_TO_SELF, 0.0f,
                Animation.RELATIVE_TO_SELF, 0.0f);
        scale.setDuration(2000);
        scale.setFillBefore(true);
        scale.setRepeatMode(AlphaAnimation.RESTART);
        scale.setRepeatCount(2);
        ivAnimation.startAnimation(scale);
    }

    private void translation() {
        TranslateAnimation translate=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0F,
                Animation.RELATIVE_TO_SELF,2f,Animation.RELATIVE_TO_SELF,0f,
                Animation.RELATIVE_TO_SELF,2F);
        translate.setDuration(1000);
        translate.setFillAfter(true);
        //在动画开始的地方速率改变比较慢,然后开始加速
        translate.setRepeatMode(AlphaAnimation.RESTART);
        translate.setRepeatCount(3);
        translate.setInterpolator(new AccelerateInterpolator());
        ivAnimation.startAnimation(translate);

//        //清除动画
//        ivAnimation.clearAnimation();
//        //同样cancel()也能取消掉动画
//        translate.cancel();


        translate.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                Log.e("============","动画开始了");
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Log.e("============","动画结束了");
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                Log.e("============","动画动画重复调用");

            }
        });


    }

    private void rotate() {
        RotateAnimation rotate=new RotateAnimation(0,360,
                RotateAnimation.RELATIVE_TO_SELF,0.5F,
                RotateAnimation.RELATIVE_TO_SELF,0.5F);
        rotate.setDuration(1500);
        rotate.setFillAfter(true);
        rotate.setRepeatMode(AlphaAnimation.RESTART);

        ivAnimation.startAnimation(rotate);

    }


}

any_tween_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="15dp"
        android:text="TweenAnimation" />

    <View style="@style/Divede" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/tv_alpha"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:onClick="onTween"
            android:paddingBottom="15dp"
            android:paddingTop="15dp"
            android:text="alpha" />

        <Button
            android:id="@+id/tv_scale"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:onClick="onTween"
            android:paddingBottom="15dp"
            android:paddingTop="15dp"
            android:text="scale" />

        <Button
            android:id="@+id/tv_translation"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:onClick="onTween"
            android:paddingBottom="15dp"
            android:paddingTop="15dp"
            android:text="translation" />

        <Button
            android:id="@+id/tv_rotate"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:onClick="onTween"
            android:paddingBottom="15dp"
            android:paddingTop="15dp"
            android:text="rotate" />

    </LinearLayout>

    <ImageView
        android:id="@+id/iv_animation"
        android:layout_width="120dp"
        android:layout_height="80dp"
        android:src="@drawable/icon_pic" />

</LinearLayout>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 【Android 动画】 动画分类补间动画(Tween动画)帧动画(Frame 动画)属性动画(Property ...
    Rtia阅读 6,102评论 1 38
  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,690评论 0 10
  • Android应用中经常需要使用到各式各样的动画效果,产品设计总是已他们重破天机的想象给出看着就很难实现的动画,不...
    熊sir要早睡早起阅读 798评论 0 0
  • 文章主要内容来源《Android开发艺术探索》,部分内容来源网上的文章,文中会有链接。 Android系统提供了两...
    developerzjy阅读 1,744评论 0 5
  • 转载一篇高质量博文,原地址请戳这里转载下来方便今后查看。1 背景不能只分析源码呀,分析的同时也要整理归纳基础知识,...
    Elder阅读 1,937评论 0 24