2014-03-06 93 views
2

我有一個RelativeLayout,它存儲五個ImageView,它們每個都包含一個雲的圖像。所有圖像的大小不同,最小的是582 * 182,最大的是700 * 400。包含雲的區域的大小是860 * 1080。
在屏幕的頂部是我想要加載到我的服務器上的圖像,下面是上述的RelativeLayout。當用戶落在該屏幕上時,雲開始移動。問題在於整個動畫效果不佳(我試圖在HTC One上運行它)。 我的動畫描述如下圖所示:大屏幕尺寸的動畫延遲

<set xmlns:android="http://schemas.android.com/apk/res/android" 
     android:interpolator="@android:anim/linear_interpolator" 
     android:fillEnabled="true" 
     android:fillAfter="true"> 
     <translate xmlns:android="http://schemas.android.com/apk/res/android" 
        android:duration="12000" 
        android:toXDelta="-12%p" 
        android:repeatCount="infinite" 
        android:repeatMode="reverse"/> 
    </set> 

ImageView s的描述,像這樣:

<ImageView 
    android:id="@+id/clouds_image_view_cloud2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:contentDescription="cloud 2" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true"/> 

我開始它象下面這樣:

Animation animRToL = AnimationUtils.loadAnimation(mContext, R.anim.right_to_left); 
Animation animLToR = AnimationUtils.loadAnimation(mContext, R.anim.left_to_right); 

mClouds[0].startAnimation(animRToL); 
mClouds[2].startAnimation(animRToL); 

mClouds[1].startAnimation(animLToR); 
mClouds[3].startAnimation(animLToR); 

mClouds[4].startAnimation(animRToL); 

我檢查硬件加速條件通過mClouds[0].isHardwareAccelerated() - 啓用。我試圖通過加載RGB_565格式來降低BitMap的大小 - 沒有運氣。有什麼我可以做的這個滯後?

P.S.相同圖像的動畫在iPhone 4上運行的應用程序版本iOS沒有任何滯後。

UPD:我注意到,動畫流暢運行,如果我減少5被動畫到4

+0

您是否找到了解決方案?我遇到了類似的情況。 – Jerome

+0

@Jerome不幸的是,我們決定不在android上使用這樣的動畫。 – aga

回答

1

這聽起來很瘋狂雲的數量,但爲我節省了類似的情況:

使用不同動畫對象爲不同的意見。

您的情況: 您需要三個animRTL對象和兩個animLTR Java對象。所以:animLTR1,animLTR2,animRTL1 animRTL2,animRTL3。請注意,您不必再創建比已有的兩個XML動畫文件更多的XML動畫文件。

試着讓我知道結果。

編輯:

有兩個值得嘗試在我的腦海其他解決方案:

在您的清單,在應用程序標籤

android:hardwareAccelerated="true" 

    android:largeHeap="true" 
+0

不幸的是它沒有幫助。 :) – aga

+0

對不起,我編輯了我的答案,以防萬一有動畫問題的其他人跨過。 – Behnam

0

類似我說,我的動畫可以運行在小型設備上流暢運行,但非常緩慢,在大屏幕尺寸爲2560 x 1600像素的三星Galaxy Pro等大尺寸設備上表現得更加輕鬆。

我已經嘗試了許多解決方案,但幾乎放棄。但是我意識到,我仍然可以拖拽一些比我想用動畫更復雜的對象。很顯然,一些Android動畫(至少是翻譯版本)並沒有真正優化。

首先,我嘗試使用一些線程/睡眠模擬拖動行爲。我使用Handler/Runnable編寫了代碼,結果得到了相當的改善。

然後在搜索了一段時間後,我發現ValueAnimator可以用我的Handler/Runnable代碼完成同樣的工作,但是效果更好。我的最終代碼如下所示(水平移動對象):

ValueAnimator anim = ValueAnimator.ofFloat(0, amountToMoveX); 
    anim.setDuration(300); 
    final float startX = mainView.getX(); 

    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      mainView.setX(startX + (Float) animation.getAnimatedValue()); 
     } 
    }); 

    anim.addListener(new Animator.AnimatorListener() { 
     @Override 
     public void onAnimationStart(Animator animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 
     } 

     @Override 
     public void onAnimationRepeat(Animator animation) { 
     } 
    }); 

    anim.start();