Android, как перерисовать точки с той же разницей во времени, что и при рисовании холста?

1

При разработке приложения для рисования в андроиде мне нужно отслеживать все точки и перерисовывать его на другом холсте. Теперь я могу отслеживать все точки, но не знаю, как синхронизировать точечный рисунок в случае рисования и перерисовки, т.е. Пользователь должен перерисовывать точки в то же время, что и в розыгрыше. Как я могу достичь этого?

  • 1
    Не могли бы вы указать проблему еще раз, ясно! Я понял ваше заявление до тех пор, пока «теперь я не могу отследить все пункты», после этого я не смог вас понять.
  • 1
    Вы пытаетесь воспроизвести рисование линий, как в «Draw Something»?
Показать ещё 2 комментария
Теги:
time
android-canvas
redraw

1 ответ

0
Лучший ответ

Не уверен, что это тот ответ, который вы ищете, но я бы записывал события с какой-то временной меткой, на самом деле разница во времени к следующей точке. Что-то вроде:

class Point {
    int x;
    int y;
    long deltaTime;
}

Это зависит от вас, насколько вы точны в выборе времени. Точность с точностью до миллисекунды должна быть достаточно хорошей. Вы можете интерпретировать deltaTime как время, пока эта точка не будет нарисована, или время, пока не будет нарисована следующая точка (я буду использовать последний в моем примере).

Несколько причин использовать deltaTime вместо прямой метки времени - это то, что он позволяет вам проверять действительно длинные паузы, и вам придется постоянно вычислять время дельта в процессе воспроизведения. Кроме того, использование его как долго должно дать вам достаточно места для действительно длинных пауз и позволяет использовать класс Handler который принимает длинное целое число в миллисекундах, ожидающее перед выполнением.

 public class Redrawer implements Handler.callback {
     LinkedList<Point> points; //List of point objects describing your drawing
     Handler handler = new Handler(this); //Probably should place this in class initialization code
     static final int MSG_DRAW_NEXT = 0;

     public void begin(){
         //Do any prep work here and then we can cheat and mimic a message call
         //Without a delay specified it will be called ASAP but on another
         //thread
         handler.sendEmptyMessage(MSG_DRAW_NEXT); 
     }

     public boolean handleMessage(Message msg){
         //If you use the handler for other things you will want to
         //branch off depending on msg.what
         Point p = points.remove(); //returns the first element, and removes it from the list
         drawPoint(p);
         if (!points.isEmpty())
             handler.sendEmptyMessageDelayed(MSG_DRAW_NEXT, p.deltaTime);

     public void drawPoint(Point p){
         //Canvas drawing code here
         //something like canvas.drawPixel(p.x, p.y, SOMECOLOR);
         //too lazy to look up the details right now
         //also since this is called on another thread you might want to use
         //view.postInvalidate
     }

Этот код далеко не полный или пуленепробиваемый. А именно, вам нужно будет приостановить или перезапустить перерисовку позднее, потому что пользователь переключил действия или получил телефонный звонок и т.д. Я также не реализовал детали того, где и как вы получаете объект canvas (я полагаю, что у вас есть эта часть к настоящему времени). Также вы, вероятно, захотите отслеживать предыдущую точку, чтобы вы могли сделать прямоугольник для отправки в View.postInvalidate поскольку перерисовка небольшой части экрана выполняется намного быстрее, чем перерисовка всего. Наконец, я не выполнял никакой очистки, при необходимости обработчик и список точек должны быть уничтожены.

Вероятно, есть несколько разных подходов к этому, некоторые, вероятно, лучше этого. Если вы беспокоитесь о длительных паузах между событиями касания, просто добавьте чек для deltaTime если он превышает 10 секунд, затем просто переопределите его на 10 секунд. Ex. handler.sendEmptyMessage(MSG_DRAW_NEXT, Math.min(p.deltaTime, 100000)); Однако я бы предложил использовать константу вместо жесткого кодированного номера.

Надеюсь это поможет

  • 0
    Спасибо за ваш интерес ... Я попробую это наверняка ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню