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?
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
Avez-vous essayé d'appeler draw dans View1, au lieu de updateDrawings? Je ne sais pas ce qui va se passer. –
Je suis en train de tester setWillNotDraw (true) pour voir si arrête l'envoi d'invalidate forward. – Alin