Domanda

Sto riflettendo le alternative su come scorrere un "infinito", squame, il controllo in Android. La semplice idea è quella di ridisegnare l'intera vista su ogni movimento di scorrimento, ma in qualche modo non mi sembra il modo corretto. E 'possibile disegnare il contenuto prima mano, ma non ho idea di come larga dovrei fare la vista, in primo luogo, e cosa succede quando l'utente scorre fino alla fine della vista? Credo che ho bisogno di estendere la vista verso quella direzione.

Devo andare verso programatically aggiungendo (e rimozione) pezzi di vista a un layout lineare? Sarebbe bello sentire quello che le esperienze sono là fuori per quanto riguarda il disegno di questo tipo di tempo a scorrimento controllo personalizzato.

Grazie / Erik

È stato utile?

Soluzione

se si sta lavorando con la lista / griglia o qualsiasi cosa che utilizza l'adattatore per i dati, è possibile utilizzare una più eccellente di classe scritto da CommonsWare e disponibile qui:

http://github.com/commonsguy/cwac-endless

è stato è stato appositamente per questo scopo

Altri suggerimenti

utilizzare un fuori campo del buffer delle dimensioni del vostro controllo.

in un primo momento farlo nel modo semplice. Disegnare l'intera offscreenbuffer scorrere nella posizione corretta. Quando si è pronti blit allo schermo vero e proprio.

Se questo è troppo lento, cercare di ottimizzarlo, non ridisegnare l'intero offscreenbuffer, ma facendo una spaccatura verticale: (sto solo parlando di un movimento di scorrimento orizzontale qui per ora per rendere il concetto più facile da afferrare Ma questo. metodo si applica a 8 vie di scorrimento nonché)

questo è un po 'complicato da implementare (è per questo che ho suggerito l'approccio semplice in primo luogo), ma provate a immaginare una carta con l'immagine su di esso, e il lato sinistro si avvolgono e la colla sul lato destro (in modo da ottenere un tubo). In questo modo è possibile scorrere la carta a tempo indeterminato (facendo ruotare il tubo attorno suo asse y).

Allo stesso modo si può fare lo stesso con il fuori campo buffer.Prepare buffer fuori schermo disegnando il contenuto completo su di esso.

ora per scorrere a destra che, fondamentalmente, dividere il buffer fuori campo a 2 (a titolo di questa divisione verticale (proprio come la carta nel esempio in cui la colla era)). supponiamo di scorrere 10 pixel a destra, ciò che si fa è:

  • copiare il lato destro della scissione (che si trova a 10 pixel) per pixel 0 del vostro controllo. (Così l'intera regione da (10, 0) - (larghezza - altezza) a: (0,0)
  • copia lato sinistro dello split: pixel da 0 a 10. a larghezza 10 pixel. quindi: (0,0) - (10, altezza) a (larghezza-10, 0)

prima di farlo solo ridisegnare i pixel che sono stati da modificare (in questo caso 10 pixel da quando abbiamo fatto scorrere 10 pixel). Tutti gli altri pixel sono ancora identici e non hanno bisogno di ridisegnare.

Dovrai disegnare questo fuori su una carta da soli per capire davvero. Si tratta di una tecnica abbastanza comune con lo sviluppo di giochi su piattaforme in cui le risorse sono limitate (telefoni cellulari, ecc).

P.S. lo scorrimento in tutte le direzioni può essere raggiunto in modo identico (anche se è ancora più difficile da ottenere di destra); ^)

un po 'in ritardo alla festa, ma ho pensato di mostrarvi un modo molto più semplice per andare: basta lo Screensize o la dimensione della vista lo sfondo è in, e quindi chiamare il seguente codice (supponendo che si sta estendendo una vista e sovrascrivendo OnDraw):

 private void drawEndlessBackground(Canvas canvas, float left, float top) {

    float modLeft = left % screenWidth;

    canvas.drawBitmap(backgroundImage, modLeft, top, null);

    if (left < 0) {

        canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null);

    } else {

        canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null);

    }



}

come circa in XML? drawEndlessBackground private void (tela Canvas, galleggiante a sinistra, galleggiare in alto) {

float modLeft = left % screenWidth;

canvas.drawBitmap(backgroundImage, modLeft, top, null);

if (left < 0) {

    canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null);

} else {

    canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null);

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top