1. 程式人生 > >Android Transition——基礎篇

Android Transition——基礎篇

今天來說一說Transition,這個我們肯定不陌生,實現共享元素就會用到這個API。Activities之間精美的動畫也全靠這個來實現。從Kitkat版本就出現了SenceTransition場景轉換)的概念,那麼今天我們先來說一說這兩個概念的基本用法。

  • Scene
    定義了介面當前的狀態資訊,儲存了佈局中所有View的屬性值
  • Transition
    當一個場景改變的時候,transition主要負責:捕獲每個View在開始場景和結束場景時的狀態(各種屬性值);根據兩個場景(開始和結束)之間的區別自動建立一個Animator。
  • TransitionManager
    這個類將Sence

    Transition關聯了起來,大多數情況下的場景變化都會使用AutoTransition。只有當應用程式需要不同的轉換行為時,才需要指定其他的Transition來滿足特定的場景需求。

    • setTransition(Scene scene, Transition transition)
      設定需要的場景與過渡動畫

    • setTransition(Scene fromScene, Scene toScene, Transition transition)
      設定起始場景和結束場景與過渡動畫

    • go(Scene scene)
      切換到指定的場景

    • go(Scene scene, Transition transition)


      切換到指定的場景以及所使用的過渡動畫,transition如果傳了null,那麼就沒有了過渡動畫。

    • beginDelayedTransition(ViewGroup sceneRoot, Transition transition)
      可以自定義場景過渡的方法,呼叫此方法時,TransitionManager會捕獲sceneRoot中View的屬性值,然後發出請求以在下一幀上進行轉換。那時候,sceneRoot中的新值將被捕獲,變化的過程將會以動畫的形式展現出來。我們沒有必要建立一個新的Scene,因為這個方法主要是用來展現當前場景到下一幀的過渡效果。

    • void endTransitions (ViewGroup sceneRoot)


      結束指定場景根目錄在準備/正在進行的轉換。

更詳細的解釋,請移步官方API

AutoTransition

建立預設轉場時使用的工具類,在場景更改期間實現自動淡化,移動檢視並調整檢視的大小的動畫。例如:
我們為一個ViewGroup設定了背景,然後設定了一個Padding。

 TransitionManager.beginDelayedTransition(content, new AutoTransition());
 linearLayout.setPadding(100,100,100,100);

這裡寫圖片描述

ChangeBounds

這種轉換捕捉了場景變化之前和之後的目標檢視的佈局範圍,並在轉換過程中為這些變化提供動畫。例如:
和上面那個動畫一樣,我設定一個時間,這樣看的更明顯。

        ChangeBounds changeBounds=new ChangeBounds();
            changeBounds.setDuration(2000);
            TransitionManager.beginDelayedTransition(linearLayout,changeBounds);
            linearLayout.setPadding(100,100,100,100);

這裡寫圖片描述

ChangeClipBounds

ChangeClipBounds捕捉ViewgetClipBounds()場景變化之前和之後的變化,並在變換過程中為這些變化提供動畫。例如:

        Rect rect = new Rect(50, 150, 200, 350);
            ChangeClipBounds changeClipBounds = new ChangeClipBounds();
            android.transition.TransitionManager.beginDelayedTransition(linearLayout, changeClipBounds);
            if (pos % 2 == 0) {
                ViewCompat.setClipBounds(imageView2,rect);
            }else{
                ViewCompat.setClipBounds(imageView2,null);
            }
            pos++;

這裡寫圖片描述

這個裁剪的座標給的真是太合適了!

ChangeImageTransform

這個Transition在場景變化之前和之後會捕獲一個ImageView的矩陣,並在轉換的過程中生成動畫。可以與ChangeBounds結合使用。例如:

if (v.getId() == R.id.button) {
            ChangeImageTransform changeImageTransform = new ChangeImageTransform();
            ChangeClipBounds changeClipBounds = new ChangeClipBounds();
            android.transition.TransitionManager.
                    beginDelayedTransition(content,
                            new TransitionSet().addTransition(changeImageTransform)
                                    .addTransition(changeClipBounds).setDuration(1000));
            switch (pos) {
                case 0:
                    Rect rect = new Rect(50, 150, 300, 450);
                    ViewCompat.setClipBounds(imageView2, rect);
                    imageView2.setScaleType(ImageView.ScaleType.CENTER);
                    break;
                case 1:
                    ViewCompat.setClipBounds(imageView2, null);
                    imageView2.setScaleType(ImageView.ScaleType.CENTER_CROP);
                    break;
                case 2:
                    Rect rect1 = new Rect(100, 200, 300, 400);
                    ViewCompat.setClipBounds(imageView2, rect1);
                    imageView2.setScaleType(ImageView.ScaleType.FIT_XY);
                    break;
                case 3:
                    ViewCompat.setClipBounds(imageView2, null);
                    imageView2.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
                    break;
            }
            if (pos == 3) {
                pos = -1;

            }
            pos++;
        }

這裡寫圖片描述

這裡用到了TransitionSet(),後面會講到的。

ChangeScroll(API23中新增)

轉換場景時,捕捉目標View更改之前與更改之後滾動的屬性,然後對滾動的屬性添加了動畫處理。(API級別太高了,以後試一下)

ChangeTransform

在過渡場景更改之前和之後捕捉檢視的縮放和旋轉,並在過渡期間新增動畫。例如:

ChangeTransform changeTransform = new ChangeTransform();
            changeTransform.setDuration(500);
            android.transition.TransitionManager.beginDelayedTransition(content, changeTransform);
            imageView.setRotation(pos+90);

這裡寫圖片描述

Explode(爆炸?)

此轉換會捕捉目標檢視從開始到結束的可見性,並且檢視會從場景邊緣移動出入。這裡的可見性指的是setVisibility(int)的狀態以及當前檢視是否在ViewGroup層次結構中(比如recyclerView的Item的消失與顯示)。如果沒有設定焦點中心的話,那麼檢視預設會從場景中心移出去(像爆炸一樣?)例如:

預設的情況下:

 final Rect viewRect = new Rect();
            bt.getLocalVisibleRect(viewRect);
            Transition transition = new Explode();
            transition.setEpicenterCallback(new Transition.EpicenterCallback() {
                @Override
                public Rect onGetEpicenter(Transition transition) {
                    return null;
                }
            });
            transition.setDuration(500);
            TransitionManager.beginDelayedTransition(content, transition);
            if(pos%2==0){
                imageView2.setVisibility(View.GONE);
                imageView.setVisibility(View.GONE);
                imageView3.setVisibility(View.GONE);
                imageView4.setVisibility(View.GONE);
            }else{
                imageView2.setVisibility(View.VISIBLE);
                imageView.setVisibility(View.VISIBLE);
                imageView3.setVisibility(View.VISIBLE);
                imageView4.setVisibility(View.VISIBLE);
            }
            pos++;

這裡寫圖片描述

當然了我們也可以自定義焦點,由Transition epicenter提供 (通過setEpicenterCallback方法來設定),例如:

final Rect viewRect = new Rect();
            bt.getLocalVisibleRect(viewRect);
            Transition transition = new Explode();
            transition.setEpicenterCallback(new Transition.EpicenterCallback() {
                @Override
                public Rect onGetEpicenter(Transition transition) {
                    return viewRect;
                }
            });
            transition.setDuration(500);
            TransitionManager.beginDelayedTransition(content, transition);
            if(pos%2==0){
                imageView2.setVisibility(View.GONE);
                imageView.setVisibility(View.GONE);
            }else{
                imageView2.setVisibility(View.VISIBLE);
                imageView.setVisibility(View.VISIBLE);
            }
           pos++;

這裡寫圖片描述

這裡關於onGetEpicenter方法,我也不清楚這個返回的Rect是按照怎樣的計算方式設定焦點的。

Fade

目標檢視淡入淡出的過渡效果,檢視可見性由設定了setVisibility(int)的狀態以及是否在當前檢視層次結構中確定。指定IN( MODE_IN)或者OUT(MODE_OUT)分別對應淡入和淡出。也可以通過fade.setMode方法設定,若不指定預設為淡入淡出效果。例如:

Transition transition = new Fade();
            transition.setDuration(500);
            TransitionManager.beginDelayedTransition(content, transition);

這裡寫圖片描述

Slide

就像前面那兩個一樣,目標檢視滑動的過渡效果,檢視可見性由設定了setVisibility(int)的狀態以及是否在當前檢視層次結構中確定。它幫助View從一測滑向另一測。預設是BOTTOM,當然了也可以自己設定。例如:

Transition transition = new Slide(Gravity.RIGHT);
            transition.setDuration(500);
            TransitionManager.beginDelayedTransition(content, transition);

這裡寫圖片描述

PathMotion

這個類有兩個具體實現類ArcMotion和PatternPathMotion,這個基類可以在檢視轉換的時候沿著指定的路徑運動。

  • ArcMotion
 Transition transition = new ChangeBounds();
            transition.setDuration(600);
            transition.setPathMotion(new ArcMotion());
            TransitionManager.beginDelayedTransition(content, transition);
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
            if (pos % 2 == 0) {
                params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
            } else {
                int[] rules = params.getRules();
                for (int i = 0; i < rules.length; i++) {
                    params.removeRule(i);
                }
            }
            imageView.setLayoutParams(params);
            pos++;

這裡寫圖片描述

  • PatternPathMotion
    可以使用Path定義兩個座標點之間的運動模式。而且必須具有與起點不同的終點。下面這個例子我隨便寫了一個座標點,然後用Path連線起來,我們來看效果:
final Path path = new Path();
            path.moveTo(0, 0);
            path.quadTo(300, 0, 400, 450); 
            PathMotion pathMotion = new PathMotion() {
                @Override
                public Path getPath(float startX, float startY, float endX, float endY) {
                    return path;
                }
            };
            ChangeBounds changeBounds = new ChangeBounds();
            changeBounds.setPathMotion(pathMotion);
            TransitionManager.beginDelayedTransition(content,changeBounds);
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
            params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
            imageView.setLayoutParams(params);

這裡寫圖片描述

TransitionSet

TransitionSets可以實現更復雜的轉換效果。ORDERING_SEQUENTIAL是一個一個的來 ORDERING_TOGETHER同時開始

 public void onClick(View v) {
                mExpanded = !mExpanded;
                TransitionManager.beginDelayedTransition(transitionsContainer, new TransitionSet()
                    .addTransition(new ChangeBounds())
                    .addTransition(new ChangeImageTransform()));
                ViewGroup.LayoutParams params = imageView.getLayoutParams();
                params.height = mExpanded ? ViewGroup.LayoutParams.MATCH_PARENT : ViewGroup.LayoutParams.WRAP_CONTENT;
                imageView.setLayoutParams(params);
                imageView.setScaleType(mExpanded ? ImageView.ScaleType.CENTER_CROP : ImageView.ScaleType.FIT_CENTER);
            }

這裡寫圖片描述

這個TransitionSet其實就像AnimationSet那樣,把所有的轉場效果集合在一起,然後按照規則來執行。

每次寫部落格,都不知道該怎麼結尾。算了,吐槽一句:
食堂打飯的阿姨,總是給我一點點菜,搞得我吃不飽。

相關推薦

Android Transition——基礎

今天來說一說Transition,這個我們肯定不陌生,實現共享元素就會用到這個API。Activities之間精美的動畫也全靠這個來實現。從Kitkat版本就出現了Sence與Transition(場景和轉換)的概念,那麼今天我們先來說一說這兩個概念的基本用法。

Android JNI基礎(一)

Android JNI基礎篇 前言 JNI學習其實並不難,在這裡,我將引導大家學習JNI的基礎知識,認真學完本教程,你將更加堅信我說的話。來吧,我們一起學習! JNI基礎 JNI是什麼? JNI的全稱就是Java Native Interface,顧名思義,就是Java和C

Android ListView基礎

本系列文章將為大家總結如何快速使用ListView以及做到高效的ListView,本篇博文介紹ListView的基本使用 ListView&Adapter ListView是Android中用

Android Fragment基礎

最近用到Fragment,又重新整理了一下,同時也準備再次開啟部落格之旅,希望能堅持去下。 一、引言         Fragment是Android 3.0(API level 11)以後提出的系統元件,主要目的是在大螢幕裝置上支援更加動態和靈活的UI設計,從而改善使

Android Fragment使用(一) 基礎 溫故知新

Fragment使用的基本知識點總結, 包括Fragment的新增, 引數傳遞和通訊, 生命週期和各種操作. Fragment使用基礎 Fragment新增 方法一: 佈局裡的標籤 識別符號: tag, id, 如果都沒有, container的id將會被使用. 方法二: 動態新增

android studio import project 錯誤彙總--基礎

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android基礎——聊聊Activity

我們在上一章裡講述瞭如何使用Android Studio新建一個Android專案來作為我們的Android基礎的入門知識點。相信跟著教程走的童鞋都可以在模擬器或者真機上看到 hello 的字樣,這說明你們已經成功get到了開發Android專案的最基礎的部分,但或許有人在疑問,可是我明

Android基礎——建立一個Android工程

Android系列停了兩個月,電腦還是沒弄好,記憶體不能外拓。現在把windows換成了ubuntu,再裝AS,發現雖然還是卡,但不至於卡到宕機。所以又出來折騰啦。 今天正式開始Android的開發系列,初始階段當然從建立一個Android工程開始: 下面是步驟: 1.開啟As,滑

深入瞭解Android藍芽Bluetooth——《基礎

什麼是藍芽?   也可以說是藍芽技術。所謂藍芽(Bluetooth)技術,實際上是一種短距離無線電技術,是由愛立信公司公司發明的。利用“藍芽”技術,能夠有效地簡化掌上電腦、膝上型電腦和行動電話手機等行動通訊終端裝置之間的通訊,也能夠成功地簡化以上這些裝置與因特網

Android 滑動效果基礎(三)—— Gallery仿影象集瀏覽

                Android系統自帶一個Gallery瀏覽圖片的應用,通過手指拖動時能夠非常流暢的顯示圖片,使用者互動和體驗都很好。本示例就是通過Gallery和自定義的View,模仿實現一個仿Gallery影象集的圖片瀏覽效果。效果圖如下:1、基本原理在 Activity 中實現 OnGe

Android事件分發機制:基礎:最全面、最易懂

如何提升安卓水平?安卓開發者必須瞭解的事件分發機制。 最全面、最易懂的形式來講解Android事件分發機制。 0. 前言 鑑於安卓分發機制較為複雜,故分為多個層次進行講解,分別為基礎篇、實踐篇與高階篇。 (一)基礎篇:從基本概念入手,介紹了分發機制中的核心方法,通過分析其核心邏輯,總結其事件分發機制。 (

Android基礎Android快速入門--你必須要知道的基礎

1. Activity的理解: 2. Intent的理解 關於IntentFilter 3. Intent的使用:(建立、攜帶資料、讀取資料) 1.建立:      顯式意圖: Intent intent = new Inten

Android入門基礎知識總結之常用控制元件

臨近考試,做一下簡單的總結,鞏固一下; 不能面面俱到,舉的都是一些常用的基礎例子; 上一篇:Android入門基礎知識總結之Layout佈局篇 二、常用控制元件篇 本文介紹了TextView,EditText,Button,RadioButton,CheckBo

Android入門基礎知識總結之Layout佈局

臨近考試,做一下簡單的總結,鞏固一下; 不能面面俱到,舉的都是一些常用的基礎例子; 下一篇:Android入門基礎知識總結之常用控制元件篇 一、Layout佈局篇 通用屬性還請自行體會,這裡只說了部分特有或常用屬性; 1) LinearLayout(線性佈局

Android Studio基礎之依賴管理(五)-學習

在我們的專案中,或我或少都會用到一起第三方的庫,那麼對它的管理也就成為了專案中的一部分。這裡就介紹下在Android Studio中如何去管理專案中的庫和它們的依賴。 如何新增一個庫 Android Studio中新增一個庫有三種方法 第一種,直接

Android外掛開發初探——基礎

Android外掛開發初探 對於Android的外掛化其實已經討論已久了,但是市面上還沒有非常靠譜成熟的外掛框架供我們使用。這裡我們就嘗試性的對比一下Java中,我們使用外掛化該是一個怎麼樣的流程,且我們如何將此流程移植到Android框架上去使用。很多程式碼

Android基礎(二)——Android應用結構分析和清單檔案

一、Android應用目錄結構簡單介紹 在Android Studio上開發Android應用簡單方便,除了建立Android專案,開發者只需做兩件事情:1.使用activiy_main.xml檔案定

【移動安全基礎】——06、Android結構基礎

1. 以 HelloWorld 為例 AndroidManifest.xml:      描述 Android 應用的資訊,包括類名,元件名等 assets: 資源目錄 lib: so 檔案存放路徑 java: 原始碼存放目錄     &nb

android studio自定義生成jar包基礎

第一步:在專案中新建一個moudle mylibrary作為library 第二步:並將專案中原有的app moudle依賴此mylibrary 第三步:執行該app或者build該app後會在mylibrary moudle的build/i

Android Studio基礎之專案目錄結構(四)-學習

開始前先說下什麼是Gradle 這是我在網上找到的對Gradle的描述: At the heart of Gradle lies a rich extensible Domain Specific Language (DSL) based on Gro