在TextView -Android中逐字母显示字符串

时间:2016-01-02 19:12:40

标签: java android string for-loop android-animation

我有这段代码:

public void setText(String s){
    TextView tv= (TextView)HomeActivity.tf.getView().findViewById(R.id.textViewFragment);


    char c;
    for(int i=0; i< s.length(); i++){
        c= s.charAt(i);

        tv.append(String.valueOf(c));

        try{
            Thread.sleep(100);
        }catch(Exception e){}
    }
}

问题是我无法让TextView逐个显示字母。完成循环并执行所有操作后,即文本显示时。

我希望让它逐个字母显示,以便为TextView提供动画效果。

3 个答案:

答案 0 :(得分:5)

此代码有效,

    public void setText(final String s)
    {
    TextView tv= (TextView)HomeActivity.tf.getView().findViewById(R.id.textViewFragment);
    final int[] i = new int[1];
    i[0] = 0;
    final int length = s.length();
    final Handler handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            char c= s.charAt(i[0]);
            Log.d("Strange",""+c);
            tv.append(String.valueOf(c));
            i[0]++;
        }
    };

    final Timer timer = new Timer();
    TimerTask taskEverySplitSecond = new TimerTask() {
        @Override
        public void run() {
            handler.sendEmptyMessage(0);
            if (i[0] == length - 1) {
                timer.cancel();
            }
        }
    };
    timer.schedule(taskEverySplitSecond, 1, 500);
}

答案 1 :(得分:0)

如果某人仍在寻找更好的解决方案(使用动画字母),请试用Fade-In TextView

此TextView库直接从本机TextView类继承其属性,这意味着支持所有本机TextView方法。实际上没有任何限制,包括多线支持。它还有一些自己的方法和属性,可以完全控制View。

答案 2 :(得分:0)

更简单

Thread thread = new Thread() {
    int i;

    @Override
    public void run() {
        try {
            for (i = 0; i < text.length(); i++) { // use your variable text.leght()
                Thread.sleep(1000);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(text.substring(0, i));
                    }
                });
            }
        } catch (InterruptedException e) {
        }
    }
};

thread.start();