2010-08-23 1 views
1

J'ai créé un exemple d'application pour parcourir différentes mises en page dans un viewflipper.Problème de scintillement de l'écran d'accueil Android lorsque l'enfant est mis child.setvisibility (View.Visible)

XML est fondamentalement (pseudo-code)

<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> 

Et dans le code 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 
} 

Au-dessus de code pseudo fonctionne bien en mouvement linearlayouts à l'intérieur viewflipper lors du déplacement sur l'écran (comme la maison écran).

Le problème est lorsque je fais nextScreen.setVisibility (View.VISIBLE). Lorsque l'écran suivant est visible, il clignote sur l'écran avant de passer à la position appropriée. (Je suppose qu'il est rendu visible à l'emplacement 0.)

Y at-il un moyen de charger l'écran suivant sans le faire scintiller sur l'écran? Je veux qu'il soit chargé (rendu visible) hors de l'écran afin qu'il ne scintille pas.

Merci beaucoup pour votre temps et votre aide!

Répondre

3

+1. J'ai le même problème. J'ai essayé de passer les appels layout() et setVisible() à aucun effet.

Mise à jour: Le problème se révèle être la séquence correcte dans le réglage de la visibilité de la vue NextScreen. Si vous définissez la visibilité sur VISIBLE avant en appelant layout(), vous obtenez le scintillement à la position 0 comme vous l'avez remarqué. Mais si vous appelez layout() en premier, il sera ignoré car la visibilité est GONE. J'ai fait deux choses pour résoudre ce problème:

  1. Définissez la visibilité sur INVISIBLE avant le premier appel layout(). Cela diffère de GONE en ce que le layout() est exécuté - vous ne le voyez pas.
  2. définir la visibilité à VISIBLE de manière asynchrone, de sorte que la mise en page() et les messages connexes sont traités en premier

Dans le code:

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); 
    } 
} 

Plus élégantes/solutions plus simples sont les bienvenus!

Questions connexes