Desplazamiento de Android SurfaceView

Estoy escribiendo una aplicación de Android que crea un bitmap fuera de pantalla que es (digamos) 640 * 480 píxeles y lo muestra en un SurfaceView. Tenga en cuenta que el tamaño de la imagen es mayor que la pantalla real en el auricular.

La forma en que funciona la aplicación es que inicialmente muestra la esquina superior izquierda (0,0) de la imagen y luego me gustaría poder desplazarme por la imagen.

Mi clase Surfaceview implementa la callback onMeasure y devuelve un tamaño de 1024 * 768 que muestra el área de la imagen que corresponde a la pantalla del teléfono. Me gustaría implementar soporte para el desplazamiento que me parece casi imposible debido a la documentación muy limitada (solo grupos de clases y llamadas sin coherencia). Intenté simplemente llamar a scrollBy y eso no funciona.

Si alguien tiene alguna sugerencia sobre cómo proceder, esto sería muy apreciado.

Una vez que comienzas a usar SurfaceView, te estás moviendo a un mundo en el que tienes un área en blanco de píxeles, y estás solo para dibujarlos como quieras. Usted hace todo usted mismo, y eso significa que debe implementar el desplazamiento también. No es trivial, pero tampoco es demasiado difícil.

Una forma de hacerlo es la siguiente: – Extienda SurfaceView e implemente SurfaceHolder.Callback – Use getHolder (). AddCallback (this) para captar la callback – Use eventos OnTouch para implementar el comportamiento de desplazamiento (es decir, al responder, tome la x , y posición del MotionEvent y ajuste el desplazamiento de forma apropiada).

Implementar un hilo para manejar la actualización de la imagen. Hay ejemplos de esto en la web (lo siento, no tengo nada a mano en este momento).

Alternativamente, use un bitmap fuera de la pantalla y haga que se dibuje con un ImageView normal (ajuste el tamaño del ImageView al tamaño del bitmap y colóquelo en una vista de desplazamiento).


Editar:

Al ver que esto todavía está recibiendo visitas, podría valer la pena señalar que desde esta vez, he implementado y publicado como fuente abierta una pequeña biblioteca que implementa un marco para la funcionalidad anterior (inspirado en muchos comentarios aquí en SO, entre otros). Se puede encontrar en Github: https://github.com/micabyte/android_game

Acabo de resolver esto para mi propio juego, mi surfaceView es una adaptación del ejemplo LunarLander de Google.

Todo es lo mismo, excepto que estoy dibujando en mi propio bitmap privado con mi propio canvas privado en el método doDraw, y luego copiando algo de él en el canvas que me dieron utilizando el código siguiente.

Rect src = new Rect(mScrollX, mScrollY, mScrollX+mSurfaceWidth, mScrollY+mSurfaceHeight); Rect dst = new Rect(0, 0, mSurfaceWidth, mSurfaceHeight); surfaceCanvas.drawBitmap (mLevelBitmap, src, dst, null); 

Los objetos Rect definen cómo drawBitmap escala / transforma píxeles del bitmap de origen (mi bitmap privado) al destino (el canvas que se me asignó para dibujar en doDraw ()

mScrollX e Y son la esquina superior izquierda del rectángulo que se mostrará (relativo al gran bitmap privado)

mSurfaceWidth / Height es el tamaño del rectángulo que se mostrará

Solo asegúrese de que los valores de desplazamiento estén dentro de los rangos aceptables [0, privateBitmapWidth-mSurfaceWidth]

actualice los valores de desplazamiento usted mismo como lo desee, (en onTouchEvent () por ejemplo)