2011-11-18 4 views
4

Voici un comportement étrange que je ne comprends pas sur les vues personnalisées. J'ai deux vues dans une mise en page, l'une sur l'autre. Les vues sont simples et je les ai fait juste pour un court testAndroid onDraw() s'exécutant sur toutes les vues?

public class View1 extends View { 
.... 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 
      this.updateDrawings(); 
     } 
     return true; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if (canvas != null) 
     { 
      Log.i("Test", "Draw View1"); 
     } 
    } 

    public void updateDrawings() { 
     try { 
      this.invalidate(); 
     } 
     finally { 
     } 
    } 
} 

et View2

public class View2 extends View { 
.... 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if (canvas != null) 
     { 
      Log.i("Test", "Draw View2"); 
     } 
    } 

    public void updateDrawings() { 
     try { 
      this.invalidate(); 
     } 
     finally { 
     } 
    } 
} 

Tout bien emballé sur un FrameLayout

<FrameLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:background="#ffffff"> 

     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"> 

      <com.View2 
       android:layout_centerInParent="true" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_marginBottom="5dip" /> 
     </LinearLayout> 

     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"> 

      <com.View1 
       android:layout_centerInParent="true" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_marginBottom="5dip" /> 
     </LinearLayout> 
</FrameLayout> 

Ma question est: pourquoi, lorsque onTouch s'exécute à partir de View1, la méthode onDraw() de la vue s'exécute? Pourquoi pas seulement View1?

Édition ultérieure View2 a une grande image à dessiner, l'image est pivotée et mise à l'échelle en fonction de certaines préférences enregistrées. Normalement, lorsque je lance l'activité, View2.onDraw() prend en charge la rotation, la traduction et la mise à l'échelle du bitmap et le dessine sur le canevas. Lorsque l'utilisateur touche View1, je veux que View1.onDraw() s'exécute car il est inutile de redessiner la même image d'arrière-plan encore et encore pour chaque interaction utilisateur. Comment puis-je arrêter View2.onDraw() pour s'exécuter?

Répondre

1

Je pense que cela devrait répondre à votre question.

http://developer.android.com/reference/android/view/ViewParent.html#requestLayout()

« Appelé quand quelque chose a changé qui a annulé la mise en page d'un enfant de ce parent vue Ce programmera une passe de mise en page de la voir l'arbre. "

+0

J'ai modifié la question un peu. Pleare lire la section Modifier plus tard, peut-être que vous avez une idée. Merci pour votre réponse. – Alin

+0

Avez-vous essayé d'appeler draw dans View1, au lieu de updateDrawings? Je ne sais pas ce qui va se passer. –

+0

Je suis en train de tester setWillNotDraw (true) pour voir si arrête l'envoi d'invalidate forward. – Alin

Questions connexes