Android + Cómo agregar la función "Auto-Scroll" vertical a ScrollView o TextView

Estoy haciendo una aplicación de lectura de documentos y quiero que un usuario pueda solicitar a la aplicación el desplazamiento automático de un documento en lugar del desplazamiento manual. Por favor, ¿podría alguien darme ideas sobre cómo hacer un ScrollView "Auto-Scroll" vertical? Algo como de los créditos al final de una película. Establecer un TimerTask a esto a continuación, pero mis problemas son:

  1. ¿Cómo obtengo el valor de incremento para alimentar el TimerTask, es decir, la nueva posición a la que debe ir la barra de desplazamiento cada vez que se ejecuta el TimerTask.

  2. ¿Hay mejores maneras de lograr esta función de desplazamiento automático?

Mi código está por debajo, he logrado el auto-scroll pero el desplazamiento no era ni siquiera … (totalmente nuevo para Java y Android … símile) … gracias !!!

Timer scrollTimer = new Timer(); Handler handler = new Handler(); ScrollView scrollView = (ScrollView) findViewById(R.id.hse); int scrollSpeed = 5; // this is set by the user in preferences TimerTask scrollerSchedule = new TimerTask() { @Override public void run() { handler.post(new Runnable() { @Override public void run() { //Here I want to increment the scrollbar's vertical position by 10 //scrollView.smoothScrollBy(0, scrollView.getScrollY() + 10); new moveScrollView().execute(); } }); } }; scrollTimer.schedule(scrollerSchedule, 0, scrollSpeed * 100); } private class moveScrollView extends AsyncTask<Void, Void, Void> { protected void onProgressUpdate(Void... progress) { // show the user some sort of progress indicator // like how many minutes before scroll is completed } protected Void doInBackground(Void... params) { // TODO int scrollPos = (int) (scrollView.getScrollY() + 10.0); scrollView.smoothScrollTo(0, scrollPos); return null; } } 

Cambios: Como @Kurtis sugirió, agregé el AsyncTask para llevar a cabo el desplazamiento, y luego utilizó el TimerTask + Handler para hacer la repetición. Ahora, cuando ejecute el código de desplazamiento

 int scrollPos = (int) (scrollView.getScrollY() + 10.0); scrollView.smoothScrollTo(0, scrollPos); 

en el AsynTask, recibo un error, pero cuando ejecuto el código directamente en mi Runnable funciona como se espera. Todavía estoy preocupado por la eficiencia y realmente querría usar el AsynTask. ¿Algún consejo para arreglar mi código AsyncTask?


BTW: Esta fue mi observación (para los novatos como yo). Anteriormente usé

 scrollView.smoothScrollBy(0, scrollView.getScrollY() + 10); 

y el desplazamiento comienza saltando desigualmente, tipo de incrementar el valor de desplazamiento como +5, +10 +15 + …. en lugar de una repetición parecida como +5, +5, +5 …. Lo que descubrí fue que si quería calcular el valor incremental como scrollView.getScrollY () + 10, entonces debería haber utilizado smoothScrollTo () en lugar de smoothScrollBy ().

 scrollView.smoothScrollTo(0, scrollView.getScrollY() + 10); 

Esta es una demostración de diapositivas que he creado para mostrar los créditos de una de mis aplicaciones. Su fuente le dará una idea de cómo proceder.

Puede descargar el origen e importar el proyecto a eclipse para probarlo.

Debe utilizar una combinación de AsyncTask para hacer el desplazamiento para usted y el AlarmManager para hacer la repetición para usted. En un nivel alto, lo que debe hacer es crear un PendingIntent que es una emisión. En su actividad, cree un receptor de difusión que reciba el tipo de emisiones que tendrá PendingIntent. Cada vez que reciever reciba la emisión debe lanzar un AsynTask cuyo método doInBackground es justo:

 scrollView.smoothScrollBy(0, scrollView.getScrollY() + 10); 

Tenga cuidado sin embargo. Asegúrese de apagar la alarma que crea con el administrador de alarmas cuando su actividad se detiene (es decir, en el método onPause). Si no lo hace, se disparará un montón de emisiones que nunca se utilizan. Esto agotará la batería del usuario. A continuación, también debe volver a activar las alarmas en el método onResume.

Algunas otras notas, asegúrese de usar ELAPSED_REAL_TIME al configurar su alarma en el administrador de alarmas. De lo contrario, la velocidad de desplazamiento variará con la velocidad del procesador en el dispositivo. Puede ajustar el intervalo de tiempo en el que se envían las emisiones para que la vista se desplace más rápido o más lentamente.

PD

Para obtener más consejos sobre el proceso de roscado, consulte el artículo de Indicación sin dolor .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.