Android 高仿QQ HD mini左右滑动菜单栏效果(2)

/*
* If being flinged and user touches the screen, initiate drag;
* otherwise don't. mScroller.isFinished should be false when being
* flinged.
*/
mIsBeingDragged = !mScroller.isFinished();
break;
}
case MotionEvent.ACTION_MOVE: {
/*
* mIsBeingDragged == false, otherwise the shortcut would have
* caught it. Check whether the user has moved far enough from his
* original down touch.
*/

/*
* Locally do absolute value. mLastMotionY is set to the y value of
* the down event.
*/
final int activePointerId = mActivePointerId;
if (activePointerId == INVALID_POINTER) {
// If we don't have a valid id, the touch down wasn't on
// content.
break;
}

final int pointerIndex = ev.findPointerIndex(activePointerId);
final float x = ev.getX(pointerIndex);
final float y = ev.getY(pointerIndex);
final int xDiff = (int) Math.abs(x - mLastMotionX);
final int yDiff = (int) Math.abs(y - mLastMotionY);
if (xDiff > mTouchSlop && yDiff < xDiff) {
mIsBeingDragged = true;
}
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mIsBeingDragged = false;
mActivePointerId = INVALID_POINTER;
scrollToScreen();
break;
}
return mIsBeingDragged;
}

@Override
public boolean onTouchEvent(MotionEvent event) {

// Log.i(TAG, "onTouchEvent ---->>>>>" + event.getAction());
if (event.getAction() == MotionEvent.ACTION_DOWN
&& !inChild((int) event.getX(), (int) event.getY())) {
// Don't handle edge touches immediately -- they may actually belong
// to one of our
// descendants.
return false;
}

switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
return true; // 本VIEW消化掉

case MotionEvent.ACTION_MOVE:
final int activePointerIndex = event
.findPointerIndex(mActivePointerId);

final float x = event.getX(activePointerIndex);
final float y = event.getY(activePointerIndex);

final int distanceX = (int) /* Math.abs */-(x - mLastMotionX);

// 在滑动过程中,就需要显示新的brotherView,不然显示的还是之前的brotherView,最后松开手时会突然变称新brotherView,影响体验
if (distanceX < 0 && getScrollX() < 0 && leftLayout != null) {
setBrotherVisibility(LEFT);
} else if (distanceX > 0 && getScrollX() > 0 && rightLayout != null) {
setBrotherVisibility(RIGHT);
} else {
setBrotherVisibility(MIDDLE);
}

scrollBy((int) distanceX, 0);

mLastMotionX = x;
mLastMotionY = y;
break;

case MotionEvent.ACTION_UP:
mIsBeingDragged = false;
mActivePointerId = INVALID_POINTER;
scrollToScreen();
break;

default:
return super.onTouchEvent(event);
}
return mIsBeingDragged;

}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
// TODO Auto-generated method stub
super.onScrollChanged(l, t, oldl, oldt);
}

private void scrollToScreen() {

int scrollDistance = 0;

if (Math.abs(getScrollX()) > getWidth() / 2)
scrollDistance = (getScrollX() > 0) ? getWidth() - menuWidth
- getScrollX() : -(getWidth() - menuWidth - Math
.abs(getScrollX()));
else
scrollDistance = -getScrollX();

int distance = scrollDistance + getScrollX();
Log.i(TAG, " distance = " + distance);
if (distance > 0) {
mCurState = RIGHT;
} else if (distance < 0) {
mCurState = LEFT;
} else {
mCurState = MIDDLE;
}
mScroller.startScroll(getScrollX(), 0, scrollDistance, 0,
Math.abs(scrollDistance) * 2);
invalidate();

}

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (Math.abs(velocityX) > ViewConfiguration.get(context)
.getScaledMinimumFlingVelocity()) {
fling = true;
scrollToScreen();
}

return fling;
}

private boolean inChild(int x, int y) {
if (getChildCount() > 0) {
final int scrollX = mScroller.getCurrX();
final View child = getChildAt(0);

return !(scrollX + x < 0 || scrollX + x > getWidth() || y < 0 || y > getHeight());

}
return false;
}

/**
* 设置当前显示的view
*
* @param whichpg
*/
public void setPage(int whichpg) {
int targetX = 0, moveDistance = 0;

if (whichpg == LEFT) {
targetX = -(getViewWidthInPix(context) - menuWidth);
mCurState = LEFT;
} else if (whichpg == RIGHT) {
targetX = getViewWidthInPix(context) - menuWidth;
mCurState = RIGHT;
} else {
mCurState = MIDDLE;
}
setBrotherVisibility(whichpg);
moveDistance = targetX - getScrollX();
mScroller.startScroll(getScrollX(), 0, moveDistance, 0,
Math.abs(moveDistance) * 2);
invalidate();
}

/**
* 返回当前显示的view
*
* @return
*/
public int getPage() {
return mCurState;
}

public void addChildView(View child) {
this.childLayout.addView(child);
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a648206c4c651531821e837ead81757a.html