在Activity跳轉之間可以設置動畫效果,例如平移,漸變,旋轉等動畫,當然在Fragment中也可以設置切換的動畫效果,可以達到跟ViewPager切換動畫類似的效果。在Fragment中設置自定義切換動畫主要分為了兩種情景,一種是使用 android.app.Fragment包里面的Fragment類時,FragmentManager里面的FragmentTransaction事務只支持XML中的animator標簽,如objectAnimator屬性動畫,不支持傳統的補間動畫標簽如<translate>,<alpha>等。
另一種是使用兼容性版本的android.support.v4.app.Fragment包里面的Fragment類,SupportFragmentManager里面的FragmentTransaction事務支持XML中的animation標簽,也就是傳統的補間動畫,例如<translate>,<alpha>,不支持屬性動畫標簽。
設置Fragment的切換動畫主要是使用FragmentTransaction事務類的中setCustomAnimations方法:
setCustomAnimations FragmentTransaction setCustomAnimations (int enter, int exit, int popEnter, int popExit)
該方法有4個參數,第一個參數enter是指當一個Fragment被添加added 或者綁定attached到視圖上,該Fragment進入視圖時的animation或者animator的資源ID;
第二個參數exit是指當一個Fragment從視圖上被移除removed或者解除綁定detached時,該Fragment移出視圖時的animation或者animator的資源ID;
第三個參數popEnter是指當調用popBackStack()方法或者類似的方法彈出棧頂的Fragment后,Fragment棧的棧頂Fragment重新被添加readded或重新綁定reattached到視圖上時,該Fragment進入視圖時的animation或者animator的資源ID;
第四個參數popExit是指當調用popBackStack()方法或者類似的方法彈出棧頂的Fragment時,該彈出的Fragment即從視圖上被移除removed或者解除綁定detached,該Fragment移出視圖時的animation或者animator的資源ID。
android.support.v4.app.Fragment包實現
要實現Fragment的自定義切換動畫效果,首先需要自定義XML動畫資源文件,可以在res文件夾下新建anim文件夾然后新建XML資源文件。由於android.support.v4.app.Fragment包只支持補間動畫的標簽,所以可以按照自己的想法來在根標簽set中新建動畫標簽來實現效果,如translate平移,alpha漸變透明度,rotate旋轉,scale縮放等。
- slide_left_in.xml 左視圖進入時動畫
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="-100%p" android:toXDelta="0%p" android:duration="300"/> <alpha android:fromAlpha="0.5" android:toAlpha="1.0" android:duration="100"/> </set>
- slide_left_out.xml 左視圖移出時動畫
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0%p" android:toXDelta="-100%p" android:duration="300"/> <alpha android:fromAlpha="1.0" android:toAlpha="0.5" android:duration="200"/> </set>
- slide_right_in.xml 右視圖進入時動畫
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="100%p" android:toXDelta="0%p" android:duration="300"/> <alpha android:fromAlpha="0.5" android:toAlpha="1.0" android:duration="200"/> </set>
- slide_right_out.xml 右視圖移出時動畫
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0%p" android:toXDelta="100%p" android:duration="300"/> <alpha android:fromAlpha="1.0" android:toAlpha="0.5" android:duration="200"/> </set>
Activity中實現
package com.example.call_aidl; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; public class Main2Activity extends AppCompatActivity { ActionBar actionBar; Fragment curFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tab1 = actionBar.newTab(); tab1.setText("新業務Service"); tab1.setTabListener(new MyTabListener(new LeftFragment())); ActionBar.Tab tab2 = actionBar.newTab().setText("盤點Service"); tab2.setTabListener(new MyTabListener(new RightFragment())); actionBar.addTab(tab1); actionBar.addTab(tab2); } class MyTabListener implements ActionBar.TabListener{ private Fragment fragment; public MyTabListener (Fragment fragment){ this.fragment=fragment; } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { curFragment = fragment; ft.setCustomAnimations(R.anim.slide_right_in, R.anim.slide_left_out, R.anim.slide_left_in, R.anim.slide_right_out).replace(R.id.context,fragment); } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { } } @Override protected void onDestroy() { super.onDestroy(); } }