第六天android:手写笔和水波纹

视频:善知堂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);
        }

下面是效果图,第一张是每次重新设置背景,后面的没有。

 

第九集完。

posted on 2012-07-11 08:24  DON&#39;T PANIC  阅读(934)  评论(0编辑  收藏  举报

导航