@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; }
@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; } }