2015-09-10 1 views
0

Я рисую круги на SurfaceView в своем событии OnTouch. Вот кодПочему рисованные фигуры исчезают, когда на Android SurfaceView нарисованы новые фигуры?

public class DrawableSurface extends SurfaceView { 
    public DrawableSurface(Context context) { 
     super(context); 
     surfaceHolder = getHolder(); 
     paint.setColor(Color.RED); 
     paint.setStyle(Paint.Style.FILL); 

     /*Handler handler = new Handler(); 
     handler.postDelayed(new Bubbles(handler) ,1000);*/ 
    } 

    private final SurfaceHolder surfaceHolder; 
    private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 



    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     if (event.getAction() == MotionEvent.ACTION_MOVE) 
     { 
      Canvas canvas = surfaceHolder.lockCanvas(); 

      canvas.drawCircle(event.getX(), event.getY(), 50, paint); 
      surfaceHolder.unlockCanvasAndPost(canvas); 
     } 
     return true; 
    } 
} 

Всякий раз, когда нарисована новая фигура, некоторые из уже нарисованных фигур исчезают. Не все из них, но некоторые из них исчезают. И иногда они появляются. Я не мог понять. Почему это происходит?

ответ

0

SurfaceView Surface - это двойная или тройная буферизация. Вы видите, что вещи исчезают и появляются снова, когда буферы перевернуты.

Вам необходимо обновить каждый пиксель в области рисования на каждом кадре. Вы можете ограничить количество пикселей, которые вы обновляете, передав Rect на lockCanvas(). См. lockCanvas() documentation для получения дополнительной информации.

+0

Я немного прочитал об этом, но не мог понять, что может быть размером с rect? Должен ли он быть размером с то, что я рисую? – ozgur

+1

Это «грязный» прямоугольник, т. Е. Регион, который вы намереваетесь нарисовать. Он должен быть по крайней мере таким же большим, как то, что вы хотите отобразить на экране. Я бы порекомендовал вам игнорировать это и просто запускать каждый кадр, очищая экран и рисуя все круги. Если у вас много кругов, сделайте весь свой рендеринг на Bitmap (создайте Canvas для него с помощью http://developer.android.com/reference/android/graphics/Canvas.html#Canvas(android.graphics.Bitmap)), а затем просто визуализируйте весь битмап на поверхности каждого кадра. – fadden

+0

Этот последний комментарий действительно полезен. – ozgur