Android закадровое отображение текстовой анимации - PullRequest
37 голосов
/ 15 июля 2011

Кто-нибудь знает любой эффективный метод выполнения анимации, который заключается в том, чтобы отображать текст, символ за символом?
Это я
Это
...

и т. Д.

Спасибо!

Ответы [ 9 ]

98 голосов
/ 15 июля 2011

Возможно, это не самое элегантное решение, но, возможно, самым простым является быстрый подкласс TextView с Handler, который обновляет текст так часто, пока не отобразится полная последовательность:

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;
    }
}

Затем вы можете использовать это в Деятельности следующим образом:

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");
    }
}

Если вы хотите, чтобы с каждой буквой добавлялись некоторые анимационные эффекты, возможно, посмотрите вместо этого на подклассы TextSwitcher.

Надеюсь, что поможет!

15 голосов
/ 29 июня 2014

используйте класс пишущей машинки Devunwired

, затем в макете:

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

код в упражнении:

Typewriter writer = (Typewriter)findViewById(R.id.typewriter);
        //Add a character every 150ms
        writer.setCharacterDelay(150);
        writer.animateText("Sample String");
9 голосов
/ 15 апреля 2013

Нет необходимости устанавливать дополнительный класс. Используйте это, здесь ТВ - это текстовое представление в вашем макете. просто позвоните

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;
}
3 голосов
/ 05 апреля 2013

эта новая копия для Devunwired с макетом 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;
    }
}

код использования

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

затем определите textView в classStart

1 голос
/ 16 октября 2018

Я использовал рекурсивный метод, также добавил немного задержки между словами, чтобы иметь больше человеческого восприятия. Отправьте textView как представление вместе с текстом и отправьте «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)
    }
}
0 голосов
/ 26 апреля 2019

Вы можете использовать эту библиотеку для того же: Библиотека TypeWriterView для Android

Взгляд в библиотеку:

    //Create Object and refer to layout view
    TypeWriterView typeWriterView=(TypeWriterView)findViewById(R.id.typeWriterView);

    //Setting each character animation delay
    typeWriterView.setDelay(int);

    //Setting music effect On/Off
    typeWriterView.setWithMusic(boolean);

    //Animating Text
    typeWriterView.animateText(string);

    //Remove Animation. This is required to be called when you want to minimize the app while animation is going on. Call this in onPause() or onStop()
    typeWriterView.removeAnimation();
0 голосов
/ 19 мая 2018

Я знаю, что уже слишком поздно, но кто-то еще может прийти сюда из Google. На самом деле, мне тоже нужно что-то подобное для моего приложения, так что сделал это сам. Попробуйте Fade-In TextView , он заставляет каждого персонажа появляться с плавной альфа-анимацией. Использование также довольно просто.

В формате XML

    <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"/>

В упражнении / фрагмент

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

Дополнительная информация

Библиотека Fade-In TextView наследует свои свойства непосредственно от собственного класса TextView, что означает, что поддерживаются все собственные методы TextView. Практически нет ограничений, включая многострочную поддержку. Библиотека также имеет некоторые собственные методы и атрибуты, которые обеспечивают полный контроль над View.

0 голосов
/ 28 октября 2017

Большинство решений, представленных выше, выдают различные ошибки. Я думаю, что решения старые. Я наткнулся на этот плагин для Android Studio, и он работает как шарм.

1. Установка AutoTypeTextView очень проста. Просто добавьте в build.gradle

compile 'com.krsticdragan: autotypetextview: 1.1'

2.Добавьте новое пространство имен, которое вы будете использовать для добавления AutoTypeTextView и использования его тегов.

XMLNS: attv = "http://schemas.android.com/apk/res-auto"

Следовательно, ваш корневой макет должен выглядеть следующим образом

<?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. Добавьте это в свой XML-файл.

    <com.dragankrstic.autotypetextview.AutoTypeTextView android:id="@+id/lblTextWithoutMistakes" android:layout_width="wrap_content" android:layout_height="wrap_content" attv:animateTextTypeWithoutMistakes="Hello World!" />

С этими тремя шагами вы можете идти. Вы можете проверить документацию здесь для получения более подробной информации

0 голосов
/ 15 июля 2011

Теоретически это будет


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

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

Вы, конечно, выполните итерацию в вашем методе выполнения.

...