ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-10-26 00:02:26  阅读:311  来源: 互联网

标签:MotionEvent Paint getName 教学 案例 互联网 ACTION drawable 屏幕


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

标签:MotionEvent,Paint,getName,教学,案例,互联网,ACTION,drawable,屏幕
来源: https://blog.csdn.net/qq_53174491/article/details/120961775

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有