2021SC@SDUSC
目录
MSurfaceView类——SurfaceView基本框架
重写onTouchEvent(MotionEvent event)方法
案例——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){} 是在销毁时发生,一般在这里将画面的线程停止、释放。