web-dev-qa-db-fra.com

Android: HorizontalScrollView smoothScroll animation time

J'ai une situation dans laquelle j'utilise une vue de défilement horizontal avec des images et j'utilise des boutons pour faire défiler en douceur vers les différents emplacements d'image. Maintenant, cela fonctionne bien, je me demandais simplement si quelqu'un savait de toute façon ralentir la méthode de défilement lisse, c'est-à-dire avoir un temps d'annimation plus long? Comme actuellement, le claquement se produit assez rapidement.

Peut-être grâce à une dérogation au smoothscroll, j'ai essayé de rechercher ce/exemples mais sans succès.

Alors des idées?

Merci,

Si

27
somin

Que diriez-vous:

ObjectAnimator animator=ObjectAnimator.ofInt(yourHorizontalScrollView, "scrollX",targetXScroll );
animator.setDuration(800);
animator.start();
55
Saikat

C'est une façon, qui fonctionne bien pour moi:

    new CountDownTimer(2000, 20) { 

        public void onTick(long millisUntilFinished) { 
            hv.scrollTo((int) (2000 - millisUntilFinished), 0); 
        } 

        public void onFinish() { 

        } 
     }.start();

Ici, la vue de défilement horizontal (hv) se déplace en deux secondes de la position 0 à 2000 ou à la fin de la vue si elle est inférieure à 2000 pixels. Facile à régler ...

14
Lumis

Sous-classe HorizontalScrollView, utilisez la réflexion pour accéder au champ privé mScroller dans HorizontalScrollView. Bien sûr, cela se cassera si la classe sous-jacente change le nom du champ, il revient par défaut à l'implémentation de défilement d'origine.

L'appel myScroller.startScroll(scrollX, getScrollY(), dx, 0, 500); modifie la vitesse de défilement.

private OverScroller myScroller;     

private void init()
{
    try
    {
        Class parent = this.getClass();
        do
        {
            parent = parent.getSuperclass();
        } while (!parent.getName().equals("Android.widget.HorizontalScrollView"));

        Log.i("Scroller", "class: " + parent.getName());
        Field field = parent.getDeclaredField("mScroller");
        field.setAccessible(true);
        myScroller = (OverScroller) field.get(this);

    } catch (NoSuchFieldException e)
    {
        e.printStackTrace();
    } catch (IllegalArgumentException e)
    {
        e.printStackTrace();
    } catch (IllegalAccessException e)
    {
        e.printStackTrace();
    }
}

public void customSmoothScrollBy(int dx, int dy)
{
    if (myScroller == null)
    {
        smoothScrollBy(dx, dy);
        return;
    }

    if (getChildCount() == 0)
        return;

    final int width = getWidth() - getPaddingRight() - getPaddingLeft();
    final int right = getChildAt(0).getWidth();
    final int maxX = Math.max(0, right - width);
    final int scrollX = getScrollX();
    dx = Math.max(0, Math.min(scrollX + dx, maxX)) - scrollX;

    myScroller.startScroll(scrollX, getScrollY(), dx, 0, 500);
    invalidate();
}

public void customSmoothScrollTo(int x, int y)
{
    customSmoothScrollBy(x - getScrollX(), y - getScrollY());
}
13
Wei

C'est un scroller le scroll automatiquement et en continu. Il a été fait pour afficher un écran de crédits en faisant défiler continuellement une liste d'images. Cela pourrait vous aider ou vous donner une idée.

https://github.com/blessenm/SlideshowDemo

1
Parag Chauhan

Utilisez plutôt .smoothScrollToPositionFromTop. Exemple

listView.smoothScrollToPositionFromTop(scroll.pos(),0,scroll.delay());

scroll est une simple variable d'une classe qui prend la position actuelle de l'écran .get() renvoie la nouvelle position .pos() et l'heure du défilement régulier .delay ... etc

0
Blessing Charumbira