2015-04-23 2 views
1

Я хочу отображать 60 разных цветов за 1 секунду в android. Как я могу это сделать, чтобы продолжительность отображения (16 мс) всех цветов была одинаковой в течение 1 секунды?Достижение точного времени в android

+0

Вы имеете в виду разные цвета для каждого кадра? –

+0

Да, Exaccty. Я хочу отображать разные цвета для каждого кадра. –

+1

Добавьте совет! Это не может быть «опасно» для некоторых людей? Потому что эпилептический приступ .. Я не знаю .. но poeple может быть разумным для этой быстрой смены цветов ... (I Thing) – Shudy

ответ

1

Что вам нужно может быть достигнуто в обычае View где вы называете invalidate() на каждый onDraw() вызова:

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 
    } 
} 
+0

@ Sasha.How onDraw() будет вызываться для каждого кадра? –

+0

На каждом кадре андроид пересекает все дерево представлений, начиная с основного фрагмента. Если он видит недействительным представление, он вызывает его onDraw. –

+1

Это цель 'this.invalidate()' на каждом перерисовке. Если вы аннулируете представление в конце 'onDraw()', оно будет перерисовываться на следующем кадре. –

0

Вы можете использовать класс Handler для управления отложенными исполнениями. Here у вас есть пример, как использовать его для генерации таймера каждые 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); 
+0

Это не остановится после прохождения второго. –

+0

Да, это правда, но не обязательно останавливаться, по крайней мере, в вопросе. Если он этого хочет, он так же прост, как и счетчик, и если вы достигнете времени, не звоните в postDelayed – droidpl

+1

Но я отредактирую его для этого – droidpl

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

довольно простого

+0

Это просто, но не будет работать по вашему желанию. Во-первых, находясь в другом потоке, вам нужно установить цвет представления с помощью обработчика потока UI. Во-вторых, синхронизация кадров не совсем точна (пауза может быть 15, 16, 17 мс или даже больше), поэтому некоторые кадры пропускают обновления цвета. –

+0

это петля для петли, поэтому, если это соответствует вашему желанию, вы можете запустить ее в потоке пользовательского интерфейса, или вы можете использовать asyn-задачу и использовать для обновления обновления, чтобы изменить View в вопросе, и сообщение уведомит вас, когда это будет сделано, вы можете попробуйте это и посмотрите, и если пауза действительно длинна, чем вы, вы можете спать на меньшую секунду, так что задержка может соответствовать вашей желаемой длине, но если она не подходит вам, я уверен, что другой ответы будут. @SashaSalauyou _sorry i tot вы были OP_, но спасибо за головы, я просто вызвал метод для OP, я действительно не пробовал. – Elltz

+0

Настоятельно не рекомендуется называть поток Thread.sleep() 'в потоке пользовательского интерфейса. –

Смежные вопросы