Animación de texto de pantalla de personaje de Android por caracteres

¿Alguien sabe algún método eficiente de realizar una animación que lo que tiene que hacer es mostrar un texto, carácter por carácter ?, como:

T
Th
Este
Esta
Esto i
Esto es

y así.

¡Gracias!

Esta puede no ser la solución más elegante, pero la más simple es probablemente una subclase rápida de TextView con un Handler que actualiza el texto de vez en cuando hasta que se muestre la secuencia completa:

 public class Typewriter extends TextView { private CharSequence mText; private int mIndex; private long mDelay = 500; //Default 500ms delay public Typewriter(Context context) { super(context); } public Typewriter(Context context, AttributeSet attrs) { super(context, attrs); } private Handler mHandler = new Handler(); private Runnable characterAdder = new Runnable() { @Override public void run() { setText(mText.subSequence(0, mIndex++)); if(mIndex <= mText.length()) { mHandler.postDelayed(characterAdder, mDelay); } } }; public void animateText(CharSequence text) { mText = text; mIndex = 0; setText(""); mHandler.removeCallbacks(characterAdder); mHandler.postDelayed(characterAdder, mDelay); } public void setCharacterDelay(long millis) { mDelay = millis; } } 

A continuación, puede utilizar esto en una actividad de la siguiente manera:

 public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Typewriter writer = new Typewriter(this); setContentView(writer); //Add a character every 150ms writer.setCharacterDelay(150); writer.animateText("Sample String"); } } 

Si desea algunos efectos de animación con cada letra añadida, tal vez vea TextSwitcher en TextSwitcher lugar.

¡Espero que ayude!

Usar la clase de máquina de escribir de Devunwired

Entonces, en el diseño:

 <com.example.fmm.Typewriter android:id="@+id/typewriter" android:layout_alignParentTop="true" android:layout_width="fill_parent" android:layout_height="wrap_content"/> 

Código en la actividad:

 Typewriter writer = (Typewriter)findViewById(R.id.typewriter); //Add a character every 150ms writer.setCharacterDelay(150); writer.animateText("Sample String"); 

No hay necesidad de establecer una clase extra Use esto, aquí tv es un texto en su diseño sólo llamada

SetCharacterDelay (150);
AnimateText ("Cadena de ejemplo");

 private Handler mHandler = new Handler(); private Runnable characterAdder = new Runnable() { @Override public void run() { tv.setText(mText.subSequence(0, mIndex++)); if(mIndex <= mText.length()) { mHandler.postDelayed(characterAdder, mDelay); } } }; public void animateText(CharSequence text) { mText = text; mIndex = 0; tv.setText(""); mHandler.removeCallbacks(characterAdder); mHandler.postDelayed(characterAdder, mDelay); } public void setCharacterDelay(long millis) { mDelay = millis; } 

Esta nueva copia para Devunwired con diseño xml

  public class Typewriter extends TextView { private CharSequence mText; private int mIndex; private long mDelay = 500; //Default 500ms delay public Typewriter(Context context) { super(context); } public Typewriter(Context context, AttributeSet attrs) { super(context, attrs); } private Handler mHandler = new Handler(); private Runnable characterAdder = new Runnable() { @Override public void run() { setText(mText.subSequence(0, mIndex++)); if(mIndex <= mText.length()) { mHandler.postDelayed(characterAdder, mDelay); } } }; public void animateText(CharSequence text) { mText = text; mIndex = 0; setText(""); mHandler.removeCallbacks(characterAdder); mHandler.postDelayed(characterAdder, mDelay); } public void setCharacterDelay(long millis) { mDelay = millis; } } 

Uso del código

  textView = (Typewriter)findViewById(R.id.textView1); //Add a character every 150ms textView.setCharacterDelay(150); textView.animateText("Sample String"); 

Luego define textView en classStart

La respuesta de Kaj es en su mayoría correcta, pero quería ampliarla un poco. Básicamente, como dijo, usted querrá mantener una copia de la cadena completa, así como una "cadena de visualización" que contiene sólo la parte de la cadena que realmente se dibuja en la pantalla. De vez en cuando, concatenarás un carácter adicional de la cadena completa en la cadena de la pantalla y, a continuación, volverás a dibujar la cadena de la pantalla.

Si estuviera creando un juego utilizando una arquitectura de bucle principal simple, lo haría en alguna subfunción del bucle principal. Usted podría asegurarse de que sólo ocurre de vez en cuando siguiendo el delta del tiempo de la última ocurrencia. Creo que es a lo que Kaj se refiere por "runmethod". Sin embargo, como no mencionaste nada sobre un juego, supongo que eso no es lo que estás haciendo, y las aplicaciones Java centradas en la interfaz de usuario tomarán un enfoque diferente.

Al subclasificar TimerTask y crear un temporizador , puede configurar el método de concatenación y redibujo de cadenas para que lo llame con la frecuencia que desee. Básicamente, reemplazará el método run de TimerTask para actualizar la cadena y volverla a dibujar, como se describió anteriormente.

En teoría, sería


 string text = "hello" string temp = "h" 

 iterate: temp += if (text.length > temp.length) text[temp.length]; wait 

Usted por supuesto hará la iteración en su runmethod.

  • Texto transparente de Android
  • Android: No se puede cambiar el texto aparece en AlertDialog
  • Zoom textview con imagen y texto (contenido html) en android
  • ¿Hay una manera de agregar la sombra interna a un TextView en Android?
  • ¿Cómo doy espacio entre texto en textview?
  • ¿Hay una manera de crear el stackoverfow "Etiquetas" EditText / Campo de entrada en Android?
  • Cómo eliminar el margen superior de TextView?
  • ¿Cómo crear un efecto de marquesina para un texto de menor longitud que no exceda el tamaño de la pantalla en Android?
  • Alineación de 2 columnas en una vista de texto
  • Margen en TextView personalizado
  • TextView en la Galería
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.