【问题标题】:What is the right way of making of blinking text闪烁文字的正确制作方法是什么
【发布时间】:2011-09-23 07:52:23
【问题描述】:

我有一个文本视图,我有很多按钮。其中一个按钮应该能够很好地启动“动画”,它不是动画中的动画,它只需要使文本变为红色 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);

【问题讨论】:

  • 我以为闪烁文字很久以前就被禁止了!
  • 不是文字会闪烁其他动作的重点,重点是模式,编码的方式......,这是我不明白的部分,我不知道做这种情况的正确方法是什么

标签: android multithreading algorithm design-patterns handler


【解决方案1】:

这是我的做法,它并不完美,但它应该适用于您上面提到的所有类型的动画。

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

然后创建一个名为 AnimSequence 的类,其中包含一组 AnimStep 对象。你可以通过 this.getStep(index) 获得一个特定的步骤。

例如 AnimSequence 表示“粉红色 2 秒然后洋红色 3 秒然后永远黑色”将包含以下 AnimSteps 数组:{new AnimStep(0, "pink"), new AnimStep(2, "洋红色"), new AnimStep(5, "黑色")}

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

  • sequence:指向 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
}

【讨论】:

  • 但问题是我有 2 张图片序列,这两张图片应该在未知时间交换,直到有人按下另一个按钮
  • @Lukap:这个答案解释了停止和启动线程:stackoverflow.com/questions/1921514/…
猜你喜欢
  • 2017-09-09
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多