我在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);
}
}
}
}
每次执行完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);
}
}
}
}
解决方案 »
- 如何取消AsyncTask正在执行的进程
- 求教!android手机是怎么实现即时通话的?
- 如何提高android代码的安全性
- 麻烦大哥们进来看看个问题?
- 怎样打把文件到apk文件中。最后显示在内存卡里
- 怎么判断android的framework是否支持以太网
- 安卓APP的服务器搭建问题
- 如何向Viewpager里动态添加fragment,从网络获取数据实现左右滑动?
- 我给EditText 加了个TextWatcher ,要自已在TextWatcher里写代码判断小数点只允许输入一次,想不出来代码,求高手写下谢谢!!
- Android canvas绘折线图
- android中如何获取草稿箱中收件人的address
- 求助,哪位大哥帮我看下这个下载项目为什么下载不了文件呢?
我在这个canvas上绘制了整个画面
mSurfaceHolder.unlockCanvasAndPost(c) 会把刚绘制完的canvas更新到屏幕
下次再lockCanvas的时候,取到的是一个新canvas,
我在这个canvas上根据需要只重绘了一部分区域
所以unlockCanvasAndPost的时候就只显示被重绘了的部分因为这个处理在不断的循环,一会儿显示整个画面,一会儿显示画面的一部分
闪烁感就来了
http://blog.csdn.net/swingline/article/details/6044223surface为了让画面显示流畅无闪烁,使用了双缓冲机制。一个font buffer 一个back buffer.