标签:des java color 使用 os 数据 io width
这里说的是在绘图中两者的区别:
1View在绘图中,重写onDraw(Canvas canvas)方法,通过invaldate()和pastInvalidate()两个方法进行重新绘制画布;
invalidate()不能再自己创建的线程中循环调用;
postInvalidate()可以在自己创建的线程中循环调用执行。如果不在当前View 创建线程循环重绘画布的话,这两种重绘画布的函数就没什么区别了,都可以用。
public class MyView extends View {
private float x;
private float y;
public MyView(Context context) {
super(context);
}
//需要绘制图像时调用
@Override
protected void onDraw(Canvas canvas) {
Paint mPaint = new Paint();
mPaint.setColor(Color.BLUE);
canvas.drawLine(0, 0, x, y, mPaint);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
x = event.getX();
y = event.getY();
//重绘画布
invalidate();
// postInvalidate();
return true;
}
}
2,surfaceView继承自view
在使用surfaceView时,你会发现复写父类的onDraw(Canvas canvas)方法并不会执行。原因是在SurfaceView中,我们并不会直接跟他打交道,而是通过SurfaceHolder来控制。使用SurfaceHolder的lockCanvas()函数来获取到SurfaceView的Canvas对象,再通过Canvas上绘制内容来修改SurfaceView中的数据
public class MySurfaceView extends SurfaceView implements Callback, Runnable {
private SurfaceHolder sfh;
private Paint paint;
private Canvas canvas;
private Thread th;
private boolean flag;
private int textX;
private int textY;
public MySurfaceView(Context context) {
super(context);
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setColor(Color.WHITE);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
flag = true;
th = new Thread(this);
th.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
textX = (int) event.getX();
textY = (int) event.getY();
return true;
}
public void myDraw() {
// 获取一个加锁的画布,为了防止surfaceview在绘制过程中被修改,销毁等状况
Paint blackPaint = new Paint();
blackPaint.setColor(Color.BLACK);
try {
canvas = sfh.lockCanvas();
if (canvas != null) {
canvas.drawRect(0, 0, getWidth(), getHeight(), blackPaint);// 刷屏1
// canvas.drawColor(Color.BLACK);//刷屏2
// canvas.drawRGB(0, 0, 0);//刷屏3
canvas.drawText("game", textX, textY, paint);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if (canvas != null) {
// 解锁画布和提交
sfh.unlockCanvasAndPost(canvas);
}
}
}
/**
* 游戏逻辑
*/
private void logic() {
}
@Override
public void run() {
while (flag) {
long start = System.currentTimeMillis();
myDraw();
logic();
long end = System.currentTimeMillis();
try {
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
他们两个更新画布的区别:
在View视图中对于画布的重新绘制,是通过调用View 提供的postInvalidate()与inValidate()这两个函数来执行的,也就是说画布是由系统主UI进行更新。那么当系统主UI线程被绘制函数阻塞,这样一来则会引发无法响应按键,触屏等消息的问题;
SurfaceView视图中对于画布的重绘是由一个新的单独线程去执行处理,所以不会出现因主UI线程阻塞而导致无法响应按键,触屏信息等问题。
surfaceview 有双缓冲机制,而view 没有
View 和 SurfaceView的区别,布布扣,bubuko.com
标签:des java color 使用 os 数据 io width
原文地址:http://my.oschina.net/u/936286/blog/294768