最近两天一直被这个问题困扰,说简单点,比如让一张小球图片初始左边放在(200,0)位置上使其延y轴自上而下做循环运动,小球没移动一次都会有上下“抖动”的感觉,实在没搞明白,中午用了一下双缓冲,还是这样的问题!!先把view类贴上来
public class ViewMain extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder surfaceHolder;


private ThreadInitApp threadInitApp;
private boolean isInitOK = false;

private ThreadDrawUI threadDrawUI;
private boolean isDrawUI = true;

private ThreadLogic threadLogic;
private boolean isLogic = true;

private Bitmap bmIcon;
private int y;


public ViewMain(Context context, AttributeSet attrs) {
super(context, attrs); surfaceHolder = this.getHolder();
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
} @Override
public void surfaceCreated(SurfaceHolder holder) {
threadInitApp = new ThreadInitApp();
threadDrawUI = new ThreadDrawUI();
threadLogic = new ThreadLogic();

threadInitApp.start();
threadDrawUI.start();
threadLogic.start();


} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
this.stop();

}

/**
 * 显示
 */
public void display() {
surfaceHolder.addCallback(this);

isInitOK = false;
isDrawUI = true;
isLogic = true;
}

/**
 * 停止 
 */
public void stop() {
isDrawUI = false;
isLogic = false;

threadLogic.stop();
threadDrawUI.stop();
threadLogic = null;
threadDrawUI = null;
}

/**加载资源线程*/
class ThreadInitApp extends Thread {
@Override
public void run() {
while(isInitOK==false) {
bmIcon = BitmapFactory.decodeResource(getResources(), R.drawable.test);


isInitOK = true;
this.stop();
threadInitApp = null;
}
}
}

/**绘图线程*/
class ThreadDrawUI extends Thread {

@Override
public void run() {
Canvas canvas;    
     while(isDrawUI) {
     canvas = null;
     try {
             // 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
             canvas = surfaceHolder.lockCanvas(null);
             synchronized (surfaceHolder) {//同步
             canvas.drawColor(Color.WHITE);
             if(isInitOK) {
             canvas.drawBitmap(bmIcon, 200, y, null);
             }
            
             }
            
            } finally {//使用finally语句保证下面的代码一定会被执行
                if(canvas != null) {
                 //更新屏幕显示内容
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
     }
}
}
/**逻辑线程*/
class ThreadLogic extends Thread {
@Override
public void run() {
while(isLogic) {

y += 5;

if(y>800) {
y=0;
} System.out.println("y-->" + y); try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }

} }
问题是现在逻辑线程中的
public void run() {
while(isLogic) {

y += 5;

if(y>800) {
y=0;
} System.out.println("y-->" + y); try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
我就是想让小球快速从屏幕上下落,可小球闪烁、抖动的问题就是无法解决!!搞得自己头都大了!还请高人点拨一下,3Q!!!
正在调试的程序:项目文件Test.rar

解决方案 »

  1.   

    不指知道楼主在这几还是模拟器上测试的,我在真机上测试的效果还行吧!楼主为何不用Animation动画做呢?这样的话流畅性也比较好一点。
      

  2.   

    我就是用真机的(nexus one)测试的,完全没有平滑滑动的效果,一抖一抖的
      

  3.   

    surfaceHolder.lockCanvas() 参数试试用需要更新的RECT, 效果会好点.
      

  4.   

    这是因为SurfaceView使用了两个Canvas
    也许这就是传说中的双缓存... 
    lockCanvas就会引起缓存的切换如果你画图时连续做两次锁和画的话,那么就能在两个Canvas画上相同的内容, 于是就不闪了
    有点笨的方法哈, 不过我还没想出聪明的办法来...
      

  5.   

    /**逻辑线程*/
    class ThreadLogic extends Thread {
    @Override
    public void run() {
    while(isLogic) {

    y += 1;

    if(y >= 480) {
    y = 5;
    } System.out.println("y-->" + y); try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    } }


    抖是因为y+ 值和Traad.sleep(time)里面的time值在作怪,我用y += 1和time= 10这组值在真机上和模拟器上试过了效果很不错;如果楼主想要更快的移动速度就用time = 1;其实就是时间越短短,y值增加的越少,眼睛看不出来在抖动,我的屏幕高480所以判断没用你的800
      

  6.   

    请问楼主最后怎么解决的,我现在也遇到了,特别是图片比较大的时候,我尝试用了系统默认的translate动画  也是如此,双缓冲  也没解决这个问题!!!