entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Como funciona invalidate() y postInvalidate()

Hola quisiera saber como funciona la función invalidate(); y postInvalidate();, estoy haciendo una aplicación que tiene algunos retoques gráficos y necesito saber como funciona esto con respecto a animaciones y vistas.
Por ejemplo, tengo un layout con transparencia de fondo que se activa cada tanto para imprimir mensajes en pantalla, un estilo de alert, pero en vez de utilizar el que trae por defecto android, estoy utilizando uno hecho por mi.

1 Respuesta

2votos

Leonardo-Tadei Puntos227020

Hola Hernán,

cuando se llama a invalidate() en el contexto de un UIThread, se le dice al entorno que redibuje la ventana lo más pronto posible.

La llamada a postInvalidate() tiene un efecto similar para un non-UIThread. En este caso se le indica al entorno que redibuje las ventanas asociadas a ese Thead en el próximo ciclo de refrescos..

Hacen falta los dos tipos de llamada para UIThread y para non-UIThread, porque solamente pueden ser usadas dentro del propio thread que se está ejecutando.

Acá está la (muy) breve explicación del manual: http://developer.android.com/reference/android/view/View.html#postInvalidate%28int,%20int,%20int,%20int%29

0voto

mordorq3 comentado

Entiendo, pero por ejemplo, si yo tengo un layout con un ListView, y quiero que encima de esto haya una animación (que la haría con un efecto de transparencia), por ejemplo que aparezca un cartel con un mensaje.
¿Deberia antes de llamar a hacer la animación, llamar a la función invalidate() de ese layout, y despues la animación?
No entiendo muy bien a que se le llama dibujar la ventana.
Aqui debajo te dejo unas imagenes de lo que te estoy hablando.

enter image description here

enter image description here

0voto

Leonardo-Tadei comentado

Hola Hernán,

redibujar la ventana es, simplemente, darle la orden al entorno de que refresque la ventana en curso. Las acciones de usuario por default lo hacen y por eso cuando apretás un botón o deslizas un ListView se ve cambiar la pantalla; pero cuando lo que provoca el cambio no es la interacción del usuario sino otro proceso (una conexión y su respuesta por ejemplo) la ventana nunca se entará de que hubo un cambio, y el mecanismo para forzar el redibujado es Invalidate() o PostInvalidate().

si no entiendo mal, el mensaje con transparencia que aparece encima del ListView está en el mismo UIThread, así que lo que deberías hacer es:

1 - lanzar el mensaje.
2 - llamar a invalidate().

si en cambio el proceso que genera el mensaje está en otro thread, tenés que hacer:

1 - lanzar el mensaje.
2 - llamar a postInvalidate().

el resultado será que el mensaje aparece en la pantalla.

0voto

mordorq3 comentado

Entonces, entiendo que cada vez que se hace algo en pantalla (por UIThread) una vez que termine de dibujar, llamamos a invalidate(), y si lo hace mediante un subproceso ejecutamos la funcion postInvalidate().
Ahora por ejemplo si comienzo a utilizar esta tecnica, ¿podria ser que la parte grafica corra mas fluida? ¿o no tiene ningun tipo de cambio esto?.

0voto

Leonardo-Tadei comentado

La sensación de fluidez se consigue mejor no sobrecargando con efectos la interfaz. En este caso, si el mensaje no es complejo, una llamada a Toast() es más simple y te desentendés de todas estas cuestiones internas.

Lo que conseguís diciéndole al entorno que redibuje la pantalla es que la GUI refleje lo que la aplicación está haciendo y evitar ver mensajes a destiempo o todos juntos al final de un proceso largo.

Saludos

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta