webentwicklung-frage-antwort-db.com.de

Android-Zeichen für Zeichenanzeigetextanimation

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!

37
zegnus

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!

98
Devunwired

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");
15
K-RAD

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

3
Baha'a Odeh

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

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"

  1. 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

0

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

0
dongkichan

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.

0
cht

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.

0
RobotRock