android动画延迟执行,Android 过渡动画框架
為了幫助視圖層次內部和視圖之間的過渡更加容易實現動畫效果,Android 提供了 Transition 框架。這一套框架能夠在視圖之間提供一種或者多種動畫過渡效果。過渡動畫要解決的另一個主要問題就是對同一場景中的多個 View 做動畫,彌補了之前Android 在動畫方面的缺失。
這一套框架提供如下功能:
Group-level 動畫
在同一視圖層次中一種或者多種動畫效果
Transition-based 動畫
在初始場景和終止場景之間動畫
Built-in 動畫
內置普通效果動畫,包括 fade out 和 movement
Resource 文件支持
從 layout 資源文件中加載視圖以及內置動畫資源
Lifecycle callbacks
隨心所欲的控制動畫的過程
Transition API 在 Android 5.0 及以上被引入,但是在 4.4 Kitkat 時就引入了 Scenes 和 Transitions 的概念。在 Android 4.0 API level 14 及以上,可以使用 android.support.transition 包中內容
創建場景
Scene 保存視圖狀態及層次結構,包括所有的視圖及其屬性。 Transition 框架能夠從場景到場景進行過渡動畫。初始場景(Staring scene)經常是當前的視圖層次,而結束場景(ending scene)通常由用戶從 layout 創建或者用代碼從一組視圖中創建。
從 Layout 創建 Scene
利用靜態方法 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);
mAnotherScene =
Scene.getSceneForLayout(mSceneRoot, R.layout.another_scene, this);
或者使用構造函數構造:
Scene mScene;
// 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);
場景間動畫
一般情況下 Android 系統會自動在場景間動畫,自定義動畫可省略,但是如果想自定義動畫,可以在場景退出或者進入的時候自定義動畫,需要注意以下兩點:
動畫視圖不在同一個視圖層次
Transition 框架不能給 Listview 自動創建動畫,Transition 框架的限制
可以使用 Scene.setExitAction(Runnable action) 或者 Scene.setEnterAction(Runnable action) 來自定義進入或者退出的動作。
Scene 總結
Scene 類中幾個重要的方法:
構造方法,Scene(ViewGroup sceneRoot, View layout)。 從 Layout 中創建 Scene,當調用 enter() 方法時將 sceneRoot 下子view 全部移除并將新 Layout 中內容填充。
靜態方法,創建新 Scene getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context)
enter() 方法 exit() 方法
setEnterAction(Runnable action) 和 setExitAction(Runnable action)
Transition
在 Transition 框架中,動畫在開始和結束場景間創建了一系列動畫幀。
創建 Transition
系統提供的內置 transition 有如下:
Class
Tag
Attributes
Effect
AutoTransition
-
默認過渡動畫,Fade out 漸隱, move 位移 和 resize 大小縮放,fade in 漸顯 ,按順序
Fade
android:fadingMode=”[fade_in fade_out fade_in_out]”
fade_in_out (default) 漸隱之后跟隨者 漸顯
ChangeBounds
-
位移和縮放
通過資源文件創建
也通過資源文件即可修改過渡效果,避免大幅度修改 Activity 中代碼。并且通過資源文件方式創建有效地將復雜的動畫和代碼文件分離。
通過如下步驟添加過渡動畫資源:
添加 res/transition/ 目錄
在該目錄下創建 XML 資源
在 XML 文件中添加內置的過渡動畫子節點
例如如下資源文件則指定了漸隱漸顯動畫, res/transition/fade_transition.xml :
利用如下代碼片段從資源文件中創建 Transition:
Transition mFadeTransition =
TransitionInflater.from(this).
inflateTransition(R.transition.fade_transition);
通過代碼創建 Transition
可以在代碼中動態地創建過渡效果,可以通過非常少的代碼創建。通過直接調用 Transition 的子類構造函數直接創建,例如:
Transition mFadeTransition = new Fade();
執行 Transition
直接調用 TransitionManager.go() 靜態方法,并提供一個終止場景:
TransitionManager.go(mEndingScene, mFadeTransition);
如果不指定 transition ,則系統自動套用默認的轉場動畫。
選擇特定目標
轉場動畫默認對所有的Views進行動畫,如果只希望某一些特定的 Views 動畫,或者某一些不做動畫。 在 transition 中,每一個視圖都被稱作一個 target,但是得注意,只有在Scene 中的views 才被稱作 target。
可以使用 removeTarget() 來從 transition 中移除某一個 view,或者使用 addTarget() 來給 Transition 添加一個 view。
使用多重動畫
如下定義的 transitionSet 和 AutoTransition 表現一致:
android:transitionOrdering="sequential">
代碼中可以使用 TransitionInflater.from() 來加載 TransitionSet ,因為 TransitionSet 繼承自 Transition,因此可以像使用 Transition 一樣使用 TransitionSet。
不使用 Scene 來使用 Transition
改變視圖層次并不是唯一改變UI的方式,同樣也可以通過添加、修改、移除子view來對當前的視圖作出修改。或者當兩個場景非常相似,為了避免維護兩份近乎一致的視圖層次,可以只維護一份,并做一些微小的調整。
此時可以使用 delayed transition 來在兩個狀態之間進行轉換。Transition 系統自動選擇當前的視圖層次作為初始狀態,并記錄用戶對視圖的修改,然后應用為終止狀態,并在之后進行動態地變化。
在單一視圖中使用 delay transition :
調用 ` TransitionManager.beginDelayedTransition()` 來提供提供一個父view包括所有的待變化的view,此時系統自動保存當前傳入的所有 views 的狀態及屬性
修改子views ,系統會記錄該views 的變化
當系統重繪時系統自動在原始及新狀態間做動畫
創建自定義 Transitions
自定義過渡動畫(custom transition)可以實現區別于內置轉場動畫的效果。比如,你可以定義一個動畫來將文字和輸入框的前景顏色變成灰色來表示當前禁止輸入。
繼承 Transition 類
繼承 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) {}
}
Transition 動畫使用 property 動畫系統,屬性動畫動態地修改視圖的屬性,因此得知道初始和終止的值。
captureStartValues
系統會對初始場景中的每一個view調用 captureStartValues(transitionValues) ,參數 TransitionValues 對象包含了一個指向 view 的引用和一個保存view狀態的 Map 實例。在自己的實現中,獲取這些屬性,并將這些屬性傳回給map。
為了避免key 值和已經擁有的key值矛盾,可以使用如下的 TransitionValues 鍵的形式:
package_name:transition_name:property_name
例如下面的例子:
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());
}
...
}
captureEndValues
系統會給終止場景中的每一個target view自動調用 ` captureEndValues(TransitionValues),其他方面,captureEndValues()和captureStartValues()` 表現一致。
animator
在初始和終止視圖層次間進行動畫,提供一個 animator ,通過復寫 createAnimator() ,當系統調用此方法時,他將 root view 和開始和結束 TransitionValues 傳入。系統調用 createAnimator() 方法的次數由開始和終止場景之間的變化決定。
Android 系統自帶 Transition
雖然教程上只羅列了一些 Transition ,但是看文檔,還是能發現不少 Transition 的直接子類。
Transition
Transition 在 XML 定義時有如下屬性:
android:duration 動畫時長毫秒
android:interpolator 動畫使用的 interpolator
android:matchOrder 過渡動畫執行順序
android:startDelay 在過渡動畫之前延遲時間 毫秒
TransitionSet
TransitionSet 在 XML 中有如下屬性:
android:transitionOrdering 過渡動畫執行順序,有兩種值, together 和 sequential
以下轉場動畫中原生提供的包括 Fade,Slide,Explode,但場景之間存在共享元素時,有如下的轉場動畫 changeBound,changeClipBounds,changeImageTransform,ChangeTransform,ChangeScroll。
Fade
漸隱漸顯動畫
Fade 在 XML 中有如下屬性:
android:fadingMode 漸變模式, fade_in, fade_out , fade_in_out ,默認為 fade_in_out
Slide
元素從四個方向滑動進入
Slide 屬性:
android:slideEdge 從那邊滑動出,有 left, top, right, bottom, start, end 模式
Explode
屏幕中間上下移走
ChangeBounds
通過獲取前后Scene 中 target view 的邊界,并對這些 view 做動畫,改變 View 的大小
ChangeClipBounds
獲取前后 Scene 中 getClipBounds() 的邊界,并做動畫,有如下屬性:
android:resizeClip 通過改變 clipBounds 來改變 view,而不是改變view 自身的大小
ChangeImageTransform
通過獲取開始和結束時 Scene 中 ImageView 的 matrix ,并對他們做動畫。 和 ChangeBounds 一起使用,來對 ImageView 改變大小,形狀,和 ScaleType 來使動畫更加流暢。
ChangeTransform
獲取 Scene 中的尺寸和旋轉角度,并做動畫,有如下屬性:
android:reparent 追蹤父view 的變化
android:reparentWithOverlay A parent change should use an overlay or affect the transform of the transitionining View.
ChangeScroll
改變滑動位置
下面分享一個 transitionSet 的 XML 語法:
android:transitionOrdering="sequential">
以上就是文檔中對 Transition 的解釋,關于自定義 Transition 還可以具體展開細講,但是因為 Transition API 要求的 API 版本比較高,基本 Android 5.0 及以上才可以很好的支持,所以目前使用并不廣,但是相信不久以后就能看到越來越多的轉場動畫了。
reference
總結
以上是生活随笔為你收集整理的android动画延迟执行,Android 过渡动画框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: z最大子数组c语言,关于最大子数组问题
- 下一篇: android 手机命令大全,adb 命