网站的视频,代加工接订单网站,小学生班级优化大师,网站导航做外链背景#xff1a;在一个事件分发复杂的view中#xff0c;插入一个可点击的控件#xff0c;且不能影响到本身的事件分发。
尝试: 1.对view本身设置点击事件#xff1b;由于view整体是交由root view去处理分发#xff0c;存在滑动、边界处理、调出其他界面等复杂操作。设置点…背景在一个事件分发复杂的view中插入一个可点击的控件且不能影响到本身的事件分发。
尝试: 1.对view本身设置点击事件由于view整体是交由root view去处理分发存在滑动、边界处理、调出其他界面等复杂操作。设置点击事件后root view在该区域无法处理事件fail。 2.覆写view的onTouchEvent当返回true时消费了事件rootView无法处理且无法将事件交还不符合需求当返回false时因为整体事件分发复杂会由其他控件消耗后续事件无法获取fail。 3.由于所有事件的分发顺序判断在rootView中在rootView在处理时将事件传一份给当前view当前view不参与事件分发的流程只通过事件判断自己是否应该响应点击事件pass。
实现在onTouchEvent中插桩执行该方法插桩使用了单例的Controller回调给对应的view // gap,用于判断当前是否可以被认为是一个点击事件private static final float TOUCH_GAP 50f;// 起始xyprivate float mStartX, mStartY;// 标识位是否可以执行click事件private boolean mShouldPerformClick;public void handleTouchEvent(MotionEvent event) {if (event null) return;int action event.getAction();switch (action) {case MotionEvent.ACTION_DOWN:// down事件初始化点击位置如果点击事件在点击区间内重置flagmStartX event.getRawX();mStartY event.getRawY();if (isInArea(mStartX, mStartY)) {mShouldPerformClick true;}break;case MotionEvent.ACTION_MOVE:// 判断当前距离是否大于gapfloat currentX event.getRawX();float currentY event.getRawY();if (mShouldPerformClick (Math.abs(currentX - mStartX) TOUCH_GAP|| Math.abs(currentY - mStartY) TOUCH_GAP)) {mShouldPerformClick false;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:// 根据上面的判断执行点击事件if (mShouldPerformClick) {yourOwnClickEvent();}mShouldPerformClick false;break;default:break;}}// 判断是否down的位置在view上(此处通过rect去标识自定义了点击区间)private boolean isInArea(float startX, float startY) {if (mRect.right 0) {mContent.getGlobalVisibleRect(mRect);}return startX mRect.left startX mRect.right startY mRect.top startY mRect.bottom;}