2010-01-11 11 views
7

Deseo implementar el desplazamiento vertical de los contenidos de un elemento canvas de HTML5. No quiero volver a mostrar todo el contenido. En cambio, me gustaría mover todo el contenido hacia abajo/arriba y solo mostrar el área, que se ha desplazado a la vista.Cuál es la forma más rápida de mover una región rectangular (píxel) dentro de un elemento de lienzo HTML5

Experimenté con las funciones getImageData y putImageData pero en mis pruebas son casi tan lentas como repintar toda la escena.

// scroll 20px down 
var data = ctx.getImageData(0, 0, width, height-20); 
ctx.putImageData(0, 20); 

¿Cuál es la forma más rápida de copiar regiones de píxeles rectangulares dentro de un elemento de lienzo?

Respuesta

12

Prueba esto:

ctx.drawImage(ctx.canvas, 0, 0, width, height-20, 0, 20, width, height-20); 

drawImage puede tomar ya sea un HTMLImageElement, un HTMLCanvasElement, o un HTMLVideoElement para el primer argumento.

7

Para la velocidad absoluta, me gustaría utilizar una de gran tamaño <canvas> dentro de un <div> con overflow:hidden establecer a continuación, utilizar métodos DOM regulares para desplazarse por la <canvas> dentro de la <div>.

Por supuesto, esto sacrifica el uso de la memoria a favor de la velocidad.

+0

Buena idea, pero desafortunadamente no sé el tamaño exacto de antemano y el área de desplazamiento es potencialmente de miles de píxeles de altura, así que no creo que esto funcione para mí. –

+0

Ojalá hubiera sabido de este enfoque antes de implementar el desplazamiento en mi aplicación. Uso doble buffering con un gran lienzo oculto y un pequeño lienzo de ventana gráfica. Luego copio la nueva porción visible desde el oculto a la ventana gráfica. Funciona, pero probablemente podría ser más rápido. Y si la imagen pudiera tener miles de píxeles de altura, mi solución no funcionaría. –

+0

Pero si no hay ninguna expectativa de poder desplazarse hacia abajo, cuando llegue al final, puede volver a pintar la última pantalla en un nuevo lienzo "extra grande". Y si tiene algún tiempo de inactividad (como una pausa en el flujo de mensajes), puede volver a pintar y truncar sin que nadie se dé cuenta. La técnica anterior no elimina el retraso, pero sin duda lo limita a pasar mucho menos. –

Cuestiones relacionadas