我有一个RelativeLayout
,它存储了五个ImageView
,每个RelativeLayout
都包含一张云图。所有图像的大小不同,最小的是582 * 182,最大的是700 * 400。包含云的区域大小为860 * 1080
在屏幕的顶部是我要加载到我的服务器上的图像,下面是上面描述的 <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>
。当用户落在该屏幕上时,云开始移动。问题是整个动画都严重滞后(我试图在HTC One上运行它)。
我的动画描述如下:
ImageView
<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
检查了硬件加速条件 - 它已启用。我试图通过加载iOS
格式来减少BitMap的大小 - 没有运气。对于这种滞后,我能做些什么吗?
P.S。相同图片的动画在iPhone 4
上运行的{{1}}版应用程序上没有任何延迟。
更新。我注意到,如果我将动画的数量从5减少到4,动画就会顺利运行。
答案 0 :(得分:1)
这可能听起来很疯狂,但在类似情况下让我感到沮丧:
对不同的视图使用不同的动画对象。
在你的情况下: 您需要三个animRTL对象和两个animLTR Java对象。所以:animLTR1,animLTR2,animRTL1 animRTL2,animRTL3。请注意,您不必再创建比已有的XML动画文件更多的XML动画文件。
尝试告诉我结果。
编辑:
我还有另外两个值得尝试的解决方案:
在您的清单中,将其置于应用程序标记
下 android:hardwareAccelerated="true"
android:largeHeap="true"
答案 1 :(得分:0)
与我类似,我的动画可以在小型设备上流畅运行,但是在三星Galaxy Pro等大屏幕尺寸为2560 x 1600像素的大型设备上非常迟钝。
我尝试了很多解决方案但几乎放弃了。但是我意识到我仍然可以拖动而不会滞后一些比我想要用于动画的对象更复杂的对象。显然,一些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();