多个视图和动画滞后

时间:2014-01-20 16:30:35

标签: android animation lag

我有两个RelativeLayout视图。第一个有大约三个孩子。第二个视图只有第一个视图作为其子视图。我有两个动画, fadeIn translateIn ,它们必须分别应用于视图 firstView secondView 。以下代码正在运行。它们同时开始和结束,但它是滞后的。它不是那么顺利。有什么办法可以让他们同时顺利地运行它们吗?

以下是代码:

private static final int duration = 500;
protected static boolean ANIMATION_FINISHED;

protected static void onShowAnimation() {

    int width;
    ANIMATION_FINISHED = false;
    width = getScreenWidth();

    final AlphaAnimation fadeIn = new AlphaAnimation(0, 1);
    final TranslateAnimation translateIn = new TranslateAnimation(-width, 0, 1, 1);

    fadeIn.setDuration(duration);
    translateIn.setDuration(duration);

    firstView.startAnimation(translateIn);
    secondView.startAnimation(fadeIn);

    secondView.postDelayed(new Runnable() {

        @Override
        public void run() {
            ANIMATION_FINISHED = true;
        }
    }, duration);
}

2 个答案:

答案 0 :(得分:4)

直到姜饼的动画在Android中总是相当滞后。在Honeycomb和forward中,他们使用新框架修复它,但是开发人员(那是你)必须知道要使用哪个框架。

要获得平滑的硬件加速动画,您应该使用android.animation而不是android.view.animation

这里有完整的属性动画框架指南:https://developer.android.com/guide/topics/graphics/prop-animation.html

这里是它的基类: https://developer.android.com/reference/android/animation/package-summary.html

如果您需要在姜饼或更低的姜饼上定位设备,我建议您使用NineOldAndroid library自动处理设备的最佳框架。 (记住它在2.3上仍然是滞后的,但至少3.0+会很顺利)。

ps:您不应该使用postDelayed来了解动画何时结束,而是使用Animation Listener

答案 1 :(得分:2)

经过大量搜索,我终于成功消除了动画过程中的滞后现象。

您需要设置

const

在开始动画之前和完成动画之后,您需要进行设置,

yourAnimatedView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

在动画过程中,您的视图可能会在每帧中重绘。如果使用视图图层,则不必重新绘制每一帧,而是将视图渲染到屏幕外缓冲区中一次,即可重复使用。

此外,硬件层缓存在GPU上,这使得动画过程中的某些操作快得多。简单的转换(平移,旋转,缩放和alpha)可以通过图层快速呈现。由于许多动画只是这些转换的组合,因此图层可以增强动画性能