[英]Android Fragment Translate Animation Not Working
我正在嘗試為兩個片段做一個簡單的翻譯動畫。 一個從右側進入,另一個向左側進入。 我的最小SDK是14.會發生轉換,但沒有實際的動畫。 在動畫xml中指定的時間之后,片段才會交換。 所以動畫時間正在受到尊重,但沒有實際的翻譯。
我的片段動畫代碼是:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.enter_from_right, R.animator.exit_to_left);
fragmentTransaction.replace(android.R.id.content, termsFragment);
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
我的動畫xml文件是(enter_from_right):
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="100%"
android:toXDelta="0%"
android:duration="1000" />
</set>
和exit_to_left:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="0%"
android:toXDelta="-100%"
android:duration="1000"/>
</set>
看起來你混淆了兩個動畫框架, android.animation
和android.view.animation
(是的,令人困惑)。
您的XML動畫是兩者之間的混合體。 您可以設置android.animation.ObjectAnimator
或android.view.animation.Animation
:請參閱此處和此處以供參考。 在這個特殊情況下,我認為你正在尋找一個簡單的翻譯動畫,它屬於后者,更老,更簡單的類(和鏈接)。
所以:
<objectAnimator>
標記更改為<translate>
; animator
文件夾移動到anim
資源文件夾,並使用R.anim
調用它。 我建議閱讀鏈接的官方文檔,這個主題非常明確。 基本上,對於簡單的平移/旋轉/ alpha動畫,最好在res / anim文件夾中使用視圖動畫( <translate>, <rotate>, <scale>, <alpha>
)。
屬性動畫(如res / animator中的<objectAnimator>
)是一個更強大的工具,您寧願用於復雜情況。
通過一些研究,我發現setCustomAnimations()
的行為更加混亂。
如果使用支持庫,則setCustomAnimations()
僅接受簡單的動畫對象(如<translate>
)。 在這種情況下,它應該工作,你只需要將getFragmentManager()
更改為getSupportFragmentManager()
。
如果您不使用支持庫,則setCustomAnimations()
僅接受屬性動畫(如<objectAnimator>
)。
在第二種情況下,您的簡單動畫變得非常困難(請參閱此處和此處以供參考)。
您可以:
使用其中一個默認轉換:
FragmentTransaction t = getFragmentManager().beginTransaction(); t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); or t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); or t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); or
嘗試在res/animator
資源文件夾中使用非常糟糕的<objectAnimator>
:
<objectAnimator android:propertyName="translationX" android:duration="1000" android:valueFrom="1000" android:valueTo="0" android:valueType="floatType"/>
這很糟糕,因為你需要指定一個像素值(這里我放1000),這樣在不同的設備上看起來會有所不同。 但也許對於快速翻譯而言,這不是一個真正的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.