最近两天一直被这个问题困扰,说简单点,比如让一张小球图片初始左边放在(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
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
也许这就是传说中的双缓存...
lockCanvas就会引起缓存的切换如果你画图时连续做两次锁和画的话,那么就能在两个Canvas画上相同的内容, 于是就不闪了
有点笨的方法哈, 不过我还没想出聪明的办法来...
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