第六天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);
        }

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

 

第九集完。

转载于:https://www.cnblogs.com/wanself/archive/2012/07/11/2585356.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值