Ho una vista di scorrimento. Ho eseguito smooth-scroll.using smoothScrollBy(). Funziona tutto bene, ma voglio cambiare la durata dello smooth-scroll. Smooth-scroll avviene molto velocemente e l'utente non capisce cosa è successo. Aiutami a ridurre la velocità di scorrimento scorrevole?Ridurre la velocità di scorrimento continuo nella vista di scorrimento
risposta
Ecco una soluzione con un timer che utilizza scrollTo ma si possono anche usare scrollBy Android: HorizontalScrollView smoothScroll animation time
whichScreen = Math.max(0, Math.min(whichScreen, getBase().getDocumentModel().getPageCount()-1));
mNextScreen = whichScreen;
final int newX = whichScreen * getWidth();
final int delta = newX - getScrollX();
//scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta));
invalidate();
Prova il seguente codice:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
ValueAnimator realSmoothScrollAnimation =
ValueAnimator.ofInt(parentScrollView.getScrollY(), targetScrollY);
realSmoothScrollAnimation.setDuration(500);
realSmoothScrollAnimation.addUpdateListener(new AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
int scrollTo = (Integer) animation.getAnimatedValue();
parentScrollView.scrollTo(0, scrollTo);
}
});
realSmoothScrollAnimation.start();
}
else
{
parentScrollView.smoothScrollTo(0, targetScrollY);
}
Questo è come ho raggiunto uno scorrimento verticale liscia (come i crediti cinematografici). Ciò consente inoltre all'utente di spostare lo scroll verso l'alto e verso il basso e di continuare a scorrere quando lasciano andare. Nel mio XML, ho incapsulato il mio TextView all'interno di una ScrollView chiamata "scrollView1". Godere!
final TextView tv=(TextView)findViewById(R.id.lyrics);
final ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView1);
Button start = (Button) findViewById(R.id.button_start);
Button stop = (Button) findViewById(R.id.button_stop);
final Handler timerHandler = new Handler();
final Runnable timerRunnable = new Runnable() {
@Override
public void run() {
scrollView.smoothScrollBy(0,5); // 5 is how many pixels you want it to scroll vertically by
timerHandler.postDelayed(this, 10); // 10 is how many milliseconds you want this thread to run
}
};
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
timerHandler.postDelayed(timerRunnable, 0);
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
timerHandler.removeCallbacks(timerRunnable);
}
});
Come saprò che lo scroll ha raggiunto il fondo e il runnable deve essere spento? Come gestirlo? – AlexKost
La risposta più semplice è solo per sostituire
scrollView.smoothScrollTo(0, scrollTo);
con
ObjectAnimator.ofInt(scrollView, "scrollY", scrollTo).setDuration(duration).start();
cui durata è il tempo in millisecondi che si desidera di prendere
Questo dovrebbe essere selezionata come risposta alla domanda +1 –
Invece di usare ValueAnimator, perché non utilizzare ObjectAnimator (una sottoclasse di ValueAnimator)? Rende ancora più semplice - una sola riga, infatti: ObjectAnimator.ofInt (scrollView, "scrollY", targetScrollY) .setDuration (500) .start(); –