Android - SurfaceView мерцает и иногда не наносит правильную краску - PullRequest
4 голосов
/ 18 марта 2012

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

Проблема, с которой я сталкиваюсь, заключается в том, что SurfaceView я использую мерцания. Время от времени объекты, которые я рисую, мерцают, и они меняют свой размер или цвет.

Похоже, что иногда приложение пропускает мои вызовы в Paint.setColor () и вызов в Paint.setStrokeWidth ().

Я создал методы, которые изменяют используемую краску, а затем, чтобы попытаться исправить эту проблему, вернули ей значения краски по умолчанию. Тем не менее проблема сохраняется. Я также читал, что проблема может быть связана с двойной буферизацией. Это так? Я использую этот код для DrawingThread:

PS. Вы можете заметить, что я также пытался использовать грязный прямоугольник, чтобы увидеть, можно ли решить проблему, но все же ничего. [Возможно, я не понял, что он на самом деле делает]

class DrawingThread extends Thread {
    private SurfaceHolder _surfaceHolder;
    private CustomView _cv;
    private boolean _run = false;

    public DrawingThread(SurfaceHolder surfaceHolder, CustomView cv) {
        super();
        _surfaceHolder = surfaceHolder;
        _cv = cv;
    }

    public void setRunning(boolean run) {

            _run = run;

    }

    public boolean isRunning() {

        return _run;

}

    public SurfaceHolder getSurfaceHolder() {
        return _surfaceHolder;
    }

    @Override
    public void run() {
        Canvas c;
        while (_run) {
            c = null;
            try {
                //c = _surfaceHolder.lockCanvas(new Rect(lon - range, lon + range, lat - range, lat + range));
                c = _surfaceHolder.lockCanvas();


                synchronized (_surfaceHolder) {

                    _cv.onDraw(c);                  

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