Android群英传-第七章 Android动画机制与使用技巧


layout: post
title: Android群英传-第七章 Android动画机制与使用技巧
date: 2015-12-12
categories: blog
tags: [Android,Animation,Animator]
category: Android
description: 总结常用的5中View动画,属性动画,ViewGroup加载动画,Activity跳转动画


代码地址

GitHub

View动画

所有类都继承自Animation

QQ截图20151211111936.png
QQ截图20151211111936.png

  1. AplhaAnimation

            AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
            alphaAnimation.setDuration(2000);
            v.startAnimation(alphaAnimation);
    
  2. TransationAnimation

            TranslateAnimation translateAnimation = new TranslateAnimation(0, 100, 0, 100);
            translateAnimation.setDuration(2000);
            v.startAnimation(translateAnimation);
    
  3. SacleAnimation

            ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0, 1, 0);
            scaleAnimation.setDuration(2000);
            v.startAnimation(scaleAnimation);
    
  4. RotateAnimation

            RotateAnimation rotateAnimation = new RotateAnimation(0, 180,                                        RotateAnimation.RELATIVE_TO_SELF, 
            0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
            rotateAnimation.setDuration(2000);
            v.startAnimation(rotateAnimation);
    
  5. AnimationSet

            AnimationSet animationSet = new AnimationSet(true);
            RotateAnimation rotate = new RotateAnimation(0, 180, RotateAnimation.RELATIVE_TO_SELF, 0.5f,
                    RotateAnimation.RELATIVE_TO_SELF, 0.5f);
            rotate.setDuration(2000);
            ScaleAnimation scale = new ScaleAnimation(1, 0, 1, 0);
            scale.setDuration(2000);
            animationSet.addAnimation(scale);
            animationSet.addAnimation(rotate);
            v.startAnimation(animationSet);
    

    <i>记忆</i>:这里的动画是Animation这个单词,和属性动画的Animator是不同的,别混淆,缩放动画ScaleAnimation和旋转 RotateAnimation需要设置锚点,可以是相对View本身.
    <i>注意</i>:View Animation只是改变了View的绘制,没有改变其属性,比如缩放动画,视图看起来是大小变化了,但是getWidth()取得的值是不会变化的,并且它的View.setonClickListener(...)响应的位置仍然是原位置,不是改变后的位置.

属性动画

Screenshot from 2015-12-13 18-13-20.png
Screenshot from 2015-12-13 18-13-20.png
  1. ValueAnimator

    ValueAnimator本身不提供动画效果,ObjectAnimtor也是继承至ValueAnimator的,他提供一个数值变化的监听,通过监听数值的变化自己实现响应的动画效果

             ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 1000);
             valueAnimator.setDuration(2000);
             valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                 @Override
                 public void onAnimationUpdate(ValueAnimator animation) {
                     Log.v(TAG, animation.getAnimatedValue() + "");
                     v.getLayoutParams().width = (int) animation.getAnimatedValue();
                     v.requestLayout();
                 }
             });
             valueAnimator.start();
    
  2. AnimatorSet

    QQ截图20151211163343.png
    QQ截图20151211163343.png

    AnimtorSet提供一个动画集合来处理动画效果,他提供一系列的操作来处理动画的顺序,

             AnimatorSet animatorSet = new AnimatorSet();
             PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("translationX", 100);
             PropertyValuesHolder holder4 = PropertyValuesHolder.ofFloat("scaleX", 0, 1f);
             ObjectAnimator objectAnimatorSet2 = ObjectAnimator.ofPropertyValuesHolder(v, holder3, holder4);
             objectAnimatorSet2.setDuration(2000);
             animatorSet.play(objectAnimatorSet2);
             ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(v, "x", 100);
             animatorSet.playTogether(objectAnimator1);
             animatorSet.start();
    

    除此之外ObjectAnimot也可以同时播放几个动画

             PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("translationX", 100);
             PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 0, 1f);
             ObjectAnimator objectAnimatorSet = ObjectAnimator.ofPropertyValuesHolder(v, holder1, 
                                                 holder2);
             objectAnimatorSet.setDuration(2000);
             objectAnimatorSet.start();
    
  3. ObjectAnimator

             ObjectAnimator objectAnimator = ObjectAnimator.ofInt(v, "translationX", 300);
             objectAnimator.setDuration(2000);
             objectAnimator.start();
    

    以上方法适用于含有settergetter的属性,若操作对象不含操作属性的gettersetter方法,如果不含需要自己包装.需要注意使用ObjectAnimator.ofInt(...)之后在定义的包装器的settergetter要与之类型对应.

             ObjectAnimator objectAnimator = ObjectAnimator.ofInt(new WrapperView(v), "width", 300);
             objectAnimator.setDuration(2000);
             objectAnimator.start();
    

    实现包装:

             private static class WrapperView {
               private View target;
               public WrapperView(View target) {
                  this.target = target;
               }
               public void setWidth(int width) {
                  target.getLayoutParams().width = width;
                  target.requestLayout();
               }
               public int getWidth() {
                 return target.getLayoutParams().width;
             }
            }
    

ViewGroup加载child时的动画

  1. XML方式

    android:animateLayoutChanges="true"
    该种方式只会使用系统默认的动画,用户不能定制

  2. Java

    AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
    alphaAnimation.setDuration(2000);
    LayoutAnimationController controller = new LayoutAnimationController(alphaAnimation, 0.5f);
    controller.setOrder(LayoutAnimationController.ORDER_NORMAL);//包括三种,正常,随机,反序
    layout.setLayoutAnimation(controller);
    

Android 5+ 特性

  1. 填充效果

             int cx = v.getWidth() / 2;
             int cy = v.getHeight() / 2;
             int finalRadius = Math.max(v.getWidth(), v.getHeight());
             Animator anim =
                     ViewAnimationUtils.createCircularReveal(v, cx, cy, 0, finalRadius);
             v.setVisibility(View.VISIBLE);
             anim.start();
    

    这就是在Android 5.+上面按钮等组件默认的动画效果

  2. Activity间的过渡动画

    在Android5.0之前,Activity之间的动画是通过函数

         overridePendingTransition(Android.R.anim.fade_in, android.R.anim.fade_out); 
    

    实现的,但是他只是单独作用在每一Activity之上,并没有产生协同作用.
    在Android5.0之后,有了新的方式来实现两个Activity之间的过渡

         Intent intent = new Intent(this, AnimTestActivity.class);
         startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(
                 this, v, "robot").toBundle());
    

    在两个Activity上都存在一个包含属性

         android:transitionName="robot"
    

    的控件,比如类似下面的格式.

         <TextView
                android:id="@+id/activityBtn"
                android:transitionName="robot"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Activity效果" />
    

    当然,也可以同时共享多个View.

         ActivityOptions options = ctivityOptions.makeSceneTransitionAnimation(this,
         Pair.create(view1, "agreedName1"),
         Pair.create(view2, "agreedName2"));
    
  3. 曲线动画

    待补充...

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

推荐阅读更多精彩内容

  • 上一章 书中的示例代码:github 本章主要介绍的是Android动画机制和使用技巧 1.Android视图动画...
    青藤绿阅读 1,653评论 3 32
  • Animation Animation类是所有动画(scale、alpha、translate、rotate)的基...
    四月一号阅读 1,899评论 0 10
  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,688评论 0 10
  • 生化本来就不容易啊,而我们的不努力只会让生活变得更加无赖 这一个月发生的事有点多,有那么一段时间在缓冲。然后课程也...
    AmatorLee阅读 853评论 2 10
  • 夜空之中 一闪一闪的星星 像是你 又像我 繁华之中 消耗殆尽 寂寞像你 无奈像我 我俩之间 没有话语 清风像你 野...
    皆非_lx阅读 283评论 0 3