2021SC@SDUSC
案例——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)方法
细节分析
抗锯齿方法
① 当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿。
② 在用View的RotateAnimation做动画时候,如果View当中包含有大量的图形,也会出现锯齿。
(1)用Canvas绘制位的的情况。在用Canvas绘制位图时,一般地,我们使用drawBitmap函数家族,在这些函数中,都有一个Paint参数,要 做到防止锯齿,我们就要使用到这个参数。如下:首先在你的构造函数中,需要创建一个Paint。
Paint mPaint = new Paint();
然后,需要设置两个参数:
1)mPaint.setAntiAlias();
2)mPaint.setBitmapFilter(true)。第一个函数是用来防止边缘的锯齿,第二个函数是用来对位图进行滤波处理。最后,在画图的 时候,调用drawBitmap函数,只需要将整个Paint传入即可。
(2)做RotateAnimation时,会发现,锯齿又出现了。这个时候,由于不能控制位图的绘制,只能用其他方法来实现防止锯齿。 另外,如果画的位图很多。不想每个位图的绘制都传入一个Paint。还有的时候,不可能控制每个窗口的绘制的时候,就需要用下面的方法来处理——对 整个Canvas进行处理。
1)在构造函数中,创建一个Paint滤波器。 PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG);第一个参数是你要清除的标志位,第二个参数是你要设置的标志位。此处设置为对位图进行滤波。
2)在画图的时候,如果是View则在onDraw当中,如果是ViewGroup则在dispatchDraw中调用如下函数。 canvas.setDrawFilter( mSetfil );
Android的MotionEvent和事件处理
MotionEvent对象是与用户触摸相关的时间序列,该序列从用户首次触摸屏幕开始,经历手指在屏幕表面的任何移动,直到手指离开屏幕时结束。手指的初次触摸(ACTION_DOWN操作),滑动(ACTION_MOVE操作)和抬起(ACTION_UP)都会创建MotionEvent对象,每次触摸时候这三个操作是肯定发生的。移动过程中也会产生大量事件,每个事件都会产生对应的MotionEvent对象记录发生的操作,触摸的位置,使用的多大压力,触摸的面积,何时发生,以及最初的ACTION_DOWN何时发生等相关的信息。
动作常量:
MotionEvent.ACTION_DOWN:当屏幕检测到第一个触点按下之后就会触发到这个事件。
MotionEvent.ACTION_MOVE:当触点在屏幕上移动时触发,触点在屏幕上停留也是会触发的,主要是由于它的灵敏度很高,而我们的手指又不可能完全静止(即使我们感觉不到移动,但其实我们的手指也在不停地抖动)。
MotionEvent.ACTION_POINTER_DOWN:当屏幕上已经有触点处于按下的状态的时候,再有新的触点被按下时触发。
MotionEvent.ACTION_POINTER_UP:当屏幕上有多个点被按住,松开其中一个点时触发(即非最后一个点被放开时)触发。
MotionEvent.ACTION_UP:当触点松开时被触发。
MotionEvent.ACTION_OUTSIDE: 表示用户触碰超出了正常的UI边界.
MotionEvent.ACTION_SCROLL:android3.1引入,非触摸滚动,主要是由鼠标、滚轮、轨迹球触发。