SurfaceView使用日记(二)--实例:绘画板

前言:

在知道了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之间.

绘图效果如下这里写图片描述

模拟器上面画的有带你丑请见谅~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值