Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Transiciones bruscas en pantalla (https://www.clubdelphi.com/foros/showthread.php?t=90101)

jhonalone 06-04-2016 19:03:02

Transiciones bruscas en pantalla
 
Hola amigos.
Estoy intentando hacer zoom con una imagen.

Y me encuentro un problema que me lleva ya unos 15 días y que no soy capaz de resolver.
Tengo una imagen que está incluída en un TScrollBox, que a su vez pertenece a un TPanel.

Hago zoom con un gesturemanager sobre la imagen y utilizo la cualidad de desplazarse con las ScrollBars del Scrolbox en los 4 sentidos del los ejes X e Y.

La cosa funciona... REGULAR...

Me explico: los desplazamientos y el zoom se realizan, pero en la pantalla del dispositivo van como a GOLPES. Entre una imagen y la siguiente no se realiza una transición homogénea.

Quiero decir que (p.e.) al hacer zoom, se ve crecer o disminuir el tamaño bruscamente.

He visto los ejemplos proporcionados por Embarcadero llamados "ImageZoom" y "HorizontalScroll", los he compilado e instalado en el dispositivo y las transiciones entre las imágenes son mucho más homogéneas.

No consigo entender por qué. Cuando utilizo estas funciones en otros programas instalados en el dispositivo, como leer el periódico en la web (p.e.) las transiciones son mucho más progresivas.

No sé si existe algún truco o tengo que resignarme...

Por favor, si alguien tiene información al respecto, agradecería la compartiera conmigo. Gracias.

Saludos.

Ñuño Martínez 06-04-2016 19:30:32

Dices que los ejemplos que incluye Embarcadero funcionan más suavemente. ¿Las has comparado con tu código, a ver qué diferencias hay?

De todas formas, y adivinando, aquí te dejo algunas pistas que podrían ayudar (o no).

Por lo que dices, la construcción en capas de lo que se muestra en pantalla es así:
Código:

  TForm
    TPanel
      TScrollBox
        TImage

Cada vez que tiene que actualizar la pantalla, se llama al método Draw de TForm, que llama al método Draw de TPanel, que llama al método Draw de TScrollBox, que llama al método Draw de TImage.

Además, cada vez que dibuja el TImage hace una interpolación para el zoom, comprobando también los límites dentro de TScrollBox, que comprueba los límites también en el TPanel (aunque no sé si con alineación al área cliente optimiza algo). Y aún queda el tema de que TImage almacena la imagen completa, sin pérdida ni adaptándola al dispositivo (número de colores, tamaño, etc.), por lo que es posible que deba hacerse alguna conversión cada vez que se dibuja. Dependiendo de la implementación de los componentes (que desconozco) es posible que muchas de estas comprobaciones, interpolaciones y conversiones las haga por cada pixel de forma independiente. Si es así, normal que vaya a saltos, ya que cada parte hay que multiplicarla por el número de píxels de la imagen.

Para realizar animaciones complejas, te recomiendo dos opciones:
  1. Buscar un componente específico que haga dicha animación, ya que suele optimizar el proceso. Posiblemente es lo que hacen en los ejemplos de Embarcadero (no los he visto, así que estoy adivinando).
  2. Hacer tú el trabajo, usando como "lienzo" un componente óptimo para mostrar gráficos rápidamente. Por ejemplo, un componente que use OpenGL (OpenGL ES, en este caso concreto).

jhonalone 06-04-2016 20:56:16

Gracias Ñuño.
Tienes toda la razón con los niveles. Ya lo había pensado, porque los ejemplos de Embarcadero son unos programas pequeñitos que solo tienen el Form y la imagen el que hace zoom y el Form, un HorizontalScrollBox y 4 TImage el que hace desplazamiento horizontal.

He copiado el código, que tiene alguna instrucción menos que el mío, pero no hay diferencia significativa.

He sacado el TImage de su anclaje, para ponerlo directamente en el form y tampoco hay diferencia. He llegado a la conclusión de que es posible que influya el peso total del programa.

No se como funciona OpenGL, nunca lo he utilizado.

Gracias de nuevo. Seguiré investigando.

Saludos.


La franja horaria es GMT +2. Ahora son las 10:18:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi