Content Transitions In-Depth (part 2)
讓我們從在part1中學到的開始吧。並且進行總結:在Android Lollipop中怎樣才能做出行為光滑的,無縫的動畫。
What is Content Transition?
Content tarnsition即為在Activity或者Fragment中進行場景進出的transitioning views,並且這些場景中沒有共享的內容。得益於Google的Material Design設計語言,我們可以在Activity或者Fragment之間進行光滑的,無縫的動畫變換。從Android Lollipop開始,content transition可以在程式碼中呼叫Window和Fragment
- setExitTransition() - 當A啟動B時,A的退場動畫;
- setEnterTransition() - 當A啟動B時,B的進場動畫;
- setReturnTransiton() - 當B返回到A時,B的退場動畫;
- setReenterTransition() - 當B返回到A時,A的再進場動畫;
正如我們上面的分析的那樣,我們能夠了解content transition在螢幕上的工作情況,但是一些問題仍待解決。content transition到底是如何被觸發並工作的?可用於Transition的物體(Objects)可以是什麼?framework是如何判定transition views的?在Content transition中,ViewGroup及其children能夠作為單獨的整體成為動畫的物件麼?在下面的部分中,我們會對上述問題逐個討論解決。
Content Transitions Under-The-Hood
從前面一篇文章中,我們知道作為一個transition,她又兩個主要的任務:其一是捕獲初始和結束view的狀態;其二是創作兩個不同狀態之間的動畫。Content Transition也不外如是:在content transition動畫創作之前,framework必須要給content transition動畫所需的各種狀態,這樣就能改變每個transition view的是否顯示。具體而言,當Activity A啟動Activity B的時候,以下的一系列的事件(event)將會發生:(在return/reenter transitions中,相同的過程也會發生。)
>
1、Activity A呼叫startActivity().
a、framwork分析A的view的構造樹(view hierarchy),並且決定當A退場時,哪些view將會成為tansitioning view set。
b、捕獲A的transition view中的各個view的初始狀態。
c、framework將A的transition view中所有view的狀態設定為INVISIBLE。
d、在展示的下一幀中,A的exit transition捕獲A的結束狀態。
e、A的exit transition對每個transition view的初始和結束狀態進行比較,並創建出Animator。Animator運作,並進行transition view的動畫展示。2、Activity B啟動。
a、framwork分析B的view的構造樹(view hierarchy),並且決定當B進場時,哪些view將會成為tansitioning view set。 這些transition views將會初始化為INVISIABLE。
b、捕獲B的transition view中的各個view的初始狀態。
c、framework將B的transition view中所有view的狀態設定為VISIBLE。
d、在展示的下一幀中,B的enter transition捕獲B的結束狀態。
e、B的enter transition對每個transition view的初始和結束狀態進行比較,並創建出Animator。Animator運作,並進行transition view的動畫展示。
通過改變每個view的INVISIBLE和VISIBLE,framework保證了在transition中創造Animation所需的狀態資訊。顯而易見,transition中的每個物體必須最少能夠捕獲並且記錄其transition中的初始和結束狀態。幸運的是,抽象類Visibility已經做了這樣的工作:你只需要繼承Visibility,並實現抽象方法onAppear()和onDisappear(),這兩個方法會返回Animator物件。在API 21中,官方的具體實現類出現了–Fade,slide和Explode。同樣,你可以繼續使用繼承Visibility類實現動畫。具體如何書寫繼承類,這將會在以後的post中進行展示。
Transitioning Views & Transition Groups
我們現在瞭解了在no-shared views中進行場景變換的稱為content transition。在這部分中,我們將會討論framework是怎樣判定set of views的,並且在使用transition groups時,如何進行判定。
在transition開始之前,framework通過遞迴遍歷Activity(或者Fragment)的Window中的View樹來決定transitioning view的集合。整個搜尋過程開始在根view中呼叫ViewGroup的captureTransitioningView方法,captureTransitioningView的程式碼如下:
/** @hide */
@Override
public void captureTransitioningViews(List<View> transitioningViews) {
if (getVisibility() != View.VISIBLE) {
return;
}
if (isTransitionGroup()) {
transitioningViews.add(this);
} else {
int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
child.captureTransitioningViews(transitioningViews);
}
}
}
這個遞迴的過程比較簡單粗暴:framework跟蹤不同級別的view樹直到它找到一個VISIBLE的葉子view或者是一個transition group。transition group允許我們將整個ViewGroup作為一個整體來變換。如果一個ViewGroup的isTransitionGroup()
注意到的是:isTransition()將會在下面的情況中返回true:
1、viewGroup擁有背景,或者其transition name不為空。
方法返回true,則它的所有孩子都將被視為一個整體一起播放動畫。否則將會繼續遞迴該ViewGroup,其子view也會在動畫的時候被單獨對待。遍歷的最後結果是一個完整的transitioning view的集合將在content transition的時候播放動畫。
需要注意的是:WebView雖然是一個ViewGroup但是沒有被系統認為是transition view。因此content transition沒有在它上面執行。幸運的是我們可以在return transition之前的某個地方呼叫:
webView.setTransitionGroup(true)
Conclusion
總的來說,本文涉及到了三個重要的方面:
1.content transition決定非共享元素(即transitioning view)在Activity切換的時候是如何變換的。
2.Content transition的觸發是通過改變transitioning view的visibility來實現的。
3.Transition group讓我們可以將ViewGroup作為一個整體來變換。
相關推薦
Content Transitions In-Depth (part 2)
讓我們從在part1中學到的開始吧。並且進行總結:在Android Lollipop中怎樣才能做出行為光滑的,無縫的動畫。 What is Content Transition? Content tarnsition即為在Activity或者Fragme
Object Detection In Tensorflow - Part 2
Object Detection In Tensorflow for video detection Github This blog post is based on this article , so the environment, installation, fundam
Reinforcement Learning in depth 🤖 (Part 1: DDQN)
Table of ContentsPurposeIn the pursuit of the AGI (Artificial General Intelligence), we need to widen the domains in which our agents excel. Creating a pr
Cloudera Altus Cloud Services—You’re in Control (Part 2)
In part 1 of this two-part series, we discussed how Cloudera Altus cloud services put you, the Cloudera Altus customer, in control of your cloud reso
Embedding PowerBI in Angular — Part 2
Embedding for your organizationCreating dashboards/reports using Power BI are out of scope of this article, you can learn more about it here. I’ve skipped
Testing in Django (Part 2)
In the last post, I introduced you to testing in Django and we looked at best practices as well as a few examples. This time, I’ll show you a bit more c
An In-Depth Look into the Win32 Portable Executable File Format, Part 2
ast month in Part 1 of this article, I began a comprehensive tour of Portable Executable (PE) files. I described the history of PE files and the data stru
UVA10294 Arif in Dhaka (First Love Part 2)
情況 競賽 討論 text part 算法競賽入門經典 轉置 ret nbsp 本文是劉汝佳《算法競賽入門經典——訓練指南》的讀書筆記。 解題思路: 對於項鏈,它只支持旋轉置換;而手鐲支持旋轉和翻轉。下面由這兩種置換來研究本題。 旋轉 設順時針旋轉 \(i\)
Many-to-many relationships in EF Core 2.0 – Part 1: The basics
ati pda 希望 pairs prot pair protect simple tid 轉載這個系列的文章,主要是因為EF Core 2.0在映射數據庫的多對多關系時,並不像老的EntityFramework那樣有原生的方法進行支持,希望微軟在以後EF Core的版本中
10294 Arif in Dhaka (First Love Part 2)
連結 定理介紹 Burnside引理 對於一個置換fff,若一個著色方案sss經過置換後不變,則sss是fff的一個不動點,將fff的不動點的數目記作C(f)C(f)C(f),那麼等價類的數目就是C(
Governance in distributed organizations, part 2
Governance in distributed organizations, part 2In the previous part I’ve explored briefly why censorship resistance in organizations is important. Here I’l
Create a personal video watchlist in the cloud with PHP and the Movie Database API Part 2
If you have been following along with Part 1, you are half-way through building a web-based PHP application to store your personal wa
Robust Message Serialization in Apache Kafka Using Apache Avro, Part 2
Implementing a Schema Store In Part 1, we saw the need for an Apache Avro schema provider but did not implement one. In this part we will implement a
How Did We Build Book Recommender Systems in An Hour Part 2
Rating infoUser infoBook infoTo ensure statistical significance, we will be only looking at the popular booksIn order to find out which books are popular,
2.2深入訊號和槽(Signals and Slots in Depth)
訊號和槽是Qt程式設計的一個重要部分。這個機制可以在物件之間彼此並不瞭解的情況下將它們的行為聯絡起來。在前幾個例程中,我們已經連線了訊號和槽,聲明瞭控制元件自己的訊號和槽,並實現了槽函式,傳送了訊號。現在來更深入瞭解這個機制。 槽和普通的c++成員函式很像。它們可以是虛擬函式
4.3.2深度定時任務(TimerTask in Depth)
定時任務是例項類,它的子類繼承TimerTask類,它應用Runnable的介面。當引用子類,你需要重寫void run()方法去應用定時任務程式碼。 Note 定時任務需要儘快完成。當一
Lesson 2 Building your first web page: Part 2
examples pear reads port example eth span contain animation Tag Diagram You may have noticed that HTML tags come in pairs; HTML has bot
Async in depth
.org ask socket ack char ger mil rtu -m Writing I/O- and CPU-bound asynchronous code is straightforward using the .NET Task-based async m
如何使用GitLab和Rancher構建CI/CD流水線 – Part 2
docker 鏡像 gitlab 配置 持續集成 部署 這是我們使用GitLab和Rancher構建CI/CD流水線系列教程的第二部分。第一部分的內容介紹了如何部署、配置和確保GitLab在Rancher的運行。這一部分中,我們將介紹如何使用GitLab CI Multi-Runner
[D3] Reuse Transitions in D3 v4
pre rate quad mon ans des -c method exec D3 transitions start executing as soon as they’re created, and they’re destroyed onc