Android onDraw () ejecutándose en todas las vistas?

Aquí hay un comportamiento extraño que no entiendo acerca de las vistas personalizadas. Tengo dos vistas en una disposición del marco, una encima de la otra. Las vistas son simples y he hecho sólo para una prueba corta

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

Y 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 { } } } 

Todo bien embalado en 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> 

Mi pregunta es: ¿por qué cuando onTouch se ejecuta desde View1, se ejecuta el método onDraw () de la vista? ¿Por qué no sólo View1?

Posteriormente Edit View2 tiene una imagen grande para dibujar, la imagen se rota y se escala de acuerdo con algunas preferencias guardadas. Normalmente, cuando inicie la actividad, View2.onDraw () se encarga de girar, traducir y escalar el mapa de bits y dibujarlo en el lienzo. Cuando el usuario toca View1 sólo quiero que View1.onDraw () se ejecute porque no hay ningún punto para volver a dibujar la misma imagen de fondo una y otra vez para cada interacción del usuario. ¿Cómo puedo detener la ejecución de View2.onDraw ()?

One Solution collect form web for “Android onDraw () ejecutándose en todas las vistas?”

Creo que esto debería responder a su pregunta:

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

"Cuando se ha cambiado algo que ha invalidado el diseño de un hijo de este padre de vista, se programará un pase de presentación del árbol de vistas".

  • Android Deslizante Vista
  • Cómo crear un pulldown personalizado en el Honeycomb ActionBar?
  • Cómo obtener el índice de una vista particular (personalizada) de ViewGroup (FrameLayout) después de hacer onLongClick en la vista
  • El elemento de lista (una vista) cambia de orden sin que suceda mientras se desplaza (rápido) en un ListView
  • Creación de CustomViews como un componente modular y reutilizable que se puede utilizar en todos los proyectos
  • Pase Android NestedScrollView desplazamientos horizontales a un padre Ver
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.