【问题标题】:Display a String letter by letter in a TextView -Android在 TextView -Android 中逐字母显示字符串
【发布时间】:2016-04-06 19:09:10
【问题描述】:

我有这个代码:

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 一个动画效果。

【问题讨论】:

  • 试试tv.setText(String.valueOf(c))
  • 这对我不起作用。我使用 append() 因为我希望前面的字符留在那里。我想在每次追加之间刷新屏幕。
  • 然后获取前面的文本并像tv.setText(tv.getText().toString()+String.valueOf(c))一样追加它
  • 我试过了,没用。
  • 我已经在这里找到了这个问题的答案。 Found solution here

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


【解决方案1】:

此代码有效,

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

【讨论】:

  • 按原样使用此方法。只需通过您的onCreate() 拨打电话即可。
  • 很高兴知道。干杯:)
【解决方案2】:

以防万一有人仍在寻找更好的解决方案(带有动画字母),请尝试Fade-In TextView

这个 TextView 库直接从原生 TextView 类继承其属性,这意味着支持所有原生 TextView 方法。实际上没有限制,包括多行支持。它还有一些自己的方法和属性,可以完全控制视图。

【讨论】:

    【解决方案3】:

    更简单

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 2021-04-20
      相关资源
      最近更新 更多