屏幕一张张翻
class PanelSwitcher extends FrameLayout {
??? private static final int MAJOR_MOVE = 60;
??? private static final int ANIM_DURATION = 400;
??? private GestureDetector mGestureDetector;
??? private int mCurrentView;
??? private View mChild, mHistoryView;
??? private View children[];
??? private int mWidth;
??? private TranslateAnimation inLeft;
??? private TranslateAnimation outLeft;
??? private TranslateAnimation inRight;
??? private TranslateAnimation outRight;
??? private static final int NONE? = 1;
??? private static final int LEFT? = 2;
??? private static final int RIGHT = 3;
??? private int mPreviousMove;
??? public PanelSwitcher(Context context, AttributeSet attrs) {
??????? super(context, attrs);
??????? mCurrentView = 0;
??????? mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
??????????????? public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
?????????????????????????????????????? float velocityY) {
??????????????????? int dx = (int) (e2.getX() - e1.getX());
??????????????????? // don't accept the fling if it's too short
??????????????????? // as it may conflict with a button push
??????????????????? if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.abs(velocityY)) {
??????????????????????? if (velocityX > 0) {
??????????????????????????? moveRight();
??????????????????????? } else {
??????????????????????????? moveLeft();
??????????????????????? }
??????????????????????? return true;
??????????????????? } else {
??????????????????????? return false;
??????????????????? }
??????????????? }
??????????? });
??? }
??? @Override
??? public void onSizeChanged(int w, int h, int oldW, int oldH) {
??????? mWidth = w;
??????? inLeft?? = new TranslateAnimation(mWidth, 0, 0, 0);
??????? outLeft? = new TranslateAnimation(0, -mWidth, 0, 0);???????
??????? inRight? = new TranslateAnimation(-mWidth, 0, 0, 0);
??????? outRight = new TranslateAnimation(0, mWidth, 0, 0);
??????? inLeft.setDuration(ANIM_DURATION);
??????? outLeft.setDuration(ANIM_DURATION);
??????? inRight.setDuration(ANIM_DURATION);
??????? outRight.setDuration(ANIM_DURATION);
??? }
??? protected void onFinishInflate() {
??????? int count = getChildCount();
??????? children = new View[count];
??????? for (int i = 0; i < count; ++i) {
??????????? children[i] = getChildAt(i);
??????????? if (i != mCurrentView) {
??????????????? children[i].setVisibility(View.GONE);
??????????? }
??????? }
??? }
??? @Override
??? public boolean onTouchEvent(MotionEvent event) {
??????? mGestureDetector.onTouchEvent(event);
??????? return true;
??? }
??? @Override
??? public boolean onInterceptTouchEvent(MotionEvent event) {
??????? return mGestureDetector.onTouchEvent(event);
??? }
??? void moveLeft() {
??????? //? <--
??????? if (mCurrentView < children.length - 1 && mPreviousMove != LEFT) {
??????????? children[mCurrentView+1].setVisibility(View.VISIBLE);
??????????? children[mCurrentView+1].startAnimation(inLeft);
??????????? children[mCurrentView].startAnimation(outLeft);
??????????? children[mCurrentView].setVisibility(View.GONE);
??????????? mCurrentView++;
??????????? mPreviousMove = LEFT;
??????? }
??? }
??? void moveRight() {
??????? //? -->
??????? if (mCurrentView > 0 && mPreviousMove != RIGHT) {
??????????? children[mCurrentView-1].setVisibility(View.VISIBLE);
??????????? children[mCurrentView-1].startAnimation(inRight);
??????????? children[mCurrentView].startAnimation(outRight);
??????????? children[mCurrentView].setVisibility(View.GONE);
??????????? mCurrentView--;
??????????? mPreviousMove = RIGHT;
??????? }
??? }
??? int getCurrentIndex() {
??????? return mCurrentView;
??? }
}