引入
過渡動畫是在 Android4.4 引入的新的動畫框架,它本質還是屬性動畫双饥,只不過是對屬性動畫做了一層封裝损姜,目的是方便開發(fā)者實現Activity或者View的過渡動畫效果洋机。
如果我們把屬性動畫比作微整容的話,那過渡動畫就是換皮手術了曾掂。
過渡動畫與屬性動畫最大的不同是需要為動畫前后準備不同的布局文件,并通過對應的API實現兩個布局之間的過渡動畫壁顶。
介紹
在使用Transition Animation框架實現動畫效果之前珠洗,我們先來做些簡單的概念介紹。
- Scene: 定義了頁面的當前狀態(tài)信息若专,
Scene
的實例化一般通過靜態(tài)工廠方法實現许蓖。
public static Scene getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) {
...
}
Transition: 定義了界面之間切換的動畫信息,我們可以使用
TransitionManager
指定使用那個Transition
,如果不指定則會默認使用AutoTransition
膊爪。TransitionManager: 控制
Scene
之間切換的控制器自阱,切換常用的方法有以下兩個,其中的sDefaultTransition
就是默認的AutoTransition
實例米酬。
public static void go(Scene scene) {
changeScene(scene, sDefaultTransition);
}
public static void go(Scene scene, Transition transition) {
changeScene(scene, transition);
}
使用方式
過渡動畫被封裝后沛豌,使用起來還是很簡單的。
首先赃额,定義同一個頁面的兩個布局加派,分別是動畫前的布局和動畫后的布局,我們將其命名為activity_main.xml
和activity_main_after.xml
跳芳,這兩個布局文件的根布局具有相同的android:id
值芍锦。
activity_main.xml 布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/activity_main"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="20dp"
android:onClick="transitionAnimation"
android:text="過渡動畫"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="20dp"
android:onClick="showSnackbar"
android:text="showSnackbar"/>
</LinearLayout>
動畫后布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/activity_main"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="bottom|right">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="20dp"
android:onClick="transitionAnimation_2"
android:text="過渡動畫"/>
</LinearLayout>
Activity代碼實現如下:
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void transitionAnimation (View view)
{
LinearLayout container = (LinearLayout) findViewById(R.id.activity_main);
Scene scene1 = Scene.getSceneForLayout(container, R.layout.activity_main, this);
Scene scene2 = Scene.getSceneForLayout(container, R.layout.activity_main_after, this);
TransitionInflater transitionInflater = TransitionInflater.from(this);
TransitionManager transitionManager = transitionInflater.inflateTransitionManager(R.transition.transition_manager, container);
ChangeBounds changeBounds = new ChangeBounds();
changeBounds.setDuration(5000);
Fade fadeOut = new Fade(Fade.OUT);
fadeOut.setDuration(3000);
Fade fadeIn = new Fade(Fade.IN);
fadeIn.setDuration(2000);
TransitionSet transitionSet = new TransitionSet();
transitionSet.setOrdering(TransitionSet.ORDERING_SEQUENTIAL)
.addTransition(fadeOut)
.addTransition(changeBounds)
.addTransition(fadeIn);
transitionManager.go(scene2, transitionSet);
}
public void transitionAnimation_2 (View view)
{
LinearLayout container = (LinearLayout) findViewById(R.id.activity_main);
Scene scene1 = Scene.getSceneForLayout(container, R.layout.activity_main, this);
Scene scene2 = Scene.getSceneForLayout(container, R.layout.activity_main_after, this);
TransitionInflater transitionInflater = TransitionInflater.from(this);
TransitionManager transitionManager = transitionInflater.inflateTransitionManager(R.transition.transition_manager, container);
ChangeBounds changeBounds = new ChangeBounds();
changeBounds.setDuration(5000);
Fade fadeOut = new Fade(Fade.OUT);
fadeOut.setDuration(3000);
Fade fadeIn = new Fade(Fade.IN);
fadeIn.setDuration(2000);
TransitionSet transitionSet = new TransitionSet();
transitionSet.setOrdering(TransitionSet.ORDERING_SEQUENTIAL)
.addTransition(fadeOut)
.addTransition(changeBounds)
.addTransition(fadeIn);
transitionManager.go(scene1, transitionSet);
}
public void showSnackbar (View view)
{
Snackbar.make(view, "Hello Zyao!!", Snackbar.LENGTH_LONG)
.setAction("Cancel", new View.OnClickListener()
{
@Override
public void onClick (View v)
{
showSnackbar(v);
}
})
.show();
}
}
上面中的過渡動畫XML文件需要放在res/transition
目錄中,其中transition_manager.xml
定義如下飞盆。
<?xml version="1.0" encoding="utf-8"?>
<transitionManager xmlns:android="http://schemas.android.com/apk/res/android">
<transition
android:fromScene="@layout/activity_main"
android:toScene="@layout/activity_main_after"
android:transition="@transition/slow_auto_transition"/>
</transitionManager>
其中slow_auto_transition
也是定義在res/transition
目錄中的自定義動畫文件醉旦,如下。
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" android:transitionOrdering="sequential">
<fade
android:fadingMode="fade_out"
android:duration="1000"/>
<changeBounds
android:duration="2000"
android:interpolator="@android:interpolator/anticipate_overshoot"/>
<fade
android:fadingMode="fade_in"
android:duration="1000"/>
</transitionSet>
動畫演示
總結
雖然這種轉場動畫實現方式有很多桨啃,這次介紹的也不是什么新東西车胡,也不是什么高科技,但是總要體驗一把照瘾,感覺還是可以的匈棘,可以的,以的析命,的主卫。
個人博客:http://zyao89.me