Android 的 SurfaceView是一个给人直接处理像素的类!简单关于Callback和SurfaceHolder的东西就不说了,这里主要讲一下SurfaceView的双缓冲下脏区域画图。
因为SurfaceView是双缓冲的,这就说明它其实控制着2个Bitmap,但你对脏区域进行重画时,要对每一个Bitmap都画一次,所以同一个图片要画2次。
public class GameCanvas extends SurfaceView implements Callback, Runnable {
private SurfaceHolder holder;
private Thread thread;
private boolean isFirstEnterGame;
private int i = 0;
private Paint paint;
public GameCanvas(Context context, AttributeSet attrs) {
super(context, attrs);
thread = new Thread(this);
holder = getHolder();
holder.addCallback(this);
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
isFirstEnterGame = true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void run() {
while (true) {
Canvas c = null;
try {
c = holder.lockCanvas();
if (isFirstEnterGame) {
c.drawRect(20, 20, 40, 40, paint);
i+=1;
}
if(i == 2){
isFirstEnterGame = false;
}
} finally {
if (c != null)
holder.unlockCanvasAndPost(c);
}
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
你可以看到c.drawRect(20, 20, 40, 40, paint);将会被调用2次。
而如果你只画一次,那么就会出现闪屏,因为在两张bitmap交换显示过程中,只有一张图画了矩形。
因为SurfaceView是双缓冲的,这就说明它其实控制着2个Bitmap,但你对脏区域进行重画时,要对每一个Bitmap都画一次,所以同一个图片要画2次。
public class GameCanvas extends SurfaceView implements Callback, Runnable {
private SurfaceHolder holder;
private Thread thread;
private boolean isFirstEnterGame;
private int i = 0;
private Paint paint;
public GameCanvas(Context context, AttributeSet attrs) {
super(context, attrs);
thread = new Thread(this);
holder = getHolder();
holder.addCallback(this);
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
isFirstEnterGame = true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void run() {
while (true) {
Canvas c = null;
try {
c = holder.lockCanvas();
if (isFirstEnterGame) {
c.drawRect(20, 20, 40, 40, paint);
i+=1;
}
if(i == 2){
isFirstEnterGame = false;
}
} finally {
if (c != null)
holder.unlockCanvasAndPost(c);
}
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
你可以看到c.drawRect(20, 20, 40, 40, paint);将会被调用2次。
而如果你只画一次,那么就会出现闪屏,因为在两张bitmap交换显示过程中,只有一张图画了矩形。
3万+

被折叠的 条评论
为什么被折叠?



