2012-09-25 56 views
2

我正在使用Google的compat lib爲在2.2+上運行的設備在我的應用(Target SDK 16,Min SDK 8)中啓用片段。從功能上來看這個運行所有罰款,但通過「pre-butter」中的「Buttery」片段動畫Android

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.setCustomAnimations(inTransition, outTransition, popInTransition, popOutTransition); 

其中inTransition是一個簡單的翻譯像

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator"> 
    <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="@integer/animation_duration" /> 
</set> 

outTransition設置視圖動畫的性能是一個動畫漸變像

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@integer/animation_duration" /> 
</set> 

只是普通的可怕在我的Galaxy S2(4.0.3),即對於持續約350毫秒我會約說的動畫。一半的幀被丟棄。我注意到,如果禁用淡出效果,效果會稍微好一些(但不會太好),但當然動畫的完整效果消失了,因爲原始片段會立即變黑。我也嘗試了代碼的發佈版本,但是性能也沒有提高。

我在做什麼錯?我如何使片段動畫更流暢?

+0

你有什麼動畫,具體是什麼?出於某種原因,您是否禁用硬件加速?你的'targetSdkVersion'是什麼? – CommonsWare

+0

硬件加速是正確的提示!我無法相信我監督了這一點。現在它運行平穩,因爲它應該在4.0以上 - 謝謝一堆! 順便說一句:添加一個普通的答案,所以我可以接受它:) –

回答

7

我推薦的第一件事是在Manifest中啓用硬件加速。這隻會在API 3.0+的設備上啓用,但明顯會提高性能。使用API​​ 11(3.0)及更高版本,您還可以利用View LayerTypes.設置您正在動畫的任何內容到LAYER_TYPE_HARDWARE,然後在完成後將其設置回LAYER_TYPE_SOFTARELAYER_TYPE_NONE

預蜂窩狀,它變得更加困難。你根本沒有硬件加速。您最好檢查if(api < 11) *use this animation* else *use this animation*。滑動動畫傾向於相當平滑地工作。 Alpha動畫是CPU的負擔,尤其是當視圖有很多圖層時。在可以避開的頂級父視圖上應用任何動畫(您正在動畫整個片段,以便它已經發生)。

+0

如果我在應用程序中設置硬件加速,我必須在視圖上設置'LAYER_TYPE_HARDWARE'我正在設置動畫?我開啓了硬件加速功能,並且我仍然在Android 4.1.2中遇到非常糟糕的動畫 – ffleandro

+0

我認爲某處它說你沒有,但我還沒有找到該情況。我將圖層類型設置爲我正在動畫的最頂層父視圖上的硬件。它基本上展平了該視圖,並且一次對父視圖及其所有子視圖進行動畫處理。一旦完成動畫,我將圖層類型設置爲「NONE」,將其從硬件內存中取出。 – DeeV

+0

你可以發佈一個改變片段事務動畫的圖層類型的例子嗎?我在片段事務中設置了'ft.setCustomAnimations(R.anim.slide_in_right,R.anim.slide_out_left,R.anim.slide_in_left,R.anim.slide_out_right)'並試圖覆蓋'Fragment'的'onCreateAnimation', '動畫開始和'getView()。setLayerType(View.LAYER_TYPE_SOFTWARE,null);'在動畫結束時,但是'onCreateAnimation'永遠不會被調用 – ffleandro