Рисунок-приложение с SurfaceView - PullRequest
0 голосов
/ 18 ноября 2011

У меня проблема с простым приложением для рисования на Android.

Вот мой класс, который расширяет SurfaceView:

public class SomeView extends SurfaceView implements SurfaceHolder.Callback {

private static SurfaceHolder surfaceHolder;
static Canvas canvas=null;
static Paint paint=new Paint();
float X,Y,X1,Y1;
static int mode=1;

public static void ClearAll(){
    canvas=surfaceHolder.lockCanvas(null);
    canvas.drawColor(Color.BLACK);
    surfaceHolder.unlockCanvasAndPost(canvas);
}

public SomeView(Context context,AttributeSet attrs) {
    super(context);
    getHolder().addCallback(this);
    paint.setColor(Color.WHITE);
    paint.setStyle(Style.FILL);
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {   
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    this.surfaceHolder=holder;
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}

public boolean onTouchEvent(MotionEvent event)
{
    canvas=surfaceHolder.lockCanvas(null);
    if (mode==1){       
        canvas.drawCircle(event.getX(), event.getY(),10, paint);
    }
    if (mode==2){
        paint.setStrokeWidth(10);
        if (event.getAction()==MotionEvent.ACTION_DOWN){
            X=event.getX();
            Y=event.getY();
        }
        if (event.getAction()==MotionEvent.ACTION_UP){
            X1=event.getX();
            Y1=event.getY();
            canvas.drawLine(X, Y, X1, Y1, paint);
        }
    }
    surfaceHolder.unlockCanvasAndPost(canvas);
    return true;
}

}

mode = 1 - простая трассировка касаний пользователя,

mode = 2 - это рисование прямых

Однако, когда я рисую в mode = 2, картинка становится странной: Некоторые линии исчезают, и после того, как еще несколько линий были нарисованы, появляется снова. Когда я все еще касаюсь экрана, холст мигает и показывает все линии, нарисованные после последнего вызова ClearAll(). Если я перестану касаться, все еще будут видны только несколько строк.

В чем проблема?

1 Ответ

1 голос
/ 24 июля 2012

SurfaceView использовал двойную буферизацию.Обычно - на каждом цикле / действии вы должны нарисовать каждый пиксель, который хотите видеть на холсте.Надеюсь, это поможет.

...