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

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引入,非触摸滚动,主要是由鼠标、滚轮、轨迹球触发。
 

上一篇:Assign arrow function to a variable before exporting as module default import/no-anonymous-default-


下一篇:学会了Android事件分发可以甩锅?