2012-03-25 126 views
6

我有一个FrameLayout内的几个视图。我写了一个转换,其中每个视图都有一个自定义的Animation类应用。在这个转换过程中,我需要将视图底部的z顺序放在前面。我这样做:Android View.bringToFront()导致闪烁

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()调用无效()和requestLayout()对父的FrameLayout和它的所有儿童。

除了在调用putBackAtFront()时,现在最底层的视图在瞬间重新出现之前就消失了一帧,导致明显的闪烁,所有东西都完美运行。我也尝试不调用refreshEverything(),它没有任何区别。

我针对API级别7

回答

1

applyTransformation()在动画过程中被多次调用,所以你应该做的基础上,interpolatedTime,动画时的1.0,动画是在年底,所以你应该打电话给你带到这里。

所以我认为这种闪烁发生在这些调用你的方法时,getChildAt(0)会得到与你想要的不同的视图,闪烁出现。

+0

对不起,我已更新我的问题以澄清。我已经按你说的去做了; putBackAtFront()只在转换结束时被调用一次,而不是每次都调用。 – 2012-04-03 03:08:04

0

我想它必须是以下三种情况之一:

如果你用3.0+ API的建筑,你可以启用硬件加速。这在4.0中也是默认的。您可以尝试使用

setLayerType(LAYER_TYPE_SOFTWARE, null); 

禁用该布局/视图/窗口上的HW加速。

而且,你可能不需要调用requestLayout(),如果所有的意见是一个RelativeLayout的,一个z-index的变化不应该关注它的孩子。

几乎可能不需要调用invalidate。你有没有尝试使视图焦点,只需要调用requestFocus()而不是bringToFront()bringToFront()显然将其视图从其父项中移除并重新添加它。这很容易导致步骤之间的失效,因为我不认为任何事情正在暂停绘图。

+0

感谢您的建议。正如问题所述,我针对API 7(2.1),所以硬件加速不适合我。 requestFocus()不会改变我需要发生的z顺序。也正如我已经试过的问题所述,没有requestLayout()和invalidate()。在任何情况下,都会在UI(main)线程中调用bringToFront(),因此,根据文档,应该按照定义“暂停”图形。除非文档没有讲完整个故事,并且有一些异步渲染正在进行。 – 2012-04-10 03:16:57