2009-10-17 8 views
1

Je réfléchis aux alternatives sur la façon de faire défiler un contrôle «infini», comme une échelle, dans Android. L'idée simple est de redessiner la vue entière sur chaque mouvement de défilement, mais d'une manière ou d'une autre, cela ne semble pas être la bonne façon. Il est possible de dessiner le contenu à l'avance, mais je n'ai aucune idée de la largeur de la vue, et que se passe-t-il lorsque l'utilisateur fait défiler jusqu'à la fin de la vue? Je suppose que je dois étendre la vue dans cette direction.Comment faire défiler "infiniment" vue large dans Android?

Dois-je aller vers l'ajout (et le retrait) par programmation de blocs de vue à une disposition linéaire? Ce serait génial d'entendre quelles expériences sont là pour dessiner ce genre de contrôle personnalisé à long défilement.

Merci /Erik

+0

Au cours de ma pensée sur cette autre question connexe a été soulevée. Si vous trouvez la question intéressante, il y a des chances pour que celle-ci soit aussi intéressante :) http://stackoverflow.com/questions/1635699/how-to-synchronize-content-of-one-view-depending-on -scroll-position-en-sibling-sc – SoManyDetails

Répondre

1

si vous travaillez avec liste/grille ou tout ce qui utilise adaptateur pour les données, vous pouvez utiliser un excellent classe écrite par CommonsWare et disponible ici:

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

il a été spécialement à cet effet

+0

Cela semble prometteur, mais je n'ai pas examiné les détails du composant. La démo semble faire une pause et montrer une chose de progrès tout en récupérant des vues supplémentaires. Je voudrais rendre le contrôle plus inintéressant en rendant les vues susceptibles d'être défilées à l'écran un peu avant qu'elles ne soient vraiment nécessaires. Savez-vous si cela est possible avec ce composant. La documentation est un peu brève. – SoManyDetails

1

utilisent un tampon offscreen la taille de votre commande.

d'abord le faire de manière simple. Dessinez l'ensemble du tampon d'écran défilant à la bonne position. Lorsque vous êtes prêt, vous pouvez l'ajouter à l'écran actuel. Si cela est trop lent, essayez de l'optimiser en ne redessinant pas tout le tampon d'écran mais en effectuant une division verticale: (Je ne parle ici que d'un mouvement de défilement horizontal pour rendre le concept plus facile à saisir. cette méthode s'applique également au défilement à 8 directions)

C'est un peu difficile à mettre en œuvre (c'est pourquoi j'ai suggéré l'approche simple en premier), mais essayez d'imaginer un papier avec une image dessus, et le côté gauche que vous enveloppez et Collez-le sur le côté droit (de sorte que vous obtenez un tube). De cette façon, vous pouvez faire défiler le papier indéfiniment (en tournant le tube autour de son axe y).

De même, vous pouvez faire la même chose avec le tampon hors écran. Préparez le tampon hors écran en dessinant le contenu complet sur celui-ci.

Maintenant, pour faire défiler vers la droite, vous divisez essentiellement le tampon hors écran en 2 (par le biais de cette division verticale (tout comme le papier dans l'exemple où la colle était)). supposons que vous faites défiler 10 pixels vers la droite, ce que vous faites est:

  • copier le côté droit de la division (situé au pixel 10) au pixel 0 de votre contrôle. (donc la région entière de (10, 0) - (largeur - hauteur) à: (0,0)
  • puis copiez le côté gauche de la division: pixel 0 à 10 à la largeur de pixel-10. 0,0) - (10, hauteur) à (largeur-10, 0)

avant de faire cela SEULEMENT redessiner les pixels qui ont été modifiés (dans ce cas 10 pixels depuis que nous avons fait défiler 10 pixels) Tous les autres pixels sont identiques et n'ont pas besoin d'être redessinés

Vous devrez le dessiner vous-même sur un papier pour le comprendre.C'est une technique assez courante avec le développement de jeux sur des plateformes où les ressources sont limitées (téléphones mobiles, etc.)

p.s.le défilement dans toutes les directions peut être réalisé de la même manière (même si c'est encore plus difficile à obtenir); ^)

+0

Merci pour ce bel algorithme. Il semble possible de l'adapter pour qu'il se comporte comme je le souhaite, mais il semble également nécessiter un développement plus détaillé que le composant suggéré par Reflog. Je vais donc faire la réponse. – SoManyDetails

1

un peu en retard à la fête, mais je me suis dit que je vous montre une façon beaucoup plus simple d'aller: vous avez juste besoin de la taille d'écran ou de la taille de la vue de votre fond, un d puis appelez le code suivant (en supposant que vous étendez une vue et remplaçant 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); 

    } 



} 
0

qu'en est-il en XML? vide drawEndlessBackground privé (toile en toile, flotteur gauche, flotter haut) {

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); 

} 
Questions connexes