2014-03-06 94 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();