studio programacion herramientas fundamentos con avanzado aplicaciones android scrollview smooth-scrolling

android - programacion - Reducir la velocidad de desplazamiento suave en la vista de desplazamiento



manual de android en pdf (5)

Aquí hay una solución con un temporizador que usa scrollTo, pero también puede usar scrollBy Android: tiempo de animación HorizontalScrollView smoothScroll

Tengo una vista de desplazamiento. Realicé smooth-scroll.utilizando smoothScrollBy (). Todo funciona bien, pero quiero cambiar la duración del desplazamiento suave. El desplazamiento suave ocurre muy rápido y el usuario no entiende lo que sucedió. ¿Me ayuda a reducir la velocidad del desplazamiento suave?


Así es como logré un desplazamiento vertical suave (como créditos de películas). Esto también permite al usuario mover el desplazamiento hacia arriba y hacia abajo y permitir que continúe desplazándose cuando lo sueltan. En mi XML, encapsulé mi TextView dentro de un ScrollView llamado "scrollView1". ¡Disfrutar!

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


La respuesta simple es simplemente reemplazar.

scrollView.smoothScrollTo(0, scrollTo);

con

ObjectAnimator.ofInt(scrollView, "scrollY", scrollTo).setDuration(duration).start();

donde duration es el tiempo en milisegundos que desea que tome.


Prueba el siguiente código:

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


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