制作闪烁文本的正确方法是什么

时间:2011-09-23 07:52:23

标签: android multithreading algorithm design-patterns handler

我有一个textview,我有很多按钮。其中一个按钮应该能够启动'动画',它不是动画的动画,它只需要使文本变为红色2秒,文本应该变为绿色2秒而不是再次变为红色。 .. - 其中一个按钮应该停止'动画'并将文本设置为白色 -one应该使文本返回1秒,而不是蓝色2秒再次返回黑色......

重点是用户可以随时按下按钮。

我想我应该使用Handler,但我不确定啪啪声,我不知道线程的停止应该是什么样子,我的意思是当我开始线程时,后来我应该告诉他停止...这样做的最佳方式是什么?

我总是用愚蠢的技巧来编写这种思想,我不知道这种模式是什么,这样做的正确方法是什么?

由于

这里有一些我如何做的代码,但我觉得这不是正确的方法

 private boolean flagForStop=true;
    private Handler handler1=new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case 0:
                flagForStop=false;
            case 1:
                flagForStop=true;
              break;
            case 2:
                new Thread(){
                    public void run(){
                        while(true){
                            if(flagForStop)break;
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            //do something
                        }
                    }
                }.start();
                break;
            default:
                break;
            }
        }

    };

并且比听众更喜欢 handler1.sendEmptyMessage(0);

1 个答案:

答案 0 :(得分:0)

以下是我将如何做到的,它并不完美,但它适用于您上面提到的所有类型的动画。

首先创建一个名为 AnimStep 的类,其中包含两个字段:时间颜色。构造函数是AnimStep(int time,String color)

然后创建一个名为 AnimSequence 的类,其中包含AnimStep对象的数组。您将使用this.getStep(index)获得特定步骤。

例如 AnimSequence 为“粉红色2秒然后品红色3秒然后黑色永远”将包含以下AnimSteps数组:{new AnimStep(0,“pink”),new AnimStep(2, “magenta”),新的AnimStep(5,“黑色”)}

然后创建一个名为动画的类,它在一个单独的线程中永久运行并定期唤醒(例如每100毫秒)。这个类有三个字段:

  • 序列:指向AnimSequence对象的指针
  • startTime :时间戳
  • step :一个整数,表示AnimStep数组中元素的索引

单击按钮时,将AnimSequence传递给Animation。这将this.sequence设置为给定的AnimSequence,this.startTime =,this.step = 1.它还将文本的颜色设置为AnimSequence中第一个AnimStep的颜色。

现在每次动画唤醒时,都会执行以下操作:

if (this.step >= this.sequence.size()) return // do nothing
currentStep = this.sequence.getStep(this.step)
elapsedTime = <current time stamp for now> - this.time
if (elapsedTime >= currentStep.time) {
  this.step++
  yourtext.color = currentStep.color
}