前言:
在知道了SurfaceView的使用方法,以后实践,只最好的学习方法,所以在基本掌握了SurfaceView的用法后,我们通过一个实例的编写来更加深入的去掌握SurfaceView.由于它具有独立的子线程进行,图形绘制的同时,不会堵塞主线程,所以SurfaceView常用再游戏开发和一些需要经常刷新屏幕或者试进行数据处理的应用当中,接下来我们要编写的一个项目试绘画板,展现了如何使用SurfaceView来实现这一功能.
分析:
绘画板就是,通过记录用户接触屏幕的路径,然后绘制下来,所以可以通过使用Path对象来记录手指滑动的路径,然后进行绘制.
编写:
整个代码是基于上一篇博客的样例代码之上的,所以我就只把关键部分的代码贴出来了,有兴趣的朋友,可以自己回去试试.
在SurfaceView的onTouchEvent()中来记录Path的路径
public boolean onTouchEvent(MotionEvent event){
int x = (int)event.getX();
int y = (int)event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
mPath.moveTo(x,y);
break;
case MotionEvent.ACTION_MOVE:
mPath.lineTo(x,y);
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
再draw()方法中进行绘制,代码如下
private void draw(){
try {
mCanvas = mHolder.lockCanvas();
//draw something
mCanvas.drawColor(Color.WHITE);
mCanvas.drawPath(mPath , mPaint);
}catch (Exception e){
}finally {
if(mCanvas != null){
mHolder.unlockCanvasAndPost(mCanvas);//确保子线程将画布提交
}
}
}
优化:再前面的模版中,我们在子线程中不断的调用draw()方法进行绘制,但有时候绘制也不用那么频繁, 因此我们可以在子线程中,进行sleep操作,尽可能的节省系统资源,代码如下:
public void run(){
long start = System.currentTimeMillis();
while(isDrawing){
draw();
}
long end = System.currentTimeMillis();
//50-100
if(end - start < 100){
try {
Thread.sleep(100 - (end - start));
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
通过判断draw()方法所使用逻辑的时长来确定sleep的时长, 这是一个非常通用的解决方案,代码中的100ms是一个大致的经验值,这个值一般在50ms到100ms之间.
绘图效果如下
模拟器上面画的有带你丑请见谅~