移动互联网开发教学案例学习-5

2021SC@SDUSC

目录

 案例——draw_compare

MSurfaceView类——SurfaceView基本框架

getallDrawPic()方法

重写onTouchEvent(MotionEvent event)方法

 initView()方法


 案例——draw_compare

MSurfaceView类——SurfaceView基本框架

相关变量:

mIsDrawing --- 是否处于绘制状态

mCanvas --- 画布

mPath --- 路径

mPaint --- 画笔

getallDrawPic()方法

该方法用于获取drawable中所有的draw文件

    private void getallDrawPic(){
        Field[] fields=R.drawable.class.getDeclaredFields();
        for(Field field:fields){
            //获取文件名对应的系统生成的id
            if(field.getName().contains("draw")) {
                int resID = getResources().getIdentifier(field.getName(),
                        "drawable",getClass().getPackage().getName());
                drawable_list.add(resID);
                Log.e("ADD","add all pic to List");
            }else {
                Log.e("ADD Wrong",field.getName());
            }
        }
    }

 1)Field[] fields = R.drawable.class.getDeclaredFields();可以获取到drawable文件名列表,不包含扩展名。

2)int resID = getResources().getIdentifier(field.getNmae(),"drawable",getClass().getPackage().getName());获取文件名对应的系统生成id,需指定包路径getClass().getPackage().getName(),指定资源类型drawable.

重写onTouchEvent(MotionEvent event)方法

分为三种情况:

1)当屏幕检测到有一个触点按下的时候,路径从该位置开始;

2)当触点在屏幕上移动的时候,路径连接;

3)当触点松开时,终止。

    @Override
    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;
            default:
                break;
        }

        return true;
    }

 initView()方法

该方法完成的工作主要有设置画布且背景透明,设置可选中。可触摸、屏幕常亮,初始化路径、画笔,设置路径抗锯齿,设置画笔颜色,设置画笔样式。

    private void initView() {
        //初始化变量
        //获取SurfaceView LockHolder
        mHolder = getHolder();
        mHolder.addCallback(this);

        // 设置画布 背景透明
        setZOrderOnTop(true);
        mHolder.setFormat(PixelFormat.TRANSLUCENT);

        //设置可选中、可触摸、屏幕常亮
        setFocusable(true);
        setFocusableInTouchMode(true);
        this.setKeepScreenOn(true);

        //初始化路径、画笔
        if (mPath == null) {
            mPath = new Path();
        }
        if (mPaint == null) {
            mPaint = new Paint();
        }
        //设置画笔抗锯齿
        mPaint.setAntiAlias(true);
        //设置画笔颜色
        mPaint.setColor(Color.RED);
        //设置画笔样式,宽度20
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(20);
        initBitmaps();
        getallDrawPic();

    }

Surface就是一个用来画图形(graphics)或图像(image)的地方,对于View及其子类,都是画在Surface上,各Surface上,各Surface对象通过Surfacefinger合成到frameBuffer,每个Surface都是双缓冲,它有一个backBuffer和一个frontBuffer,Surface中创建了Canvas对象,用来管理Surface绘图操作,Canvas对应Bitmap,存储Surface中的内容。流程为:

1、创建一个Bitmap对象

2、创建一个Canvas对象关联创建的Bitmap对象

3、在Canvas上进行绘制

4、锁定Canvas画布

5、将Bitmap内容绘制到backBuffer中去

6、解锁Canvas画布

SurfaceView是视图类View的子类,且实现了Parcelable接口且实现了Parcelable接口,其中内嵌了一个专用于绘制的Surface,SurfaceView可以控制这个Surface的绘制位置。可以理解为Surface就是管理数据的地方,Surface就似乎管理数据的地方,SurfaceView就是展示数据的地方。

SurfaceHolder是一个接口,类似于一个surface的监听器。通过下面的三个回调方法监听Surface的创建、销毁或者改变。

SurfaceView中调用getHolder方法,可以获得当前SurfaceView中的surface对应的SurfaceHolder,SurfaceHolder中重要的方法有:

1、abstract void addCallback(SurfaceHolder Callback callback),为SurfaceHolder添加一个SurfaceHolder Callback回调接口。

2、abstract Canvas lockCanvas(),获取Surface中的Canvas对象,并锁定之。

3、abstract voidunlockCanvasAndPost(Canvas canvas),当修改Surface中的数据完成后,释放同步锁,并提交改变,然后将新的数据进行展示。

SurfaceHolder Callback是SurfaceHolder接口内部的静态子接口,SurfaceHolder Callback中定义了三个接口方法:

1、public void surfaceChange(SurfaceHolder holder,int format,int width,int height){}  是在Surface的大小发生改变时调用。

2、public void surfaceCreate(SurfaceHolder holder){}  是在Surface创建时激发,一般在这里调用画面的线程。

3、public void surfaceDestoryed(SurfaceHolder holder){}  是在销毁时发生,一般在这里将画面的线程停止、释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值