@Override
  public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction();
    boolean flag = false;

    switch (action) {
      case MotionEvent.ACTION_DOWN:
        try {
          MovementMethod m = getMovementMethod();
          setMovementMethod(null);
          CharSequence sequence = getText();
          if (sequence instanceof Spannable) {
            boolean mt = m.onTouchEvent(this, (Spannable) getText(), event);
            if (mt) {
              event.setAction(MotionEvent.ACTION_UP);
              mt = m.onTouchEvent(this, (Spannable) getText(), event);
              event.setAction(MotionEvent.ACTION_DOWN);
            }
            boolean st = super.onTouchEvent(event);
            setMovementMethod(m);
            setFocusable(false);
            flag = mt || st;
          }
        } catch (Exception e) {

        }

        break;
      default:
        break;
    }
    return flag;
  }
Esempio n. 2
0
  @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    boolean ret = false;

    if (mIsScroll && event.getAction() == MotionEvent.ACTION_UP) {
      if (mScrollX > 0 && mScrollX < mMaxDistance) {
        unFold();
        ret = true;
      }
      event.setAction(MotionEvent.ACTION_CANCEL);
      mIsScroll = false;
    } else if (mGestureDetector != null && mGestureDetector.onTouchEvent(event)) {
      event.setAction(MotionEvent.ACTION_CANCEL);
      ret = true;
    }

    if (super.dispatchTouchEvent(event)) {
      ret = true;
    }

    if (ret) {
      invalidate();
    }
    return ret;
  }
  private boolean resetDispatchTouchEvent(MotionEvent ev) {
    MotionEvent newEvent = MotionEvent.obtain(ev);

    ev.setAction(MotionEvent.ACTION_CANCEL);
    dispatchTouchEvent(ev);

    newEvent.setAction(MotionEvent.ACTION_DOWN);
    return dispatchTouchEvent(newEvent);
  }
  public void onTouchEvent(final MotionEvent event) {
    if (!_running) return;
    boolean result = _detector.onTouchEvent(event);
    if (_mode == MODE_SOLID) event.setAction(MotionEvent.ACTION_CANCEL);
    else if (_mode == MODE_DYNAMIC) {

      if (event.getAction() == ACTION_FAKE) event.setAction(MotionEvent.ACTION_UP);
      else if (result) event.setAction(MotionEvent.ACTION_CANCEL);
      else if (_tapIndicator) {
        event.setAction(MotionEvent.ACTION_DOWN);
        _tapIndicator = false;
      }
    }
  }
  private void postLongPress() {
    synchronized (mLock) {
      if (!mPostLongPressScheduled) {
        return;
      }
      mPostLongPressScheduled = false;

      MotionEvent event = mPostTouchStream.getLastEvent();
      if (event == null) {
        return;
      }

      switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_POINTER_DOWN:
        case MotionEvent.ACTION_POINTER_UP:
          break;
        default:
          return;
      }

      MotionEvent eventToEnqueue = MotionEvent.obtainNoHistory(event);
      eventToEnqueue.setAction(MotionEvent.ACTION_MOVE);
      DispatchEvent d =
          obtainDispatchEventLocked(
              eventToEnqueue,
              EVENT_TYPE_LONG_PRESS,
              0,
              mPostLastWebKitXOffset,
              mPostLastWebKitYOffset,
              mPostLastWebKitScale);
      enqueueEventLocked(d);
    }
  }
 protected boolean dispatchTouchEvent(MotionEvent event) {
   int x = (int) event.getX();
   int y = (int) event.getY();
   int action = event.getAction();
   if (mMotionTarget != null) {
     if (action == MotionEvent.ACTION_DOWN) {
       MotionEvent cancel = MotionEvent.obtain(event);
       cancel.setAction(MotionEvent.ACTION_CANCEL);
       dispatchTouchEvent(cancel, x, y, mMotionTarget, false);
       mMotionTarget = null;
     } else {
       dispatchTouchEvent(event, x, y, mMotionTarget, false);
       if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
         mMotionTarget = null;
       }
       return true;
     }
   }
   if (action == MotionEvent.ACTION_DOWN) {
     // in the reverse rendering order
     for (int i = getComponentCount() - 1; i >= 0; --i) {
       GLView component = getComponent(i);
       if (component.getVisibility() != GLView.VISIBLE) continue;
       if (dispatchTouchEvent(event, x, y, component, true)) {
         mMotionTarget = component;
         return true;
       }
     }
   }
   return onTouch(event);
 }
  @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    if (!onFilterTouchEventForSecurity(event)) return false;

    int action = event.getAction();

    double dx = event.getX() - mCenterX;
    double dy = mCenterY - event.getY();
    double radius = Math.sqrt(dx * dx + dy * dy);

    // Check if the event should be dispatched to the shutter button.
    if (radius <= mShutterButtonRadius) {
      if (mIndicatorControlWheel.getVisibility() == View.VISIBLE) {
        mIndicatorControlWheel.onTouchOutBound();
      }
      if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) {
        return mShutterButton.dispatchTouchEvent(event);
      }
      return false;
    }

    if (mShutterButton.isPressed()) {
      // Send cancel to the shutter button if it was pressed.
      event.setAction(MotionEvent.ACTION_CANCEL);
      mShutterButton.dispatchTouchEvent(event);
      return true;
    }

    return mIndicatorControlWheel.dispatchTouchEvent(event);
  }
 @Override
 public boolean onSingleTapConfirmed(final MotionEvent arg0) {
   if (_mode == MODE_DYNAMIC) { // we owe an ACTION_UP, so we fake an
     arg0.setAction(ACTION_FAKE); // action which will be converted to an ACTION_UP later.
     _context.dispatchTouchEvent(arg0);
   }
   return false;
 }
Esempio n. 9
0
 public boolean onTouch(View view, MotionEvent motionevent)
 {
     view = d.e(b);
     if (b.o() && !view.g(view.f()) && a.onTouchEvent(motionevent))
     {
         motionevent.setAction(3);
     }
     return false;
 }
  public void onTouchEvent(MotionEvent event) {

    if (!this.running) return;

    boolean result = this.detector.onTouchEvent(event);

    if (this.mode == MODE_SOLID) event.setAction(MotionEvent.ACTION_CANCEL);
    else if (this.mode == MODE_DYNAMIC) {

      if (event.getAction() == ACTION_FAKE) event.setAction(MotionEvent.ACTION_UP);
      else if (result) event.setAction(MotionEvent.ACTION_CANCEL);
      else if (this.tapIndicator) {
        event.setAction(MotionEvent.ACTION_DOWN);
        this.tapIndicator = false;
      }
    }
    // else just do nothing, it's Transparent
  }
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {

    final float x = ev.getX();
    final float y = ev.getY();
    final int action = ev.getAction();

    if (action == MotionEvent.ACTION_DOWN
        && mTouchTarget == null
        && mPinnedSection != null
        && isPinnedViewTouched(mPinnedSection.view, x, y)) { // create touch target

      // user touched pinned view
      mTouchTarget = mPinnedSection.view;
      mTouchPoint.x = x;
      mTouchPoint.y = y;

      // copy down event for eventually be used later
      mDownEvent = MotionEvent.obtain(ev);
    }

    if (mTouchTarget != null) {
      if (isPinnedViewTouched(mTouchTarget, x, y)) { // forward event to pinned view
        mTouchTarget.dispatchTouchEvent(ev);
      }

      if (action == MotionEvent.ACTION_UP) { // perform onClick on pinned view
        super.dispatchTouchEvent(ev);
        performPinnedItemClick();
        clearTouchTarget();

      } else if (action == MotionEvent.ACTION_CANCEL) { // cancel
        clearTouchTarget();

      } else if (action == MotionEvent.ACTION_MOVE) {
        if (Math.abs(y - mTouchPoint.y) > mTouchSlop) {

          // cancel sequence on touch target
          MotionEvent event = MotionEvent.obtain(ev);
          event.setAction(MotionEvent.ACTION_CANCEL);
          mTouchTarget.dispatchTouchEvent(event);
          event.recycle();

          // provide correct sequence to super class for further handling
          super.dispatchTouchEvent(mDownEvent);
          super.dispatchTouchEvent(ev);
          clearTouchTarget();
        }
      }

      return true;
    }

    // call super if this was not our pinned view
    return super.dispatchTouchEvent(ev);
  }
  @Override
  public boolean onSingleTapConfirmed(MotionEvent me) {
    if (this.mode == MODE_DYNAMIC) { // we owe an ACTION_UP, so we fake an
      me.setAction(ACTION_FAKE); // action which will be converted to an
      // ACTION_UP later.
      this.context.dispatchTouchEvent(me);
    }

    return false;
  }
Esempio n. 13
0
  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
    MotionEvent cancellation = MotionEvent.obtain(ev);
    cancellation.setAction(MotionEvent.ACTION_CANCEL);

    boolean intercept = mExpandHelper.onInterceptTouchEvent(ev) || super.onInterceptTouchEvent(ev);
    if (intercept) {
      latestItems.onInterceptTouchEvent(cancellation);
    }
    return intercept;
  }
Esempio n. 14
0
 @Override
 public boolean onHoverEvent(MotionEvent event) {
   //        if (AccessibilityManager.getInstance(mContext).isTouchExplorationEnabled()) {
   final int action = event.getAction();
   switch (action) {
     case MotionEvent.ACTION_HOVER_ENTER:
       event.setAction(MotionEvent.ACTION_DOWN);
       break;
     case MotionEvent.ACTION_HOVER_MOVE:
       event.setAction(MotionEvent.ACTION_MOVE);
       break;
     case MotionEvent.ACTION_HOVER_EXIT:
       event.setAction(MotionEvent.ACTION_UP);
       break;
   }
   onTouchEvent(event);
   event.setAction(action);
   //        }
   return super.onHoverEvent(event);
 }
Esempio n. 15
0
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    Log.i(LOG_STRING, "touch event: " + ev.toString());
    // + " eventTime: " + ev.getEventTime() + " downtime: " + ev.getDownTime());
    //  + " xraw: " + ev.getRawX() +" x: "+ev.getX()
    //  + " yraw: " + ev.getRawY() +" y: "+ev.getY());
    // mDemonstration.addMotionEvent(ev);
    Parcel parcel = Parcel.obtain();
    parcel.writeParcelable(ev, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
    // add motionevent to parcel
    try {
      if (mBinder == null) {
        Log.e(LOG_STRING, "Null binder!");
      }
      mBinder.transact(DemonstrationService.MOTION_EVENT_CODE, parcel, null, IBinder.FLAG_ONEWAY);
    } catch (RemoteException e) {
      Log.e(LOG_STRING, "Error transacting with demonstration service: " + e.toString());
    }

    if (mExplorationEnabled) {
      int pointers = ev.getPointerCount();

      if (ev.getPointerCount() == 1) {
        ViewGroup target = this;

        if (ev.getAction() == MotionEvent.ACTION_OUTSIDE) {
          ev.setAction(MotionEvent.ACTION_DOWN);
          mDetector.onTouchEvent(ev);
          ev.setAction(MotionEvent.ACTION_UP);
        }

        mDetector.onTouchEvent(ev);

        return true;
      }

      ev = stripLastPointer(ev);
    }

    return super.dispatchTouchEvent(ev);
  }
  @Override
  public boolean dispatchTouchEvent(final MotionEvent ev) {

    if (ev.getAction() == MotionEvent.ACTION_POINTER_DOWN
        || ev.getAction() == MotionEvent.ACTION_POINTER_UP) {
      System.out.println("cancelled");
      ev.setAction(MotionEvent.ACTION_CANCEL);
      return true;
    }

    return super.dispatchTouchEvent(ev);
  }
Esempio n. 17
0
 public boolean onTouch(MotionEvent event) {
   boolean ret = false;
   if (isVisible()) {
     ret = super.onTouch(event);
     int action = event.getAction();
     if (mOpenCancle) {
       if (mClip && !touched(event.getX(), event.getY())) {
         event.setAction(MotionEvent.ACTION_CANCEL);
       }
     }
     for (ScreenElement ele : mElements) {
       if (ele.isTickFinished && ele.onTouch(event)) {
         ret = true;
       }
     }
     if (mOpenCancle) {
       event.setAction(action);
     }
   }
   return ret;
 }
Esempio n. 18
0
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    if (((!mEnabled || !mInterceptTouch) && mMode == MODE_READY) || mAlwaysOpened) {
      return super.dispatchTouchEvent(ev);
    }

    if (mMode != MODE_FINISHED) {
      onTouchEvent(ev);

      if (mMode != MODE_SLIDE) {
        super.dispatchTouchEvent(ev);
      } else {
        MotionEvent cancelEvent = MotionEvent.obtain(ev);
        cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
        super.dispatchTouchEvent(cancelEvent);
        cancelEvent.recycle();
      }

      return true;
    } else {
      final int action = ev.getAction();

      Rect rect = new Rect();
      View menu = getChildAt(0);
      menu.getHitRect(rect);

      if (!rect.contains((int) ev.getX(), (int) ev.getY())) {
        if (action == MotionEvent.ACTION_UP && mCloseOnRelease && !mDispatchWhenOpened) {
          close();
          mCloseOnRelease = false;
        } else {
          if (action == MotionEvent.ACTION_DOWN && !mDispatchWhenOpened) {
            mCloseOnRelease = true;
          }

          onTouchEvent(ev);
        }

        if (mDispatchWhenOpened) {
          super.dispatchTouchEvent(ev);
        }

        return true;
      } else {
        onTouchEvent(ev);

        ev.offsetLocation(-menu.getLeft(), -menu.getTop());
        menu.dispatchTouchEvent(ev);

        return true;
      }
    }
  }
  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    int action = ev.getAction() & MotionEvent.ACTION_MASK;
    if (action == MotionEvent.ACTION_DOWN) {
      mDownY = ev.getY();
      mHeaderOwnsTouch = mHeader != null && mDownY <= mHeader.getHeight() + mHeaderOffset;
    }

    boolean handled;
    if (mHeaderOwnsTouch) {
      if (mHeader != null && Math.abs(mDownY - ev.getY()) <= mTouchSlop) {
        handled = mHeader.dispatchTouchEvent(ev);
      } else {
        if (mHeader != null) {
          MotionEvent cancelEvent = MotionEvent.obtain(ev);
          cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
          mHeader.dispatchTouchEvent(cancelEvent);
          cancelEvent.recycle();
        }

        MotionEvent downEvent =
            MotionEvent.obtain(
                ev.getDownTime(),
                ev.getEventTime(),
                ev.getAction(),
                ev.getX(),
                mDownY,
                ev.getMetaState());
        downEvent.setAction(MotionEvent.ACTION_DOWN);
        handled = mList.dispatchTouchEvent(downEvent);
        downEvent.recycle();
        mHeaderOwnsTouch = false;
      }
    } else {
      handled = mList.dispatchTouchEvent(ev);
    }

    return handled;
  }
Esempio n. 20
0
 /**
  * Detect if the given {@link MotionEvent} is outside the boundaries of this window, which usually
  * means we should dismiss.
  */
 protected void detectEventOutside(MotionEvent event) {
   if (event.getAction() == MotionEvent.ACTION_DOWN) {
     // Only try detecting outside events on down-press
     mDecor.getHitRect(mRect);
     mRect.top = mRect.top + mShadowTouch;
     mRect.bottom = mRect.bottom - mShadowTouch;
     final int x = (int) event.getX();
     final int y = (int) event.getY();
     if (!mRect.contains(x, y)) {
       event.setAction(MotionEvent.ACTION_OUTSIDE);
     }
   }
 }
Esempio n. 21
0
 /** 添加触摸事件 点击之后 出现 清空editText的效果 */
 @Override
 public boolean onTouchEvent(MotionEvent paramMotionEvent) {
   if ((this.dRight != null) && (paramMotionEvent.getAction() == 1)) {
     this.rBounds = this.dRight.getBounds();
     int i = (int) paramMotionEvent.getRawX(); // 距离屏幕的距离
     // int i = (int) paramMotionEvent.getX();//距离边框的距离
     if (i > getRight() - 3 * this.rBounds.width()) {
       setText("");
       paramMotionEvent.setAction(MotionEvent.ACTION_CANCEL);
     }
   }
   return super.onTouchEvent(paramMotionEvent);
 }
Esempio n. 22
0
  @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    int dx, dy;
    if (isLoading) return super.dispatchTouchEvent(event);

    int action = event.getAction();
    switch (action) {
      case MotionEvent.ACTION_DOWN:
        x = (int) event.getX();
        y = (int) event.getY();
        currentView.loadUrl(Notice.TOUCHDOWN);
        break;
      case MotionEvent.ACTION_MOVE:
        dx = (int) event.getX() - x;
        dy = (int) event.getY() - y;
        x = (int) event.getX();
        y = (int) event.getY();
        Log.d(TAG, "dx:" + dx + ",dy:" + dy);
        if (dx > -5 && dx < 5 && dy > -5 && dy < 5) {
        } else {
          moved = true;
        }
        break;
      case MotionEvent.ACTION_UP:
        if (!moved) { // 直接点击的事件,模拟一个下去
          Log.d(TAG, "click event");
          event.setAction(MotionEvent.ACTION_DOWN);
          currentView.dispatchTouchEvent(event);
          event.setAction(MotionEvent.ACTION_UP);
          currentView.dispatchTouchEvent(event);
        }
        moved = false;
        x = (int) event.getX();
        y = (int) event.getY();
        currentView.loadUrl(Notice.TOUCHUP);
    }
    return true;
  }
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        downX = tempX = (int) event.getRawX();
        downY = (int) event.getRawY();
        break;
      case MotionEvent.ACTION_MOVE:
        int moveX = (int) event.getRawX();
        int deltaX = tempX - moveX;
        tempX = moveX;
        if (Math.abs(moveX - downX) > mTouchSlop
            && Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
          isSilding = true;

          if (isTouchOnAbsListView()) {
            MotionEvent cancelEvent = MotionEvent.obtain(event);
            cancelEvent.setAction(
                MotionEvent.ACTION_CANCEL
                    | (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
            v.onTouchEvent(cancelEvent);
          }
        }

        if (moveX - downX >= 0 && isSilding) {
          mParentView.scrollBy(deltaX, 0);

          if (isTouchOnScrollView() || isTouchOnAbsListView()) {
            return true;
          }
        }
        break;
      case MotionEvent.ACTION_UP:
        isSilding = false;
        if (mParentView.getScrollX() <= -viewWidth / 2) {
          isFinish = true;
          scrollRight();
        } else {
          scrollOrigin();
          isFinish = false;
        }
        break;
    }

    if (isTouchOnScrollView() || isTouchOnAbsListView()) {
      return v.onTouchEvent(event);
    }

    return true;
  }
Esempio n. 24
0
  /** 处理我们拖动ListView item的逻辑 */
  @Override
  public boolean onTouchEvent(MotionEvent ev) {
    if (isSlide && slidePosition != AdapterView.INVALID_POSITION) {
      System.out.println("touch-->" + "开始");
      requestDisallowInterceptTouchEvent(true);
      addVelocityTracker(ev);
      final int action = ev.getAction();
      int x = (int) ev.getX();
      switch (action) {
        case MotionEvent.ACTION_DOWN:
          System.out.println("touch-->" + "down");
          break;
        case MotionEvent.ACTION_MOVE:
          System.out.println("touch-->" + "move");
          MotionEvent cancelEvent = MotionEvent.obtain(ev);
          cancelEvent.setAction(
              MotionEvent.ACTION_CANCEL
                  | (ev.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
          onTouchEvent(cancelEvent);

          int deltaX = downX - x;

          // 手指拖动itemView滚动, deltaX大于0向左滚动,小于0向右滚
          itemView.scrollTo(deltaX, 0);
          // 根据手指滑动的距离,调整透明度
          itemView.setAlpha(1f - Math.abs((float) deltaX / screenWidth));

          return true; // 拖动的时候ListView不滚动
        case MotionEvent.ACTION_UP:
          System.out.println("touch-->" + "up");
          // 手指离开的时候就不响应左右滚动
          isSlide = false;
          int velocityX = getScrollVelocity();
          if (velocityX > SNAP_VELOCITY) {
            scrollRight();
          } else if (velocityX < -SNAP_VELOCITY) {
            scrollLeft();
          } else {
            scrollByDistanceX();
          }

          recycleVelocityTracker();

          break;
      }
    }

    // 否则直接交给ListView来处理onTouchEvent事件
    return super.onTouchEvent(ev);
  }
Esempio n. 25
0
 @Override
 public boolean onHoverEvent(MotionEvent event) {
   final AccessibilityManager accessibilityManager =
       (AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
   if (accessibilityManager.isTouchExplorationEnabled()) {
     final int action = event.getAction();
     switch (action) {
       case MotionEvent.ACTION_HOVER_ENTER:
         event.setAction(MotionEvent.ACTION_DOWN);
         break;
       case MotionEvent.ACTION_HOVER_MOVE:
         event.setAction(MotionEvent.ACTION_MOVE);
         break;
       case MotionEvent.ACTION_HOVER_EXIT:
         event.setAction(MotionEvent.ACTION_UP);
         break;
     }
     onTouchEvent(event);
     event.setAction(action);
   }
   super.onHoverEvent(event);
   return true;
 }
Esempio n. 26
0
  @Override
  public boolean onTouch(View v, MotionEvent ev) {

    requestDisallowInterceptTouchEvent(true);
    addVelocityTracker(ev);
    final int action = ev.getAction();
    int y = (int) ev.getY();
    switch (action) {
      case MotionEvent.ACTION_DOWN:
        break;
      case MotionEvent.ACTION_MOVE:
        MotionEvent cancelEvent = MotionEvent.obtain(ev);
        cancelEvent.setAction(
            MotionEvent.ACTION_CANCEL
                | (ev.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
        onTouchEvent(cancelEvent);

        int deltaY = downY - y;
        downY = y;
        Log.e("move_distance", String.valueOf(deltaY));

        // 手指拖动this滚动, deltaX大于0向左滚动,小于0向右滚
        this.scrollBy(0, deltaY);

        return true; // 拖动的时候ListView不滚动
      case MotionEvent.ACTION_UP:
        //                    int velocityY = getScrollVelocity();
        //                    if (velocityY > SNAP_VELOCITY) {
        //                        scrollDOWN();
        //                    } else if (velocityY < -SNAP_VELOCITY) {
        //                        scrollUP();
        //                    } else {
        //                        scrollByDistanceX();
        //                    }
        //
        //                    recycleVelocityTracker();
        // 手指离开的时候就不响应左右滚动

        scrollByDistanceX();
        isSlide = false;
        break;
    }

    // 否则直接交给ListView来处理onTouchEvent事件
    return super.onTouchEvent(ev);
  }
  @Override
  public boolean onInterceptTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        mInterceptTouchDownX = event.getRawX();
        mInterceptTouchDownY = event.getRawY();
        break;
      case MotionEvent.ACTION_MOVE:
        if (!mIsLoadingMore && (mCurrentRefreshStatus != RefreshStatus.REFRESHING)) {
          if (mInterceptTouchDownX == -1) {
            mInterceptTouchDownX = (int) event.getRawX();
          }
          if (mInterceptTouchDownY == -1) {
            mInterceptTouchDownY = (int) event.getRawY();
          }

          int interceptTouchMoveDistanceY = (int) (event.getRawY() - mInterceptTouchDownY);
          // 可以没有上拉加载更多,但是必须有下拉刷新,否则就不拦截事件
          if (Math.abs(event.getRawX() - mInterceptTouchDownX)
                  < Math.abs(interceptTouchMoveDistanceY)
              && mRefreshHeaderView != null) {
            if ((interceptTouchMoveDistanceY > 0 && shouldHandleRefresh())
                || (interceptTouchMoveDistanceY < 0 && shouldHandleLoadingMore())
                || (interceptTouchMoveDistanceY < 0 && !isWholeHeaderViewCompleteInvisible())
                || (interceptTouchMoveDistanceY > 0
                    && shouldInterceptToMoveCustomHeaderViewDown())) {

              // ACTION_DOWN时没有消耗掉事件,子控件会处于按下状态,这里设置ACTION_CANCEL,使子控件取消按下状态
              event.setAction(MotionEvent.ACTION_CANCEL);
              super.onInterceptTouchEvent(event);
              return true;
            }
          }
        }
        break;
      case MotionEvent.ACTION_CANCEL:
      case MotionEvent.ACTION_UP:
        // 重置
        mInterceptTouchDownX = -1;
        mInterceptTouchDownY = -1;
        break;
    }

    return super.onInterceptTouchEvent(event);
  }
 @Override
 public boolean onTouchEvent(final MotionEvent event) {
   switch (event.getAction()) {
     case MotionEvent.ACTION_DOWN:
       break;
     case MotionEvent.ACTION_MOVE:
       final ViewGroup parent = (ViewGroup) getParent();
       //                if (parent.onInterceptTouchEvent(event)) {
       event.setAction(MotionEvent.ACTION_DOWN);
       post(
           new Runnable() {
             @Override
             public void run() {
               parent.dispatchTouchEvent(event);
             }
           });
       //                }
       break;
   }
   return super.onTouchEvent(event);
 }
    /**
     * Updates the touch event stream.
     *
     * @param event The event that we intend to send, or null to cancel the touch event stream.
     * @return The event that we should actually send, or null if no event should be sent because
     *     the proposed event would make the stream inconsistent.
     */
    public MotionEvent update(MotionEvent event) {
      if (event == null) {
        if (isCancelNeeded()) {
          event = mLastEvent;
          if (event != null) {
            event.setAction(MotionEvent.ACTION_CANCEL);
            mLastEvent = null;
          }
        }
        return event;
      }

      switch (event.getActionMasked()) {
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_DOWN:
        case MotionEvent.ACTION_POINTER_UP:
          if (mLastEvent == null || mLastEvent.getAction() == MotionEvent.ACTION_UP) {
            return null;
          }
          updateLastEvent(event);
          return event;

        case MotionEvent.ACTION_DOWN:
          updateLastEvent(event);
          return event;

        case MotionEvent.ACTION_CANCEL:
          if (mLastEvent == null) {
            return null;
          }
          updateLastEvent(null);
          return event;

        default:
          return null;
      }
    }
 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
   boolean intercept = false;
   if (mDoubleTapToSleepEnabled) {
     if (mService.getBarState() == StatusBarState.SHADE && ev.getY() < mStatusBarHeaderHeight) {
       if (DEBUG) Log.w(TAG, "logging double tap gesture");
       mDoubleTapGesture.onTouchEvent(ev);
     }
   }
   final int h = getMeasuredHeight();
   if (mDoubleTapToSleepLockScreen
       && mService.getBarState() == StatusBarState.KEYGUARD
       && (ev.getY() < (h / 3) || ev.getY() > (h - mStatusBarHeaderHeight))) {
     if (DEBUG) Log.w(TAG, "logging lock screen double tap gesture");
     mDoubleTapGesture.onTouchEvent(ev);
   }
   if (mNotificationPanel.isFullyExpanded()
       && mStackScrollLayout.getVisibility() == View.VISIBLE
       && mService.getBarState() == StatusBarState.KEYGUARD
       && !mService.isBouncerShowing()) {
     intercept = mDragDownHelper.onInterceptTouchEvent(ev);
     // wake up on a touch down event, if dozing
     if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
       mService.wakeUpIfDozing(ev.getEventTime(), ev);
     }
   }
   if (!intercept) {
     super.onInterceptTouchEvent(ev);
   }
   if (intercept) {
     MotionEvent cancellation = MotionEvent.obtain(ev);
     cancellation.setAction(MotionEvent.ACTION_CANCEL);
     mStackScrollLayout.onInterceptTouchEvent(cancellation);
     mNotificationPanel.onInterceptTouchEvent(cancellation);
     cancellation.recycle();
   }
   return intercept;
 }