2012-03-25 133 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