在android中实现精确计时

在android中实现精确计时,android,Android,我想在android中在1秒内显示60种不同的颜色。如何做到所有颜色的显示持续时间(16ms)在1秒内相同?您可以使用处理程序类来管理延迟执行。您有一个关于如何使用它每n毫秒生成一个计时器的示例 final Handler handler = new Handler(); handler.postDelayed(new Runnable(){ private static final long INTERVAL = 16L; private long time = 0;

我想在android中在1秒内显示60种不同的颜色。如何做到所有颜色的显示持续时间(16ms)在1秒内相同?

您可以使用
处理程序
类来管理延迟执行。您有一个关于如何使用它每n毫秒生成一个计时器的示例

final Handler handler = new Handler();
handler.postDelayed(new Runnable(){
    private static final long INTERVAL = 16L;
    private long time = 0;

    @Override
    public void run(){
        time += INTERVAL;
        if(time <= 1000){
            handler.postDelayed(this, INTERVAL); //Make sure you are calling it after 16 millis
        }
        // Change your color here
        changeColor();
    }
}, INTERVAL);
final Handler=new Handler();
handler.postDelayed(新的Runnable(){
专用静态最终长间隔=16L;
私人长时间=0;
@凌驾
公开募捐{
时间+=间隔;

如果(时间你已经有了数学,那么试试简单的方式

//assume im in a different Thread
for(int i=0; i < 17; i++){
    Thread.sleep(16); // add try catch
Color c = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)); }
//假设im在另一个线程中
对于(int i=0;i<17;i++){
Thread.sleep(16);//添加try-catch
Color c=Color.argb(255,rnd.nextInt(256),rnd.nextInt(256),rnd.nextInt(256));}

非常简单

您需要的内容可以在自定义的
视图中实现
,在该视图中,您可以对每个
onDraw()调用
invalidate()

int framesToRedraw = 0;


public void startAnimation(int frames){
     framesToRedraw = frames;
     this.invalidate();
}


/**
 * onDraw override.
 * If animation is "on", view is invalidated after each redraw
 * to make android redraw it on the next frame
 */
@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if (framesToRedraw > 0) {
         // generate new color randomly
         float[] hsvColor = {0, 1, 1};
         hsvColor[0] = random.nextFloat() * 360f;
         this.setBackgroundColor(Color.HSVToColor(hsvColor));
         framesToRedraw--;
         this.invalidate();  // force the view to be redrawn on each frame
    } 
}

你是说每一帧都有不同的颜色?是的,举个例子。我想为每一帧显示不同的颜色。加上一些建议!这对某些类型的人来说不会是“危险的”?因为癫痫发作..我不知道..但是人们可以感知到颜色的快速变化…(我的事情)@Shudy,,此应用程序不适用于人。有足够快的传感器来检测此频率下的颜色变化。同意@Shudy的说法,这完全是一些人不想看到的事情。这不会在第二个时间过去后停止。是的,这是真的,但至少在这个问题上不需要停止。如果他想这样做的话这很容易,因为有一个柜台,如果你到达的时间,不要打电话postDelayed@Sasha.How将为每个帧调用onDraw()?在每个帧上,android从主片段开始遍历整个视图树。如果看到视图无效,它将调用其onDraw。这就是
this.invalidate()的目的
每次重画。如果在
onDraw()末尾使视图无效
,它将在下一帧重新绘制。@muhammadkiyani在更新的回答中,我添加了检查帧限制。-@Sasha,对我来说,完成60次的过程需要1.6秒。你有什么建议,如何将这一时间减少到1秒?我正在通过系统测量时间。nanoTime()。这很简单,但无法按预期工作。首先,在另一个线程中,需要通过UI线程处理程序设置视图颜色。其次,帧计时不准确(暂停时间可能为15、16、17毫秒,甚至更长)因此,一些帧将跳过颜色更新。这是一个for循环,先生,因此如果它符合您的要求,您可以在UI线程上运行它,或者您可以使用asyn任务和on progress update来更改有问题的视图,post将在完成时通知您,您可以尝试并查看,如果暂停时间确实比您设计的时间长,您可以睡一会儿第二,这样延迟可以匹配到您想要的长度,但如果它不适合您的需要,我相信其他答案会的。@Sashasalauu您很抱歉我知道您是OP,但感谢提醒,我只是为OP想出了一个方法,我并没有真正尝试过。非常不鼓励在UI线程上调用
Thread.sleep()