SurfaceView使用日记(二)--实例:绘画板
来源:互联网 发布:测试耳塞得软件 编辑:程序博客网 时间:2024/05/16 11:08
前言:
在知道了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之间.
绘图效果如下
模拟器上面画的有带你丑请见谅~
0 0
- SurfaceView使用日记(二)--实例:绘画板
- SurfaceView使用日记(一)
- [Android] SurfaceView使用实例
- SurfaceView的使用实例
- [Android] SurfaceView使用实例
- [Android] SurfaceView使用实例
- [Android] SurfaceView使用实例
- SurfaceView使用实例
- SurfaceView使用实例(示波器)
- SurfaceView使用实例(示波器)
- [Android] SurfaceView使用实例(正余弦移动)
- 使用SurfaceView实现异步动画绘图的小实例
- surfaceView的使用实例之虐心小游戏
- Android使用SurfaceView进行涂鸦的开发实例
- SurfaceView使用
- 使用surfaceView
- surfaceview使用
- SurfaceView使用
- DirectX游戏开发之代码的框架简析
- 在头像(图片)右上角加上红色的数字
- 数据结构------基本概念
- Jquery学习总结(4)——高效Web开发的10个jQuery代码片段
- leetcode-java-88. Merge Sorted Array
- SurfaceView使用日记(二)--实例:绘画板
- JavaScript中this关键字详解
- 数据报表类项目
- 【转】expdp / impdp 用法详解
- 微店一面(现场面)
- shell编程快速入门
- c#常用的数据存储分析
- 生产者消费者模式实现
- LightOJ 1265 (概率DP)