我在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。
答案 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()显然会从其父级中删除该视图并重新附加它。这可能很容易导致步骤之间失效,因为我不认为在发生这种情况时暂停任何事情。