2014-06-12 263 views
2

花了很多時間尋找這個之後,我需要在這裏請求幫助。片段和幻燈片上的動畫

我有一系列代表「頁面」的片段。 我想在轉到他請求的下一頁時給用戶一個很好的動畫效果。

我希望新的片段可以滑過上一個片段,隱藏它就好像它是一個實體頁面一樣。 目前我可以在新片段中滑動,但在轉換過程中我們仍然可以看到底層片段。

這裏是我的過渡定義 「幻燈片」:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" > 

    <objectAnimator 
     android:duration="500" 
     android:propertyName="x" 
     android:valueFrom="-1280" 
     android:valueTo="0" 
     android:valueType="floatType" /> 
</set> 

,這裏是我的淡出過渡

<set xmlns:android="http://schemas.android.com/apk/res/android" > 
    <objectAnimator 
     android:propertyName="alpha" 
     android:duration="500" 
     android:valueFrom="1.0" 
     android:valueTo="0" 
     android:valueType="floatType" /> 
</set> 

我套用:

Fragment f = (Fragment)FragClass.newInstance(); 
FragmentTransactionft = getFragmentManager().beginTransaction(); 
ft.setCustomAnimations(R.animator.fragment_slide_in, R.animator.fragment_fade_out); 
ft.replace(R.id.fl_frame, f); 
ft.commit(); 

我所看到的我想用ViewPager來演示這種效果 - 但我使用的是片段。 可以通過片段動畫實現這種轉換(只需從最後顯示的左側位移入)? 或者可能是片段動畫和屬性動畫的混合? - 嘗試過,但它非常混亂。

我在平板電腦上爲Android 4.0及以上版本構建。

我不想爲此使用ViewPager,試圖避免支持庫。

回答

0

經過相當多的實驗和測試,這裏是我採用的方法。

可能不是最好的,但它適用於我。

  1. 創建片段的動畫,其不執行任何
  2. 當創建新的片段,通過在初始X位置,該位置是容器視圖的負寬度。這會將新的片段偏移量隱藏到容器視圖的左側,並因此隱藏起來。在FragmentTransaction
  3. 呼叫setCustomAnimations與「留還是」動畫
  4. 使用FragmentTransaction 添加新片段
  5. 創建一個動畫監聽器,在onAnimationEnd,將調用包含視圖做到以下幾點。
  6. 互換的兩個視圖通過調用bringChildToFront
  7. 開始一個新的視圖動畫的舊觀點萎縮,並淡出出來
  8. 開始一個新的視圖動畫的新觀點,以它滑入
  9. 順序
  10. 將AnimatorListener附加到動畫上,以便在動畫結束時刪除舊視圖。

這些是需要遵循的步驟,剩下的只是實現:-D

+0

你如何將AnimatorListener添加到FragmentTransaction中?我試圖解決這個相同的問題,我不能完全實現你的解決方案。 –

+0

@ JessieA.Morris:解決方案並不那麼直接。動畫偵聽器未連接到FragmentTransaction。您需要在每個片段中重寫以下函數:'public Animator onCreateAnimator(int transit,boolean enter,int nextAnim)'。檢查'nextAnim'是否不是0,然後:'Animator anim = AnimatorInflater.loadAnimator(getActivity(),nextAnim); anim.addListener([你的動畫師監聽器]);'。希望這可以幫助。 – Simon

+2

可以請你分享一些解決方案的代碼,我希望新的片段可以滑過舊的片段。 – Dory

0

我發現比任何已經提出作爲然而其他的顯著更好的解決方案。我做的是以下幾點:

 FragmentManager manager = getSupportFragmentManager(); 

     FragmentTransaction ft = manager.beginTransaction(); 

     FragmentManager.BackStackEntry entry = manager.getBackStackEntryAt(manager.getBackStackEntryCount() - 1); 
     Fragment oldFragment = manager.getFragments().get(entry.getId()); 

     ft.setCustomAnimations(R.anim.slide_left, R.anim.slide_left_out, R.anim.slide_right, R.anim.slide_right_out); 

     ft.hide(oldFragment); 

     ft.add(R.id.container, login).addToBackStack(null).commit(); 

這使得被刪除的片段在新的片段下。按下後退按鈕時看起來有點奇怪,但總體來說它明顯更好。 :-)

+0

你在這裏提出的建議很有意思,但不符合我上面概述的要求。底層輸出片段應該「縮小」並淡出,而不是向右滑動,正如您從ViewPager所做的鏈接中所看到的。 – Simon

+0

因此使用不同的動畫。而不是R.anim.slide_left做R.anim.shrink_and_fade或其他什麼。困難的部分是讓我的解決方案所做的舊片段之上的新片段。 –