学习笔记--android中surfaceview 简单用法实例:画板。

来源:互联网 发布:小猪cms 视频展示 编辑:程序博客网 时间:2024/06/06 00:45

关于View SurfaceView

View 必须在UI的主线程中更新画面如果你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。

SurfaceView可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度

使用方法:

首先继承SurfaceView并实现SurfaceHolder.Callback接口。
使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始而在Surface被销毁之前必须结束。所以Callback中的surfaceCreated创建 surfaceDestroyed销毁 就成了绘图处理代码的边界。

(1)、abstract void addCallback(SurfaceHolder.Callback callback);
 给SurfaceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
(3)、abstract Canvas lockCanvas(Rect rect);
 锁定画布的某个区域进行画图等,不用重画rect外的其它区域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canvas);
结束锁定画
并提交

1 自定义一个类继承,实现其中的方法,没什么好说的。

public classMyLineViewextendsSurfaceView  

2 在布局添加你的控件

<com.example.k555l.test.MyLineView
    android:id="@+id/mylineview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

 

3 初始化,实现接口。

MyLineView lineView = (MyLineView) findViewById(R.id.mylineview);holder = lineView.getHolder();//得当前SurfaceView中的surface对应的SurfaceHolderpath = new Path();    //路径holder.addCallback(new SurfaceHolder.Callback() { //添加回调,匿名实现    @Override    public void surfaceCreated(SurfaceHolder surfaceHolder) {        //绘图代码写在这里
          Canvas canvas = surfaceHolder.lockCanvas();//锁定画布        canvas.drawColor(Color.WHITE);//画布背景色        surfaceHolder.unlockCanvasAndPost(canvas);

 }
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
//在surface的大小发生改变时激发 }
@Override
public void
surfaceDestroyed(SurfaceHolder surfaceHolder) {

}
});

4 触摸事件

lineView.setOnTouchListener(newView.OnTouchListener() {
    @Override
    public booleanonTouch(View view,MotionEvent event) {

        floatx = event.getX();
        floaty = event.getY();
        switch(event.getAction()) {
            caseMotionEvent.ACTION_DOWN:
                isdrawing=true; //标志设为true;
                new DrawThread().start();//开启绘制线程
                lastX= x;
                lastY= y;
                path.moveTo(lastX,lastY);
                break;
            case MotionEvent.ACTION_UP:
                isdrawing=false;//标志设为false

                break;
            case MotionEvent.ACTION_MOVE:
                floatdx = Math.abs(x -lastX);
                floatdy = Math.abs(y -lastY);
                if (dx>3||dy>3){
                path.quadTo((lastX+ x) / 2,(lastY+ y) / 2,x,y);//x1,y1 控制点 x2,y2结束点
                }
                lastX= x;
                lastY= y;
                break;
        }
        return true;
    }
});

5 绘图线程

classDrawThreadextendsThread {//绘制线程
    CanvasmCanvas;//画布

    @Override
    public voidrun() {
        while(isdrawing) {
            Drawing();
        }
    }

    private voidDrawing() {
        try{
            mCanvas=holder.lockCanvas();//锁定画布
            mCanvas.drawColor(Color.WHITE);//画布背景色
            Paint paint =newPaint();//定义画笔
            paint.setStrokeWidth(15);//画笔粗细
            paint.setColor(Color.RED);//画笔颜色
            paint.setStyle(Paint.Style.STROKE);//画笔风格 这里是描边
            paint.setAntiAlias(true);  //抗锯齿
            mCanvas.drawPath(path,paint);//绘制
        }finally{
            holder.unlockCanvasAndPost(mCanvas);//解锁提交画布
        }

    }
}

 ----不足之处还请留言指出,谢谢!

原创粉丝点击