Question

Je méditais les alternatives sur la façon de faire défiler une « infinie », comme l'échelle, le contrôle dans Android. L'idée simple est de redessiner toute la vue sur chaque mouvement de défilement, mais en quelque sorte, il ne semble pas la bonne façon. Il est possible de tirer le contenu avant de la main, mais je n'ai pas la moindre idée comment grand je devrais faire le point de vue, en premier lieu, et ce qui se passe lorsque l'utilisateur fait défiler jusqu'à la fin de la vue? Je suppose que je dois élargir la vue vers cette direction.

Dois-je aller à ajouter programatically (et la suppression) des morceaux de vue d'une disposition linéaire? Ce serait formidable d'entendre ce que les expériences sont là-bas en ce qui concerne le dessin ce genre de contrôle personnalisé à long défilement.

Merci / Erik

Était-ce utile?

La solution

si vous travaillez avec la liste / grille ou quoi que ce soit qui utilise l'adaptateur pour les données, vous pouvez utiliser une classe excellent écrit par CommonsWare et disponible ici:

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

il a été était spécifiquement à cette fin

Autres conseils

utiliser un tampon hors-écran la taille de votre commande.

d'abord faire la manière simple. Dessiner l'ensemble offscreenbuffer à la position défiler correcte. Lorsque vous êtes prêt blit à l'écran réel.

Si cela est trop lent, essayez d'optimiser en ne redessinant l'ensemble offscreenbuffer mais en faisant une division verticale: (je ne parle que d'un mouvement de défilement horizontal ici pour l'instant pour rendre le concept plus facile à saisir, mais cela. procédé applique à 8 directions de défilement aussi bien)

est un peu difficile à mettre en œuvre (c'est pourquoi je suggère l'approche simple en premier), mais essayez d'imaginer un papier photo dessus, et le côté gauche vous enrouler autour et coller sur le côté droit (si vous obtenez un tube). De cette façon, vous pouvez faire défiler indéfiniment le papier (en faisant tourner le tube autour de son axe y).

vous pouvez faire la même chose de la même avec le hors-champ buffer.Prepare le tampon offscreen en tirant le contenu complet sur elle.

pour faire défiler à droite, vous essentiellement diviser le tampon offscreen en 2 (par l'intermédiaire de cette division verticale (comme le papier dans l'exemple où la colle a)). 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é à 10 pixels) à 0 pixel de votre commande. (De sorte que la région entière de (10, 0) - (largeur - hauteur) à: (0,0)
  • puis copier le côté gauche de la fente: 0 à 10 pixels à 10 pixels en largeur. si: (0,0) - (10, hauteur) à (largeur 10, 0)

avant de faire ce redessiner seulement les pixels qui ont été être modifiées (dans ce cas 10 pixels depuis que nous avons 10 Scrolled pixels). Tous les autres pixels sont toujours identiques et ne nécessitent pas de redessiner.

Vous devez dessiner cela sur vous-même du papier pour comprendre vraiment. Il est une technique tout à fait commune avec le développement de jeux sur les plateformes où les ressources sont limitées (téléphones mobiles, etc.).

p.s. défilement dans toutes les directions peut être réalisé de la même manière exacte (bien qu'il soit encore plus difficile à obtenir à droite); ^)

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 screensize ou la taille de la vue de votre arrière-plan est, puis appelez le code suivant (en supposant que vous prolongeons une vue et primordial 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);

    }



}

Que diriez-vous en XML? drawEndlessBackground private void (toile de toile, flotteur gauche, flotter en 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);

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top