6

我在 FrameLayout 中有几个视图。我写了一个过渡,每个视图都应用了一个自定义动画类。在此过渡期间,我需要将 z 顺序底部的视图置于前面。我这样做:

    public static void putBackAtFront(ViewGroup v) 
    {
        v.getChildAt(0).bringToFront();
        refreshEverything(v);
    }

这从我的自定义动画的 applyTransformation() 中调用。

IE

public class PivotAnimation extends Animation {
    private View view;
    ...
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) 
    {
        ...
        if(interpolatedTime >= 1.f && isAtBack(view))
        {
           putBackAtFront(view);
        }
        ...
    }
    ...
}

refreshEverything() 在父 FrameLayout 及其所有子级上调用 invalidate() 和 requestLayout()。

一切正常,除了当调用 putBackAtFront() 时,现在位于底部的视图会消失一帧,然后立即重新出现,从而导致明显的闪烁。我也试过不调用 refreshEverything(),它没有区别。

我的目标是 API Level 7。

4

2 回答 2

1

applyTransformation() 在动画过程中被多次调用,所以你应该根据 interpolatedTime 做动画,当它的 1.0 时,动画结束,所以你应该在这里调用你的带到前面。

因此,在我看来,当在对您的方法的某些调用中,getChildAt(0) 获得的视图与您想要的视图不同并且出现闪烁时,就会发生这种闪烁。

于 2012-04-02T14:19:00.707 回答
0

我认为它必须是以下三件事之一:

如果您使用 3.0+ API 进行构建,您可能启用了硬件加速。这在 4.0 中也是默认开启的。您可以尝试使用

    setLayerType(LAYER_TYPE_SOFTWARE, null);

在该布局/视图/窗口上禁用硬件加速。

此外,您可能不需要调用requestLayout(),如果所有视图都是相对布局的子级,则 z-index 更改不应该涉及它。

几乎可能不需要调用无效。您是否尝试过使视图具有焦点并仅调用requestFocus()而不是bringToFront()bringToFront()显然从其父视图中删除并重新附加它。这很容易导致步骤之间的无效,因为我认为在这种情况发生时没有任何东西会暂停绘图。

于 2012-04-05T17:55:29.797 回答