2009-07-08 19 views
11

Estoy escribiendo una aplicación para Android que construye un mapa de bits 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.Android SurfaceView desplazamiento

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 devolución de llamada 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.

Respuesta

6

Una vez que comience a usar un SurfaceView, se está moviendo a un mundo en el que tiene un área de píxeles en blanco, y está solo para dibujarlos como desee. 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:. - Extender SurfaceView e implementar SurfaceHolder.Callback - Uso getHolder() addCallback (este) para agarrar la devolución de llamada - Uso eventos OnTouch para implementar el comportamiento de desplazamiento (es decir, al responder, tome la posición x, y desde MotionEvent y establezca el desplazamiento de forma apropiada).

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

Como alternativa, utilice un mapa de bits fuera de la pantalla y haga que se dibuje con un ImageView normal (ajuste el tamaño de ImageView al tamaño del mapa de bits y colóquelo en una vista de desplazamiento).


Editar:

Al ver que esto todavía es conseguir puntos de vista, podría valer la pena señalar que desde este tiempo, he aplicado y liberado como código abierto una pequeña biblioteca que implementa un marco para la funcionalidad anterior (inspirada por muchos comentarios aquí en SO, entre otros). Se puede encontrar en Github: https://github.com/micabyte/android_game

2

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 mapa de bits privado con mi propio lienzo privado en el método doDraw, y luego copiando algo de él en el lienzo que me dieron utilizando el siguiente código.

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 las escalas/transforma píxeles del mapa de bits fuente (mi mapa de bits privada) al destino (el lienzo me dio a recurrir en doDraw()

mScrollX e Y son drawBitmap la esquina superior izquierda del rectángulo que se mostrará (en relación con el gran mapa de bits privada)

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

Sólo asegúrese de que los valores de desplazamiento se encuentran dentro ra aceptable nges [0, privateBitmapWidth-mSurfaceWidth]

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

Cuestiones relacionadas