2009-07-08 26 views
11

Sto scrivendo un'applicazione Android che crea una bitmap fuori schermo che è (diciamo) 640 * 480 pixel e la visualizza in un SurfaceView. Si noti che la dimensione dell'immagine è maggiore della visualizzazione effettiva sul portatile.Android SurfaceView scrolling

Il modo in cui funziona l'applicazione è che inizialmente visualizza l'angolo in alto a sinistra (0,0) dell'immagine e quindi vorrei poter scorrere l'immagine.

La classe Surfaceview implementa il callback onMeasure e restituisce una dimensione di 1024 * 768 che visualizza l'area dell'immagine che corrisponde allo schermo del telefono. Mi piacerebbe implementare il supporto per lo scorrimento che trovo quasi impossibile a causa della documentazione molto limitata (solo gruppi di classi e chiamate senza coerenza). Ho provato a chiamare scrollBy e questo non funziona.

Se qualcuno ha dei suggerimenti su come procedere, sarebbe molto apprezzato.

risposta

6

Una volta iniziato a utilizzare SurfaceView, ti stai spostando in un mondo in cui hai un'area vuota di pixel e sei da solo a disegnare come desideri. Fai tutto da solo - e questo significa che devi implementare anche lo scrolling. Non è banale da fare, ma nemmeno è troppo difficile.

Un modo per farlo è la seguente:. - Estendere SurfaceView e implementare SurfaceHolder.Callback - Uso getHolder() addCallback (questa) per afferrare il callback - eventi Utilizzare OnTouch per l'attuazione del comportamento di scorrimento (vale a dire, quando rispondi, prendi la posizione x, y di MotionEvent e imposta l'offset in modo appropriato).

Implementare una discussione per gestire l'aggiornamento dell'immagine. Ci sono esempi di questo in giro sul web (mi dispiace - non ne ho nessuno in mano adesso).

In alternativa, utilizzare un bitmap fuori schermo e farlo estrarre da un normale ImageView (ridimensionare ImageView alle dimensioni della bitmap e posizionarlo in una vista di scorrimento).


Edit:

Vedendo che questo è ancora ottenendo viste, forse vale la pena sottolineare che, poiché questa volta, ho implementato e rilasciato come open-source una piccola libreria che implementa un quadro per la funzionalità di cui sopra (ispirata da molti commenti qui su SO, tra gli altri). Può essere trovato su Github: https://github.com/micabyte/android_game

2

Ho appena risolto questo per il mio gioco, il mio surfaceView è un adattamento dell'esempio LunarLander di Google.

Tutto è lo stesso eccetto che sto disegnando sulla mia Bitmap privata con la mia tela privata nel metodo doDraw, e quindi ne copio un po 'sulla tela che mi è stata data usando il codice qui sotto.

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

Gli oggetti Rect definiscono come drawBitmap scale/trasforma pixel dalla bitmap di origine (il mio bitmap privata) alla destinazione (la Tela mi è stata data di attingere a doDraw()

mScrollX e Y sono l'angolo superiore sinistro del rettangolo che verrà visualizzato (rispetto al grande bitmap privato)

mSurfaceWidth/altezza è la dimensione del rettangolo che verrà visualizzato

Basta assicurarsi che i valori di scorrimento sono a ra accettabili nges [0, privateBitmapWidth-mSurfaceWidth]

aggiorna i valori di scorrimento comunque come preferisci, (ad esempio su onTouchEvent())

Problemi correlati