2013-06-11 7 views
0

Я новичок в программировании на Android и столкнулся с небольшой проблемой. Если бы вы могли помочь, это было бы очень полезно.draw rectangle canvas android

Я делаю прямоугольники для живых обоев Я делаю с помощью:

void drawFrame() { 
     final SurfaceHolder holder = getSurfaceHolder(); 

     Canvas c = null; 
     try { 
      c = holder.lockCanvas(); 
      if (c != null) { 
       Paint paint = new Paint(); 
       paint.setColor(Color.CYAN); 
       Paint ypaint = new Paint(); 
       ypaint.setColor(Color.RED); 
       Paint ppaint = new Paint(); 
       ppaint.setColor(Color.GREEN); 

       drawVerStripes(c, ppaint, 0,20); 
       drawVerStripes(c, paint, 50,20); 
       drawVerStripes(c, ypaint,0,10); 
      } 

     } finally { 
      if (c != null) 
       holder.unlockCanvasAndPost(c); 
     } 

Функции:

Params:
ширина: ширина прямоугольника
пространства: разница между последний прямой и этот прямой

int y=0; 
    int oldY=0; 
    private void drawVerStripes(Canvas c, Paint paint, int space, int width) { 


     y=oldY+space; 

     c.drawRect(y, 0, y+width,c.getHeight(), paint); 

     oldY=y; 
    } 

В результате прямоугольники перемещаются в одну сторону экрана очень быстро. Я хочу, чтобы они оставались на экране и не двигались.
Другими словами, существует ли способ, который drawVerStripes выполняется только один раз, а не каждый кадр.

+0

Что вы хотите сказать? – Raghunandan

ответ

0

Метод drawFrame вызывается с каждым фреймом. Если скорость обновления ваших устройств составляет 70, то ваш метод вызывается 70 раз в секунду. Если вы увеличиваете координату x или y на 1, вы перемещаете 70 пикселей в координатах x или y. Вы должны сделать обновление независимо от скорости движения.

1) Рассчитайте время дельты, которое прошло со времени последнего обновления экрана. 2) Определите, сколько пикселей вы хотите, чтобы ваш прямоугольник перемещался каждую секунду.

Предположим, вы хотите, чтобы прямоугольник перемещался на 50 пикселей по x.

Затем выполните следующие действия. х + = DeltaTime * 50.

long startTime = System.nanoTime(); // Execute before the first time your drawFrame executes 
float deltaTime = (System.nanoTime()-startTime)/1000000000.0f; // In drawFrame method calculate 
long startTime = System.nanoTime(); // Execute after calculating delta time. 
+0

На самом деле, я не хочу, чтобы он перемещался ... –

+0

Тогда просто булевая переменная называется ranOnce. Затем установите значение false. И заверните свои вызовы drawVerStripes в if (! RanOnce). Также после звонков на drawVerStripes set ranOnce = true – neo

+0

не знаю почему, но после этого исправления не отображаются ... 'boolean ranOnce = false; \t if (! RanOnce) { \t \t \t \t \t drawVerStripes (c, ppaint, 0,20); \t \t \t \t \t drawVerStripes (c, paint, 50,20); \t \t \t \t \t drawVerStripes (c, ypaint, 0,10); \t \t \t \t \t ranOnce = true; \t \t \t \t \t} ' –

0

Я считаю, что вы должны установить у и Oldy до 0 раз в начале drawFrame.