OnDraw () не запускается, ничего не отображается в SurfaceView - Android - PullRequest
3 голосов
/ 02 июня 2011

HI!У меня есть SurfaceView внутри горизонтальной прокрутки, которую я хочу заполнить изображениями с помощью вызова onDraw ().Однако ничего не нарисовано.У меня есть класс, в котором рисование сделано из потока CanvasThread.

public class PanelChart extends SurfaceView implements SurfaceHolder.Callback {
private CanvasThread canvasthread ;
public PanelChart(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
getHolder().addCallback(this);
canvasthread = new CanvasThread(getHolder(), this);
setFocusable(true);

Я попытался изменить

`synchronized (_surfaceHolder) {
                      _panel.postInvalidate();
                    }`

на synchronized (_surfaceHolder) { _panel.postInvalidate(); }

Я также попытался добавить вызов setWillNotDraw (false) без удачи:

 @Override
public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    canvasthread.setRunning(true);
    canvasthread.start();
   setWillNotDraw(false);

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

Спасибо!

1 Ответ

3 голосов
/ 03 июня 2011

postInvalidate не будет вызывать onDraw с surfaceView. Вам нужно разблокировать холст, нарисовать вещи, а затем заблокировать холст. Вот пример потока для SurfaceView:

    class CanvasThread extends Thread {
        private SurfaceHolder surfaceHolder;
        private PanelChart panel;
        private boolean run = false;

        public CanvasThread(SurfaceHolder surfaceHolder, PanelChart panel) {
            this.surfaceHolder = surfaceHolder;
            this.panel = panel;
        }

        public void setRunning(boolean run) {
            this.run = run;
        }

        public SurfaceHolder getSurfaceHolder() {
            return surfaceHolder;
        }

        @Override
        public void run() {
            Canvas c;
            while (run) {
                c = null;

                //limit the frame rate to maximum 60 frames per second (16 miliseconds)
                timeNow = System.currentTimeMillis();
                timeDelta = timeNow - timePrevFrame;
                if ( timeDelta < 16){
                    try{
                        Thread.sleep(16 - timeDelta);
                    }catch(InterruptedException e){

                    }
                }
                timePrevFrame = System.currentTimeMillis();

                try {
                    c = surfaceHolder.lockCanvas(null);
                    synchronized (surfaceHolder) {
                        panel.onDraw(c); //draw canvas 
                        computePhysics(); //calculate next frame
                    }
                } finally {
                    if (c != null) {
                        surfaceHolder.unlockCanvasAndPost(c);  //show canvas
                    }
                }//try finally
              } //while
        }//run
    }//thread
...