1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Android事件拦截(一)——触摸事件MotionEvent分析

Android事件拦截(一)——触摸事件MotionEvent分析

时间:2023-08-06 05:21:02

相关推荐

Android事件拦截(一)——触摸事件MotionEvent分析

(1)MotionEvent相关动作事件

//按下动作public static final int ACTION_DOWN = 0;//抬起动作public static final int ACTION_UP = 1;//移动动作public static final int ACTION_MOVE = 2;//触摸取消动作public static final int ACTION_CANCEL = 3;//触摸动作超出边界public static final int ACTION_OUTSIDE = 4;//多点触摸按下动作public static final int ACTION_POINTER_DOWN = 5;//多点触摸离开动作public static final int ACTION_POINTER_UP = 6;//动作掩码常量public static final int ACTION_MASK = 255; //0x00ff//索引掩码常量public static final int ACTION_POINTER_INDEX_MASK = 65280; //0xff00//右移8位的常量public static final int ACTION_POINTER_INDEX_SHIFT = 8;//指针在窗口或者View区域移动,但没有按下public static final int ACTION_HOVER_MOVE = 7;//滚轮滚动public static final int ACTION_SCROLL = 8;//指针移入到窗口或者View区域,但没有按下public static final int ACTION_HOVER_ENTER = 9;//指针移出到窗口或者View区域,但没有按下public static final int ACTION_HOVER_EXIT = 10;//按下按钮public static final int ACTION_BUTTON_PRESS = 11;//释放按钮public static final int ACTION_BUTTON_RELEASE = 12;//...

//获取触控动作比如ACTION_DOWNevent.getAction() //获取触控点的数量,比如2则可能是两个手指同时按压屏幕event.getPointerCount(); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引event.getPointerId(nID);//按下开始时间 event.getDownTime();// 事件结束时间event.getEventTime();//总共按下时花费时间event.getEventTime()-event.getDownTime());

代码Demo

final int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;String action = null;@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:action = "ACTION_DOWN";break;case MotionEvent.ACTION_UP:action = "ACTION_UP";break;case MotionEvent.ACTION_MOVE:action = "ACTION_MOVE";break;case MotionEvent.ACTION_CANCEL:action = "ACTION_CANCEL";break;case MotionEvent.ACTION_OUTSIDE:action = "ACTION_OUTSIDE";break;case MotionEvent.ACTION_POINTER_DOWN:action = "ACTION_POINTER_DOWN";break;case MotionEvent.ACTION_POINTER_UP:action = "ACTION_POINTER_UP";break;case MotionEvent.ACTION_HOVER_MOVE:action = "ACTION_HOVER_MOVE";break;case MotionEvent.ACTION_SCROLL:action = "ACTION_SCROLL";break;}Log.e("onTouchEvent", "PointerCount = "+ event.getPointerCount() + ", Time = " + (event.getEventTime() - event.getDownTime())+ ", action = " + action);return super.onTouchEvent(event);}

E/onTouchEvent: PointerCount = 1, Time = 0, action = ACTION_DOWNE/onTouchEvent: PointerCount = 2, Time = 0, action = ACTION_POINTER_DOWNE/onTouchEvent: PointerCount = 3, Time = 0, action = ACTION_POINTER_DOWNE/onTouchEvent: PointerCount = 3, Time = 725, action = ACTION_POINTER_UPE/onTouchEvent: PointerCount = 2, Time = 742, action = ACTION_POINTER_UPE/onTouchEvent: PointerCount = 1, Time = 742, action = ACTION_UP

(2)获取坐标值和相对距离等方法

//表示的是当前控件的宽度,即getRight()-getLeft()View.getWidth()//表示的是当前控件的高度,即getBottom()-getTop()View.getHeight()//子View的顶部到父View顶部的距离View.getTop()//子View的右边界到父View的左边界的距离View.getRight()//子View的底部到父View的顶部的距离View.getBottom()//子View的左边界到父View的左边界的距离 View.getLeft()//计算的是该View在X轴的偏移量。初始值为0,向左偏移值为负,向右偏移值为正View.getTranslationX()//计算的是该View在Y轴的偏移量。初始值为0,向上偏移为负,向下偏移为证View.getTranslationY()//表示的是触摸的点距离自身左边界的距离event.getX()//表示的是触摸的点距离自身上边界的距离event.getY()//表示的是触摸点距离屏幕左边界的距离event.getRawX()//表示的是触摸点距离屏幕上边界的距离event.getRawY()

代码Demo

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="500dp"android:orientation="vertical"android:background="#00FF00"android:gravity="center"><RelativeLayoutandroid:id="@+id/center_layout"android:layout_width="300dp"android:layout_height="300dp"android:background="#FF0000"></RelativeLayout></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>

//获取屏幕相关参数private void getScreenParams() {DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);int heightPixels = dm.heightPixels;//高的像素int widthPixels = dm.widthPixels;//宽的像素int densityDpi = dm.densityDpi;//dpifloat density = dm.density;//density=dpi/160,密度比float xdpi = dm.xdpi;//xdpifloat ydpi = dm.ydpi;//ydpifloat scaledDensity = dm.scaledDensity;//scaledDensity=dpi/160 字体缩放密度比float heightDP = heightPixels / density;//高度的dpfloat widthDP = widthPixels / density;//宽度的dpString str = "\nwidthPixels: " + widthPixels + "px";str += "\nheightPixels: " + heightPixels + "px";str += "\ndensityDpi: " + densityDpi + "dpi";str += "\ndensity: " + density;str += "\nxdpi: " + xdpi + "dpi";str += "\nydpi: " + ydpi + "dpi";str += "\nscaledDensity: " + scaledDensity;str += "\nheightDP: " + heightDP + "dp";str += "\nwidthDP: " + widthDP + "dp";Log.e("ScreenParams", "ScreenParams = " + str);}

mCenterLayout = findViewById(R.id.center_layout);mCenterLayout.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {Log.e("onTouch", "width = " + view.getWidth() + ", height = " + view.getHeight()+ ", measuredWidth = " + view.getMeasuredWidth() + ", measuredHeight = " + view.getMeasuredHeight());Log.e("onTouch", "left = " + view.getLeft() + ", top = " + view.getTop()+ ", right = " + view.getRight() + ", bottom = " + view.getBottom()+ ", translationX = " + view.getTranslationX() + ", translationY = " + view.getTranslationY());Log.e("onTouch", "X = " + event.getX() + ", Y = " + event.getY() +", RawX = " + event.getRawX() + ", RawY = " + event.getRawY());return false;}});

//wm size = 720x1440E/ScreenParams: ScreenParams = widthPixels: 720pxheightPixels: 1344pxdensityDpi: 320dpidensity: 2.0xdpi: 281.353dpiydpi: 283.534dpiscaledDensity: 2.0heightDP: 672.0dpwidthDP: 360.0dp//获取的数据为pixel显示E/onTouch: width = 600, height = 600, measuredWidth = 600, measuredHeight = 600E/onTouch: left = 60, top = 200, right = 660, bottom = 800, translationX = 0.0, translationY = 0.0E/onTouch: X = 109.76422, Y = 31.952667, RawX = 169.76422, RawY = 391.95267

从Log可以看出,获得的数据完全符合上图所示的距离。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。