Android View.bringToFront()会导致闪烁

时间:2012-03-25 05:40:48

标签: android view viewgroup

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

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

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

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级别7。

2 个答案:

答案 0 :(得分:1)

在动画期间多次调用applyTransformation(),因此您应该根据interpolatedTime进行动画,当它的1.0,动画结束时,你应该在这里调用你的前导。

所以在我看来这种闪烁发生在对你的方法的一些调用中,getChildAt(0)获得的视图与你想要的视图不同,并且闪烁出现。

答案 1 :(得分:0)

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

如果您使用3.0+ API构建,则可能启用了硬件加速。默认情况下,此功能也在4.0中。您可以尝试使用

    setLayerType(LAYER_TYPE_SOFTWARE, null);

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

此外,您可能不需要调用 requestLayout(),如果所有视图都是relativelayout的子视图,则z-index更改不应该关注它。

几乎可能不需要调用invalidate。您是否尝试过使视图具有可关注性并且只是调用 requestFocus()而不是 bringToFront() bringToFront()显然会从其父级中删除该视图并重新附加它。这可能很容易导致步骤之间失效,因为我不认为在发生这种情况时暂停任何事情。