Android字符按字符显示文字animation

任何人都知道执行一个animation的有效方法,那就是按字符显示一个文本,如:

Ť


这个
这个我
这是

等等。

谢谢!

这可能不是最优雅的解决scheme,但最简单的可能是TextView一个快速子类, Handler会每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; } } 

然后你可以像这样在一个Activity中使用它:

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

如果你想添加每个字母的animation效果,可以看看子类化TextSwitcher

希望帮助!

使用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"); 

无需设置额外的类使用这个,这里电视是在你的布局调用的文本视图

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

这个新的副本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"); 

然后在classStart中定义textView

Kaj的回答大多是正确的,但我想稍微扩展一下。 基本上,如他所说,你会想要保留一个完整的string的副本,以及一个“显示string”,其中只包含实际在屏幕上绘制的string的一部分。 每隔一段时间,您都会将完整string中的额外字符连接到显示string上,然后重新绘制显示string。

如果您使用简单的主循环体系结构创build游戏,则可以在主循环的某个子function中执行此操作。 您可以通过跟踪最后一次出现的时间增量来确保它每隔一段时间才会出现。 我认为这就是Kaj所说的“runmethod”。 然而,由于你没有提到任何关于游戏的事情,我认为这不是你正在做的事情,以UI为中心的Java应用程序将采取一些不同的方法。

通过inheritanceTimerTask并创build一个Timer ,你可以设置你的string连接和重绘方法。 基本上,您将覆盖TimerTask的run方法来更新您的string并重新绘制它,如前所述。

理论上是这样的


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

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

你当然会在runmethod中做迭代。

上面提供的大多数解决scheme都会引发各种错误 我想解决scheme是老的。 我偶然发现了这个android studio插件,它的function就像魅力一样。

1.安装AutoTypeTextView非常简单。 只需添加build.gradle

编译'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!" />

只要这三个步骤,你就可以走了。 你可以在这里查看文档了解更多细节