Jeder kennt eine effiziente Methode, eine Animation auszuführen, die bedeutet, dass ein Text Zeichen für Zeichen angezeigt wird, z.
T
Th
Thi
Diese
Dieses i
Das ist
...
und so weiter.
Vielen Dank!
Dies ist möglicherweise nicht die eleganteste Lösung, aber die einfachste ist wahrscheinlich eine schnelle Unterklasse von TextView
mit einer Handler
, die den Text so oft aktualisiert, bis die vollständige Sequenz angezeigt wird:
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;
}
}
Sie können dies dann in einer Aktivität wie folgt verwenden:
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");
}
}
Wenn Sie Animationseffekte mit jedem hinzugefügten Buchstaben wünschen, sehen Sie sich stattdessen die Unterklasse TextSwitcher
an.
Hoffentlich hilft das!
verwenden Sie die Typewriter-Klasse von Devunwired
dann im Layout:
<com.example.fmm.Typewriter
Android:id="@+id/typewriter"
Android:layout_alignParentTop="true"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"/>
code in der Aktivität:
Typewriter writer = (Typewriter)findViewById(R.id.typewriter);
//Add a character every 150ms
writer.setCharacterDelay(150);
writer.animateText("Sample String");
Sie müssen keine zusätzliche Klasse festlegen. Verwenden Sie diese Option. Hier ist tv eine Textansicht in Ihrem Layout Rufen Sie einfach an
setCharacterDelay (150);
animateText ("Sample String");
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;
}
diese neue Kopie für Devunwired mit XML-Layout
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;
}
}
code verwenden
textView = (Typewriter)findViewById(R.id.textView1);
//Add a character every 150ms
textView.setCharacterDelay(150);
textView.animateText("Sample String");
definieren Sie dann textView in classStart
Ich verwendete eine rekursive Methode, fügte auch eine kurze Verzögerung zwischen den Wörtern hinzu, um ein menschlicheres Gefühl zu haben . Senden Sie die textView als Ansicht zusammen mit dem Text und senden Sie als Startlänge '1'
private fun typingAnimation(view: TextView, text: String, length: Int) {
var delay = 100L
if(Character.isWhitespace(text.elementAt(length-1))){
delay = 600L
}
view.text = text.substring(0,length)
when (length) {
text.length -> return
else -> Handler().postDelayed({
typingAnimation(view, text, length+1 )
}, delay)
}
}
Die meisten der oben genannten Lösungen werfen verschiedene Fehler auf. Ich denke, die Lösungen sind alt. Ich bin über dieses Android Studio Plugin gestolpert und es funktioniert wie ein Zauber.
1. Die Installation von AutoTypeTextView ist sehr einfach. Fügen Sie einfach build.gradle hinzu
kompilieren 'com.krsticdragan: autotypetextview: 1.1'
2.Fügen Sie einen neuen Namespace hinzu, den Sie zum Hinzufügen von AutoTypeTextView und zum Verwenden seiner Tags verwenden werden.
xmlns: attv = "http://schemas.Android.com/apk/res-auto"
Daher sollte Ihr Root-Layout so aussehen
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:attv="http://schemas.Android.com/apk/res-auto"
Fügen Sie dies Ihrer XML-Datei hinzu.
<com.dragankrstic.autotypetextview.AutoTypeTextView
Android:id="@+id/lblTextWithoutMistakes"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
attv:animateTextTypeWithoutMistakes="Hello World!" />
Mit diesen drei Schritten können Sie gut gehen. Sie können die Dokumentation hier für weitere Details auschecken
Nur um bei der Arbeit mit Kotlin-Code die Antwort von @ Devunwired zu ergänzen,
Ich habe geändert (in der Funktion animateText):mHandler.postDelayed(mRunnable,mDelay)
bis mRunnable.run()
So sieht meine letzte Kotlin-Klasse aus:
class TextViewAnimationComponent(context: Context,attributeSet: AttributeSet?) : TextView(context,attributeSet) {
private var mHandler = Handler()
private var mText:CharSequence = ""
private var mIndex:Int = 0
private var mDelay:Long = 500
private val mRunnable = object: Runnable{
override fun run() {
text = mText.subSequence(0,mIndex++)
if(mIndex <= mText.length){
mHandler.postDelayed(this,mDelay)
}
}
}
fun animateText(mText:CharSequence){
this.mText = mText
mIndex = 0
text = ""
mHandler.removeCallbacks(mRunnable)
mRunnable.run()
// mHandler.postDelayed(mRunnable,mDelay)
}
fun setCharacterDelay(millis:Long){
mDelay = millis
}
}
Auch ein schneller und schmutziger Code (immer noch in Kotlin) ohne Unterklassen.
Inside Aktivität:
private fun animateText(mText: CharSequence, delayMillis: Long, postFunction:() -> Unit){
var mIndex = 0
val runnable = object : Runnable {
override fun run() {
// RunRunnable is a boolean flag; used in case you want to interrupt the execution
if(runRunnable) {
if (mIndex <= mText.length) {
// change textViewSwitchStateValue with your own TextView id
textViewSwitchStateValue.text = mText.subSequence(0, mIndex++)
Handler().postDelayed(this, delayMillis)
} else {
// After all the characters finished animating; Clear the TextView's text and then run the postFunction
textViewSwitchStateValue.text = ""
postFunction()
}
}
}
}
runOnUiThread(runnable)
Ein einfaches Beispiel zum Animieren eines Ladepunktes:animateText(". . .", 400){switchStateON()}
Ich weiß, dass es jetzt zu spät ist, aber vielleicht kommt noch jemand von Google hier an .. Eigentlich brauchte ich auch so etwas für meine App, also machte ich selbst . Probiere Fade-In TextView aus lässt jeden Charakter mit einer glatten Alpha-Animation erscheinen. Die Verwendung ist auch recht einfach.
Im XML-Layout
<believe.cht.fadeintextview.TextView
Android:id="@+id/textView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textSize="30sp"
Android:textColor="@Android:color/black"
app:letterDuration="250"/>
In der Aktivität/Fragment
believe.cht.fadeintextview.TextView textView = (believe.cht.fadeintextview.TextView) findViewById(R.id.textView);
textView.setLetterDuration(250); // sets letter duration programmatically
textView.isAnimating(); // returns current animation state (boolean)
textView.setText(); // sets the text with animation
Weitere Informationen
Die Fade-In-TextView-Bibliothek erbt ihre Eigenschaften direkt von der nativen TextView-Klasse. Dies bedeutet, dass alle nativen TextView-Methoden unterstützt werden. Es gibt praktisch keine Einschränkungen einschließlich Multiline-Unterstützung. Die Bibliothek verfügt auch über eigene Methoden und Attribute, die die vollständige Kontrolle über die Ansicht bieten.
Theoretisch wäre es
string text = "hello"
string temp = "h"
iterate: temp += if (text.length > temp.length) text[temp.length]; wait
Sie werden natürlich die Iteration in Ihrer Laufmethode durchführen.