本帖最后由 yiyaaixuexi 于 2011-08-01 00:31:10 编辑

解决方案 »

  1.   

    我知道答案 具体你要看看这个帖子
    http://topic.csdn.net/u/20110718/15/ee90be7b-7be2-424f-a6ac-53225a274abe.html?18577
      

  2.   

    主要是SurfaceView的frontbuffer和backbuffer没处理好
      

  3.   


    明白了是什么问题。
    怎么解决呢?那个贴上的没看懂。     //加缓冲
          private Paint[] paints=new Paint[2];
              private Path[]  paths=new Path[2];
              
              //这样更新canvas
              paints[0]=paints[1];
              paints[1]=mPaint;   
              paths[0]=paths[1];
              paths[1]=mPath;       
              if(paints[0]!=null) //画的时候还有画一次的
                canvas.drawPath(paths[0], paints[0]);
              canvas.drawPath(mPath, mPaint);  
      

  4.   


    这个是那个例子的解决方法,保证更新一个buffer时另外一个Buffer也要更新。
    你这里lockCanvas然后unlockCanvasAndPost相当于两个buffer交替了一次,同时两个buffer的内容不一样就造成闪屏了,既然不用刷屏了怎么不把if提上来,或在条件最后试两个buffer相同。
    synchronized (mSurfaceHolder) {
     if(xx)
     {
       mCanvas=mSurfaceHolder.lockCanvas();
       drawPend(mCanvas);
       mSurfaceHolder.unlockCanvasAndPost(mCanvas);
     }

      

  5.   


    不用获取buffer的,所以那个帖子 应用里定义了两个记录来描述,SurfaceView的两个buffer的内容,用这两个记录可以还原两个buffer。
      

  6.   


    //加缓冲
      private Paint[] paints=new Paint[2];
      private Path[] paths=new Path[2];
        
      //这样更新canvas
      paints[0]=paints[1];
      paints[1]=mPaint;   
      paths[0]=paths[1];
      paths[1]=mPath;   
      if(paints[0]!=null) //画的时候还有画一次的
      canvas.drawPath(paths[0], paints[0]);
      canvas.drawPath(mPath, mPaint);   代码中paint是画笔,path是什么,不知道。看代码,path应该是画条线。path数组中记录原buffer信息吗?我的函数里没有path,用canvas数组来记录信息吗?
      

  7.   


    引用 7 楼 fontlose 的回复:不用获取buffer的,所以那个帖子 应用里定义了两个记录来描述,SurfaceView的两个buffer的内容,用这两个记录可以还原两个buffer。
    我这样写,不对啊!                 Canvas[] canvas=new Canvas[2];
              while(mIsRunning){
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    synchronized (mSurfaceHolder) {
    mCanvas=mSurfaceHolder.lockCanvas();
    canvas[0]=canvas[1];
    canvas[1]=mCanvas;
    if(tx<200)
    mDraw(mCanvas);
    else
    mCanvas=canvas[0];
    mSurfaceHolder.unlockCanvasAndPost(mCanvas);
    }
      

  8.   

    不是的,那个例子是没清屏的, 看你上个帖子的mDrawpublic void mDraw(Canvas canvas) {
    mPaint=new Paint();
    mPaint.setColor(Color.WHITE);
    canvas.drawRect(0, 0, 480, 320, mPaint);//清屏
    Bitmap bm0=Bitmap.createBitmap(logo, 0, 50, 256, 100);
    Bitmap bm1=Bitmap.createBitmap(logo, 0, 200, 256, 50);
    canvas.drawBitmap(bm0, mainActivity.screenWidth/2-bm0.getWidth()/2, mainActivity.screenHight/2-bm0.getHeight()/2, mPaint);//一张背景图
    canvas.drawBitmap(bm1, tx, 135, mPaint);//一张移动图,最后就是这张图片来回的动
    }
    你这个只要记录tx,其他bm0,bm1,Paint都不变的吧。记录tx就可以还原出一个Buffer了。
      

  9.   


    明白了,这是记录参数信息,用这个信息来恢复的。但这个是参数少的,如果对象多了,十几个了参数,再这样依靠参数恢复,是不是就很麻烦了。surface,想不到有这样一面。
      

  10.   

    [Quote=引用 10 楼 fontlose 的回复:]不是的,那个例子是没清屏的最后,谢谢你帮我解决这个问题。
      

  11.   

    是的 surfaceview实现了双缓存机制 应用的时候会交替显示
      

  12.   

    楼主,在android的Launcher的源码中关于桌面的切换(就是从一个屏幕切换到另一个屏幕)是否自带双缓冲机制?
      

  13.   

    SurfaceView双缓冲,一个缓冲的内容改变了,另一个就需要同步更新,不然就会出现上面的问题。