Scenes和Transitions學習

效果

tranisition.gif

注: 地址見最下方Reference

使用條件

  • Android 4.4.2 (API level 19) or higher

什么是Scene和Transition

Android 4.4.2引入transition框架氓侧,可以簡化不同View hierarchies之間的變化的動畫操作脊另,這是通過動態(tài)改views的屬性值來實現(xiàn)的。Scene和Transition是transition框架中的兩個類约巷,其中:

  • Scene存儲view hierarchy的狀態(tài)偎痛,包括所有包含的views及其屬性
  • Transition存儲動畫信息

transition框架中的結構關系圖:


transitions_diagram.png

為什么需要Scene和Transiton

用戶界面經常需要響應用戶的各種操作,為了保證用戶操作的連續(xù)性载庭,可以用動畫來過渡不同界面間的切換和變化看彼,這樣不僅可以給用戶操作反饋還可以幫助用戶理解如何去操作,總結一句話: 一切為了體驗囚聚。

使用方法

  1. 為需要變化的view hierarchies創(chuàng)建相應的scenes
  2. 給想使用的動畫創(chuàng)建tansitions
  3. 用transition manager的相關方法來執(zhí)行動畫

詳細使用方法如下

1. Scene的創(chuàng)建:

1.1 通過layout資源文件創(chuàng)建  
1.2 通過代碼創(chuàng)建

詳細描述如下:
1.1 通過layout資源文件創(chuàng)建

res/layout/a_scene.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scene_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/text_view1
        android:text="Text Line 1" />
    <TextView
        android:id="@+id/text_view2
        android:text="Text Line 2" />
</RelativeLayout>

使用Scene.getSceneForLayout()來加載

// Create the scene root for the scenes in this app
mSceneRoot = (ViewGroup) findViewById(R.id.scene_root);

// Create the scenes
mAScene = Scene.getSceneForLayout(mSceneRoot, R.layout.a_scene, this);

1.2 通過代碼創(chuàng)建
使用 Scene(sceneRoot, viewHierarchy)來創(chuàng)建靖榕,實際上等同于Scene.getSceneForLayout(),區(qū)別在于viewHierarchy是否已經加載了顽铸,例如:

// Obtain the scene root element
mSceneRoot = (ViewGroup) mSomeLayoutElement;

// Obtain the view hierarchy to add as a child of
// the scene root when this scene is entered
mViewHierarchy = (ViewGroup) someOtherLayoutElement;

// Create a scene
mScene = new Scene(mSceneRoot, mViewHierarchy);

2. 創(chuàng)建Transition

在資源文件中是自帶的transition是茁计,有以下三個步驟:
1. 在res下添加transition文件夾res/transition/
2. 在該文件夾下創(chuàng)建資源文件
3. 添加一個自帶的transition的節(jié)點<fade/>.
例如:
res/transition/fade_transition.xml

<fade xmlns:android="http://schemas.android.com/apk/res/android" />

MainActvity.java

// 加載xml中的transition
Transition mFadeTransition =
        TransitionInflater.from(this).
        inflateTransition(R.transition.fade_transition);

也可以在代碼中創(chuàng)建

Transition mFadeTransition = new Fade();

創(chuàng)建多個transition(注:這個官方文檔中說要創(chuàng)建transitions文件夾,不過該路徑貌似有問題谓松,直接放在transition文件夾下即可)

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:transitionOrdering="sequential">
    <fade android:fadingMode="fade_out" />
    <changeBounds />
    <fade android:fadingMode="fade_in" />
</transitionSet>

3. 應用Transition

使用TransitionManager.go()

TransitionManager.go(mEndingScene, mFadeTransition);
不使用Scene的情況下應用Transition

如果變化只是發(fā)生在當前的view hierarchy中星压,就沒必要創(chuàng)建一個scene。事實上鬼譬,你可以使用delayed transition來完成一個view hierarchy的兩種狀態(tài)變化娜膘。delayed transiton開始于當前view hierarchy的狀態(tài),并記錄下它的views的變化优质,等在系統(tǒng)重繪時來應用transition竣贪。創(chuàng)建步驟如下:

  1. 調用TransitionManager.beginDelayedTransition(final ViewGroup sceneRoot),sceneRoot的state會被保存
  2. 改變子view的狀態(tài)巩螃,比如添加或變大之類的演怎,transition會自動記錄變化
  3. 讓系統(tǒng)重繪,然后transition會自動從最初的狀態(tài)開始沿著新的狀態(tài)變更
// 1. Start recording changes to the view hierarchy
TransitionManager.beginDelayedTransition(mRootView, mFade);
    
// 2. Add the new TextView to the view hierarchy
mRootView.addView(mLabelText);

// 3. When the system redraws the screen to show this update,
// the framework will animate the addition as a fade in

自定義Transitions

  • 繼承Transition類
public class CustomTransition extends Transition {

    @Override
    public void captureStartValues(TransitionValues values) {}

    @Override
    public void captureEndValues(TransitionValues values) {}

    @Override
    public Animator createAnimator(ViewGroup sceneRoot,
                                   TransitionValues startValues,
                                   TransitionValues endValues) {}
}
  • 保存起始和結束的狀態(tài)值
public class CustomTransition extends Transition {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private static final String PROPNAME_BACKGROUND =
            "com.example.android.customtransition:CustomTransition:background";

    @Override
    public void captureStartValues(TransitionValues transitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues);
    }
    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private void captureValues(TransitionValues transitionValues) {
        // Get a reference to the view
        View view = transitionValues.view;
        // Store its background property in the values map
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    @Override
    public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
    }
    ...
}
  • 重寫createAnimator() (optional)

使用限制

  • 在SurfaceView上使用可能會不正常避乏,因為SurfaceView是通過非UI線程來更新界面的爷耀,應此可能與其他View不同步
  • 某些特定的transition類型在Textureview上使用效果有問題
  • AdapterView家族的類(如ListView)與tansition框架不兼容,使用會掛
  • 如果你在TextView同時使用tansition和縮放動畫拍皮,TextView中的text會在縮放動畫完成前就pop到新的位置歹叮。為了避免此問題跑杭,避免同時使用

Reference

  1. Animating Views Using Scenes and Transitions
  2. 官方Demo
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盗胀,隨后出現(xiàn)的幾起案子艘蹋,更是在濱河造成了極大的恐慌,老刑警劉巖票灰,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件女阀,死亡現(xiàn)場離奇詭異,居然都是意外死亡屑迂,警方通過查閱死者的電腦和手機浸策,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惹盼,“玉大人庸汗,你說我怎么就攤上這事∈直ǎ” “怎么了蚯舱?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掩蛤。 經常有香客問我枉昏,道長,這世上最難降的妖魔是什么揍鸟? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任兄裂,我火速辦了婚禮,結果婚禮上阳藻,老公的妹妹穿的比我還像新娘晰奖。我一直安慰自己,他們只是感情好腥泥,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布匾南。 她就那樣靜靜地躺著,像睡著了一般蛔外。 火紅的嫁衣襯著肌膚如雪蛆楞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天冒萄,我揣著相機與錄音,去河邊找鬼橙数。 笑死尊流,一個胖子當著我的面吹牛,可吹牛的內容都是我干的灯帮。 我是一名探鬼主播崖技,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼逻住,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迎献?” 一聲冷哼從身側響起瞎访,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吁恍,沒想到半個月后扒秸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡冀瓦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年伴奥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翼闽。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拾徙,死狀恐怖,靈堂內的尸體忽然破棺而出感局,到底是詐尸還是另有隱情尼啡,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布询微,位于F島的核電站崖瞭,受9級特大地震影響,放射性物質發(fā)生泄漏拓提。R本人自食惡果不足惜读恃,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望代态。 院中可真熱鬧寺惫,春花似錦、人聲如沸蹦疑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歉摧。三九已至艇肴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叁温,已是汗流浹背再悼。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膝但,地道東北人冲九。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像跟束,于是被迫代替她去往敵國和親莺奸。 傳聞我的和親對象是個殘疾皇子丑孩,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內容