我在thread里的doDraw函数里面会根据一定的逻辑在canvas上只重绘需要变更的部分,比如更新一个小图标上去。
每次执行完unlockCanvasAndPost以后都会出现下面的现象:
第一次出现那个小图片,第二次其他以前绘制的部分出现 ,就这么不断循环,看起来有闪烁感。
感觉就像有个什么缓冲一样,一个是以前的画面,一个是刚画的画面,两个轮流显示
为什么呀? while(isRuning){
long now = System.currentTimeMillis();
if(now - mLasttime > refreshSpeed){
mLasttime = now;
Canvas c = null;
try{
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder){
this.doDraw(c);
}
}finally{
if(c != null){
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}

解决方案 »

  1. 找到原因了 应该就是因为缓冲 mSurfaceHolder.lockCanvas(null) 会取得上次没有用到的canvas
    我在这个canvas上绘制了整个画面
    mSurfaceHolder.unlockCanvasAndPost(c) 会把刚绘制完的canvas更新到屏幕
    下次再lockCanvas的时候,取到的是一个新canvas,
    我在这个canvas上根据需要只重绘了一部分区域
    所以unlockCanvasAndPost的时候就只显示被重绘了的部分因为这个处理在不断的循环,一会儿显示整个画面,一会儿显示画面的一部分
    闪烁感就来了
      

  2. 对。。怎么解决呢?它为什么要两个 canvas 这样来回切换呢?
      

  3. 刚也碰到这个问题,这个链接里面又说。
    http://blog.csdn.net/swingline/article/details/6044223surface为了让画面显示流畅无闪烁,使用了双缓冲机制。一个font buffer 一个back buffer.
      

类似问题 »