9
votes

Comment avoir une animation de défilement par programme

J'essaie d'implémenter une animation de défilement pour la galerie de manière programmatique.

Essayé avec SetSelection (int Pos, Boolean Animate) Et ça ne fonctionne pas.

existe-t-il de toute façon pour remplacer SEstSelection () méthode.


0 commentaires

5 Réponses :


6
votes

galerie.Setelection (position int, booléenne animate);

Reportez-vous ci-dessous URL: http://groups.google .Com / Groupe / Android-Developers / Browse_thread / Thread / 9140FD6AF3061CDF / 7F89E53AE53E455B? LNK = GST & Q = SELLATION # 7F89E53AE53E455B

Soln: Si vous cherchez toujours, j'ai deux solutions possibles pour vous, les deux légèrement désagréable:

(1) Vous pouvez rendre la galerie faire une flanture avec une vitesse choisie, donc:

mygallery.elfling (null, null, vélocité, 0);

En modifiant la vitesse, vous pouvez configurer des valeurs pour déplacer la sélection. par un ou deux dans les deux sens. Comme la galerie autoignent, vous faites pas besoin d'obtenir la destination exactement correcte.

(2) Comme la source de la galerie est disponible, vous pouvez le modifier afin de Mettre en œuvre votre propre galerie. Il ne semble pas ajouter d'ajouter beaucoup de code pour pouvoir contrôler une flanture afin de finir à votre choix Sélection.

Je pensais que j'allais devoir faire (2), mais je pouvais m'éloigner avec (1) pour mon problème.


1 commentaires

La méthode (1) fonctionne bien, assurez-vous simplement d'utiliser une vitesse suffisamment grande. Dommage que les documents Android ici sont tellement trompeurs: "Notified d'un événement de fling lorsqu'il se produit" est incorrect IMHO, devrait dire quelque chose comme: "Dites à la galerie d'effectuer une folition" ou la méthode doit être appelée ECREALMLING



2
votes

Je regardais à travers la source de la galerie pour voir si je pouvais obtenir cette fonctionnalité. On dirait que quelque chose est possible avec ce code. Cependant, j'ai abandonné avant que je puisse le faire fonctionner. Il semble que je ne passais pas dans les bonnes coordonnées, donc res toujours retourné false. Retournerait vrai si cela fonctionnait.

Vient de poster ici au cas où quelqu'un d'autre veut donner une tâche à la fixer! (Veuillez poster votre solution si vous le gérez!) P>

Rect rect = new Rect();
gallery.getHitRect(rect);


int x = rect.centerX()+getWindowManager().getDefaultDisplay().getWidth();
int y = rect.centerY();

MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
timesGallery.onDown(event);
boolean res = timesGallery.onSingleTapUp(null);


0 commentaires

2
votes

J'ai fait peu de changement de code donné par "Kurru". Cela fonctionne maintenant

Rect rect = new Rect();
    gallery.getHitRect(rect);

    int width = Math.abs(rect.width());
    if(!isForwardScroll){
        width = width * -1;
    }
    int x = rect.centerX()+width/2;
    int y = rect.centerY();

    MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
    gallery.onDown(event);
    boolean res = gallery.onSingleTapUp(null);


0 commentaires

6
votes

Basé sur l'excellente réflexion de Kurru à simuler un clic sur la vue suivante ou précédente.

//scroll forward or backward
private void scroll(int type){
    View selectedV = mG.getSelectedView();
    int idx = mG.indexOfChild(selectedV);
    switch(type){
        case FORWARD:
    default:
        if(idx<mG.getChildCount()-1)
            idx++;
        break;
    case BACKWARD:
        if(idx>0)
            idx--;          
        break;
    }
    //now scrolled view's child idx in gallery is gotten
    View nextView = mG.getChildAt(idx);
    //(x,y) in scrolled view is gotten
    int x = nextView.getLeft()+nextView.getWidth()/2;
    int y = nextView.getTop()+nextView.getHeight()/2;
    String out = String.format("x=%d, y=%d", x, y);
    Log.i(TAG+".scroll", out);

    //Kurru's simulating clicking view
    MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
    mG.onDown(event); 
    boolean res = mG.onSingleTapUp(null);
    Log.i(TAG+".scroll", "onSingleTapUp return =" + res);       
}


0 commentaires

12
votes

juste maintenant j'ai ce problème. J'étais besoin de déplacer un seul élément de la galerie, de sorte que la meilleure solution pour moi était d'émuler l'événement de la clé xxx

ou xxx


0 commentaires