1. onDraw()函数SurfaceView本来是系统不调用的,但是mGameSurfaceView.setBackgroundColor(Color.WHITE)后onDraw()就会被调用了?但是这样Canvas canvas= mSurfaceHolder.lockCanvas(null);后画的就不会显示出来了?
   这是什么原因呢?2. 我有两个例子都在线程里通过
第一次画
Canvas canvas= mSurfaceHolder.lockCanvas(null);
//这里画画,位置1
mSurfaceHolder.unlockCanvasAndPost(canvas);第二次画画
Canvas canvas= mSurfaceHolder.lockCanvas(null);
//这里画画,位置2
mSurfaceHolder.unlockCanvasAndPost(canvas);但是奇怪的是一个例子第二次画的会把第一次画的刷掉。第二个线程做同样的事,不同的是一个自己电脑,一个公司电脑
但是两次画的,都会显示出来。到底默认是,那种是正确的呢?哥,都郁闷了。

解决方案 »

  1.   

    package draw.test;import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;public class GameSurfaceView extends SurfaceView
                                implements SurfaceHolder.Callback,Runnable
    {
        //定义SurfaceHolder对象
        SurfaceHolder    mSurfaceHolder    = null;
         int                y                = 50;    public GameSurfaceView(Context context)
        {
            super(context);        // 实例化SurfaceHolder
            mSurfaceHolder = this.getHolder();        // 添加回调
            mSurfaceHolder.addCallback(this);
            this.setFocusable(true);
        }
        // 在surface的大小发生改变时激发
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
        {    }    // 在surface创建时激发
        public void surfaceCreated(SurfaceHolder holder)
        {
            //开启绘图线程
            new Thread(this).start();
        }    // 在surface销毁时激发
        public void surfaceDestroyed(SurfaceHolder holder)
        {
        }    // 绘图循环
        public void run()
        {
            while (true)
            {
                try
                {
                    Thread.sleep(200);
                }
                catch (Exception e)
                {
                   
                }
                
                Draw();
            }
        }    // 绘图方法
        public void Draw()
        {
            //锁定画布,得到canvas
            Canvas canvas= mSurfaceHolder.lockCanvas();   
            // 绘图
            Paint mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setColor(Color.BLUE);
      
            canvas.drawCircle((320 - 25) / 2, y, 50, mPaint);
            y=y+50;
            // 绘制后解锁,绘制后必须解锁才能显示
            mSurfaceHolder.unlockCanvasAndPost(canvas);
        }
    }
      

  2.   

    我测试的结果是连续run的话,只把最后一次画的图提供的画布上,我想你应该也是这样的问题,你希望能把每次unlockCanvasAndPost提供到画布上显示出来,我也有这样的期望,不知道是使用问题还是bug