在android中实现精确计时
我想在android中在1秒内显示60种不同的颜色。如何做到所有颜色的显示持续时间(16ms)在1秒内相同?您可以使用在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;
处理程序
类来管理延迟执行。您有一个关于如何使用它每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()
。