2010-08-23 53 views
1

我做了一個示例應用程序來翻轉viewflipper中的不同佈局。Android的主屏幕像設置child.setvisibility(View.Visible)效果閃爍的問題

XML基本上是(僞代碼)

<ViewFlipper> 
<LinearLayout><TextView text:"this is the first page" /></LinearLayout> 
<LinearLayout><TextView text:"this is the second page" /></LinearLayout> 
<LinearLayout><TextView text:"this is the third page" /></LinearLayout> 
</ViewFlipper> 

而且在Java代碼中,

public boolean onTouchEvent(MotionEvent event) 
case MotionEvent.ACTION_DOWN { 
    oldTouchValue = event.getX() 
} case MotionEvent.ACTION_UP { 
    //depending on Direction, do viewFlipper.showPrevious or viewFlipper.showNext 
    //after setting appropriate animations with appropriate start/end locations 
} case MotionEvent.ACTION_MOVE { 
    //Depending on the direction 
    nextScreen.setVisibility(View.Visible) 
    nextScreen.layout(l, t, r, b) // l computed appropriately 
    CurrentScreen.layout(l2, t2, r2, b2) // l2 computed appropriately 
} 

上述僞代碼在屏幕上拖動(就像家裏的時候效果很好移動內部viewflipper linearlayouts屏幕)。

問題是,當我做nextScreen.setVisibility(View.VISIBLE)。當下一個屏幕被設置爲可見時,它會在屏幕上閃爍,然後移動到合適的位置。 (我想它是在0位置可見的。)

有沒有辦法加載下一個屏幕而不會在屏幕上閃爍?我想讓它在屏幕之外加載(顯示),以免閃爍。

非常感謝您的時間和幫助!

回答

3

+1。我有完全相同的問題。我嘗試將layout()和setVisible()調用切換爲無效。

更新: 問題原來是設置nextScreen視圖可見性的正確順序。如果您在調用佈局()之前將可見性設置爲可見,則會在您注意到的位置0處出現閃爍。但是,如果您先調用layout(),則會因爲可見性爲GONE而被忽略。我做了兩件事來解決這個問題:

  1. 在第一次調用layout()之前,將可見性設置爲INVISIBLE。這與GONE的不同之處在於layout()被執行 - 你只是沒有看到它。
  2. 設置能見度可見異步,所以佈局()和相關信息的處理首先

在代碼:

case MotionEvent.ACTION_DOWN: 
    nextScreen.setVisibility(View.INVISIBLE); //from View.GONE 

case MotionEvent.ACTION_MOVE: 
    nextScreen.layout(l, t, r, b); 
    if (nextScreen.getVisibility() != View.VISIBLE) { 
    //the view is not visible, so send a message to make it so 
    mHandler.sendMessage(Message.obtain(mHandler, 0)); 
} 

private class ViewHandler extends Handler { 

    @Override 
    public void handleMessage(Message msg) { 
     nextScreen.setVisibility(View.VISIBLE); 
    } 
} 

更優雅/更容易的解決方案,歡迎!