Android Transition——基礎篇
今天來說一說Transition
,這個我們肯定不陌生,實現共享元素就會用到這個API。Activities之間精美的動畫也全靠這個來實現。從Kitkat版本就出現了Sence
與Transition
(場景和轉換)的概念,那麼今天我們先來說一說這兩個概念的基本用法。
- 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
捕捉View
的getClipBounds()
場景變化之前和之後的變化,並在變換過程中為這些變化提供動畫。例如:
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