コード例 #1
0
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    if (MotionEventUtil.getPointerCount(event) > 1) {
      return true;
    } else if (!mScroller.isFinished()) {
      mScroller.abortAnimation();
    }

    int action = event.getAction();

    // 加速度の処理
    if (action == MotionEvent.ACTION_DOWN) {
      mVelocityTracker.clear();

      mDownPoint.x = event.getX();
      mDownPoint.y = event.getY();
    }
    mVelocityTracker.addMovement(event);

    switch (event.getAction()) {
      case MotionEvent.ACTION_MOVE:
        requestLayout();
        scrollBy((int) (mPrevX - event.getX()), 0);
        break;
      case MotionEvent.ACTION_UP:
        mVelocityTracker.computeCurrentVelocity(VELOCITY_UNIT);
        float xVelocity = mVelocityTracker.getXVelocity();

        // 現在のスクロールピクセル数を取得する
        int currentDiffX = (mCurrentPageIndex * mScreenWidth) - getScrollX();

        // スクロールしている方向|加速度によって表示するページを変更する
        int nextPageIndex = mCurrentPageIndex;
        if (getChildCount() == 1) {
          // 1ページしかなければ、スクロールしない
          nextPageIndex = 0;
        } else if (currentDiffX < -(mScreenWidth * 0.5) || xVelocity < -VELOCITY_THRESHOLD) {
          // 右ページにスクロール
          nextPageIndex = mCurrentPageIndex + 1;
        } else if (currentDiffX > (mScreenWidth * 0.5) || xVelocity > VELOCITY_THRESHOLD) {
          // 左ページにスクロール
          nextPageIndex = mCurrentPageIndex - 1;
        }

        // ページ移動する
        switchPage(nextPageIndex, (int) (SCROLL_DURATION_DEFAULT - Math.abs(xVelocity)));

        break;
    }
    mPrevX = event.getX();

    return true;
  }
コード例 #2
0
  @Override
  public boolean onInterceptTouchEvent(MotionEvent event) {
    super.onInterceptTouchEvent(event);

    if (MotionEventUtil.getPointerCount(event) > 1) {
      // マルチタッチ時にスクロールはしないので判定終了
      requestDisallowInterceptTouchEvent(true);
      return false;
    }

    // onTouch()のために加速度の計算を始める
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      mPrevX = event.getX();
      mDownPoint.x = event.getX();
      mDownPoint.y = event.getY();
    }

    // スクロールなのか、コンテンツにアクセスなのか判定する
    float diffX = Math.abs(event.getX() - mDownPoint.x);
    float diffY = Math.abs(event.getY() - mDownPoint.y);

    if (!mScroller.isFinished()) {
      // スクロール中なので、インターセプトする
      mScroller.abortAnimation();
      return true;
    } else if (Math.max(diffX, diffY) < COMPUTE_MIN_DIFF) {
      // まだ判定できる移動距離に達していないので見送り
      return false;
    } else if (diffX > (diffY * 2)) {
      // 横スクロールなので、インターセプトする
      mDownPoint.x = event.getX();
      mDownPoint.y = event.getY();
      return true;
    } else if (diffY > (diffX * 2)) {
      // 縦スクロールなので、これ以降の判定を止める
      requestDisallowInterceptTouchEvent(true);
      return false;
    } else {
      // 縦スクロールなのか、横スクロールなのか微妙なので見送り
      return false;
    }
  }