[Android]Fragment自定義動畫、動畫監聽以及兼容性包使用

  Fragment是Android在API 11以後加入的一個組件,對提升Android開發中的佈局合理性和佈局效率都有很大做用,尤爲是在Android平板等大屏幕設備的開發中,Fragment的引入能更好地利用較大的屏幕空間。android

  本文主要說明Fragment使用簡介、Fragment自定義動畫的使用、監聽動畫過程、以及在較低API版本中使用兼容性包來實現上述功能。app

 

  首先簡要說一下添加Fragment方法,能夠直接在Activity的佈局文件中加入fragment標籤ide

        <fragment 
            android:name="com.example.test.ExampleFragment"
            android:id="@+id/example_fragment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
        />

也能夠在代碼中將Fragment加入已存在的ViewGroup中佈局

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
ft.add(R.id.fragment_container, fragment);
ft.commit();

而在Fragment類中加入UI則只須要在Fragment類中重寫onCreateView方法,並在方法中添加布局文件動畫

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.example_fragment, container, false);
    }

 

  第二,爲Fragment添加動畫。添加自帶動畫效果很簡單,只須要在添加Fragment或者進行Fragment動做變化時爲FragmentTransaction對象添加setTransaction()方法,自帶的動畫效果有:FragmentTransaction.TRANSIT_FRAGMENT_OPEN、TRANSIT_FRAGMENT_CLOSE、TRANSIT_FRAGMENT_FADE等等,任君選擇。而除了add()添加fragment方法以外還有replace()、show()、hide()等不一樣的操做。spa

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, fragment, "ExampleFragment")
    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
    .commit();

若是這些自帶動畫效果不能知足咱們的要求,好比想要實現Fragment的滑動效果,就須要自定義動畫了。添加自定義動畫的方法是setCustomAnimations(int enter, int exit),這兩個參數分別是進入和離開兩個動畫的資源文件ID。使用方法以下,注意setCustomAnimations方法必須在replace或者add等方法以前被調用。code

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

而後就是本身定義動畫文件fragment_in.xml和fragment_out.xml了,可是這裏有個很是要注意的問題,原生庫android.app.Fragment支持的動畫再也不是之前的含有<translate>標籤的動畫了,而是新的<objectAnimator>標籤。好比定義向左滑入動畫咱們之前都是這麼寫的xml

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="100%p"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="300"/>
</set>

可是若是在原生Fragment動畫中使用此描述文件,會出現不認識translate標誌的錯誤,新的動畫描述方法以下:對象

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="1280"
    android:valueTo="0" 
    android:duration="300"/>
</set>

這樣寫進入和離開動畫效果就沒有問題了。在這裏有個問題我暫時沒明白,在使用<translate>時可以使用fromXDelta="100%p"這樣的方式以百分比的形式定義位置,而在<objectAnimator>貌似沒找到這種相對的定義方法,有高手知道還請賜教~blog

至於爲何Google要這麼蛋疼弄一種新的動畫定義方式我也不特別能理解。。。就跟Animation和Animator同樣。

 

  第三,在咱們自定義好動畫後,有時候須要判斷個人動畫有沒有開始?有沒有結束?這時就須要對動畫執行狀態進行監聽。對此,能夠在Fragment類中重寫一個onCreateAnimator()方法,這個方法會在執行動畫時被調用。在方法中設置動畫Animator的監聽器。以下:

    @Override
    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
       
        final Animator anim = AnimatorInflater.loadAnimator(getActivity(), nextAnim);
        anim.addListener(new AnimatorListenerAdapter()
        {
            @Override
            public void onAnimationStart(Animator animation)
            {
                //動畫開始
            }

            @Override
            public void onAnimationEnd(Animator animation)
            {
                //動畫結束
            }
        });
        return anim;
    }

 

  最後,上面說的一切都是在API 11也就是3.0以上的系統中原生支持的,若是咱們須要在支持低於3.0系統的app中使用Fragment該怎麼辦呢?這時的自定義動畫和動畫監聽又將如何?下面來講明這些問題。

  解決的方法很簡單,原生不足,兼容來補。爲了增長對低版本系統的兼容性,Android提供了一個兼容性庫,叫作android-support-v4.jar(有了這個庫,媽媽不再用擔憂個人應用兼容性了),這個包如今在新建工程時應該就帶着了,而其對應的兼容性包android.support.v4.app中,就包含有Fragment這個類。也就是說,支持老版本的app(MiniSDK選API 11如下)在使用Fragment時,就直接繼承自android.support.v4.app.Fragment,而不繼承自原生的android.app.Fragment。一樣,FragmentTransaction和FragmentManager來自這個兼容性包,這裏要注意的是來自這個包的獲取FragmentManager的方法再也不是getFragmentManager(),而是getSupportFragmentManager()。

  使用這個兼容性包以後,添加自定義動畫的過程仍和以前一致,不過因爲是低版本的兼容性包,因此描述動畫的xml文件中,咱們又須要用回之前<translate>的描述方法,其實這對用習慣這種動畫定義方法的人來講仍是比較方便的。(又能夠用相對位置定義了。。。)

  使用兼容性包的Fragment咱們仍然想監聽動畫狀態,但這時發現繼承自兼容性包的Fragment已經找不到可重寫的方法onCreateAnimator()了,這時,會出現另外一個更老、咱們更熟悉的方法onCreateAnimation(),一樣,重寫這個方法並在其中爲Animation對象設置監聽器以實現對動畫狀態的監聽。

    @Override
    public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {

        Animation anim = AnimationUtils.loadAnimation(getActivity(), nextAnim);

        anim.setAnimationListener(new AnimationListener() {

            public void onAnimationStart(Animation animation) {
                //動畫開始
            }

            public void onAnimationRepeat(Animation animation) {
                //動畫循環
            }

            public void onAnimationEnd(Animation animation) {
                //動畫結束
            }
        });

        return anim;
    }

  

  以上,就是我總結的Fragment動畫相關的一些內容。

相關文章
相關標籤/搜索