视频:善知堂Android http://www.verycd.com/topics/2915940/
第九集:手写笔,水波纹效果。
1.实现画笔功能
主要是在drawView 方法里面, 然后利用线程画图,surfaceView来定时绘制。
class GameView extends SurfaceView implements Callback, Runnable { private Paint paint = null; private Path path = null; // 画自定义图形 private SurfaceHolder sh = null; public GameView(Context context) { super(context); paint = new Paint(); paint.setColor(Color.RED); //设置为画笔 paint.setStyle(Style.STROKE); path = new Path(); sh = this.getHolder(); // 注册一个监听,就是在View改变的时候执行是调用。 sh.addCallback(this); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 销毁的时候执行内容 } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 按下的瞬间 path.moveTo(event.getX(), event.getY()); break; case MotionEvent.ACTION_MOVE: // 按下的瞬间 path.lineTo(event.getX(), event.getY()); break; default: break; } // 不把事件传递给父窗体 return true; } @Override public void surfaceCreated(SurfaceHolder holder) { // 创建时候执行 new Thread(this).start(); } private void drawView() { Canvas canvas = sh.lockCanvas(); canvas.drawPath(path, paint); sh.unlockCanvasAndPost(canvas); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 修改的时候执行 } @Override protected void onDraw(final Canvas canvas) { super.onDraw(canvas); } @Override public void run() { while (true) { drawView(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }
2.去掉锯齿
加入下面代码
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
就可以为滤画笔和位图去锯齿。
3.让响应快速
在触摸事件中加入
invalidate();
实时重绘。
4.重新设置背景,则程序中的图形就全部擦除了。
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 按下的瞬间 path.moveTo(event.getX(), event.getY()); break; case MotionEvent.ACTION_MOVE: // 移动 path.lineTo(event.getX(), event.getY()); if (list.size() < 20) { list.add(new Circle(event.getX(), event.getY(), 0)); } break; default: break; } invalidate(); // 不把事件传递给父窗体 return true; } @Override public void surfaceCreated(SurfaceHolder holder) { // 创建时候执行 new Thread(this).start(); } class Circle { public Circle(float x, float y, int r) { this.x = x; this.y = y; this.r = r; } float x = 0; float y = 0; int r = 0; } List<Circle> list = new ArrayList<Circle>(); private void drawView() { Canvas canvas = sh.lockCanvas(); //刷背景,原来的图像就擦出了。 //canvas.drawColor(Color.BLACK); canvas.drawPath(path, paint); for (Circle c : list) { c.r += 5; canvas.drawCircle(c.x, c.y, c.r, paint); } sh.unlockCanvasAndPost(canvas); }
下面是效果图,第一张是每次重新设置背景,后面的没有。
第九集完。