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
…
- Cómo agregar una ruptura de línea en un Android TextView?
- Selección de texto en TextView e invocación de menú flotante en un clic largo
- Desplazamiento horizontal automático en TextView
- Android ¿Cómo enviar texto e imágenes o cualquier objeto con intención?
- Android consigue el ancho del fragmento
y así.
¡Gracias!
- ¿Estableciendo el subíndice y el superíndice para el carácter específico en el TextView?
- Establecer dinámicamente vínculos a texto en strings.xml
- Acceso a TextView desde otra clase
- Android recibe archivos compartidos pero no comparte contenido de texto
- Etiqueta dentro de Polyline Google Maps V3
- Visualización de varias líneas de texto y variables en un AlertDialog mediante setMessage ()
- Cómo crear alineado verticalmente superíndice y subíndice en TextView
- Android establece la gravedad de un TextView mediante programación
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.
- Cómo obtener Adview debajo de Viewpager en CoordinatorLayout
- Convertir flujo de entrada en mapa de bits