使用MotionEvent.ACTION_MOVE制作像主屏幕的ViewFlipper

好吧,我有一个ViewFlipper与三个嵌套在其中的LinearLayouts 。 它默认显示第一个。 此代码:

 // Assumptions in my Activity class: // oldTouchValue is a float // vf is my view flipper @Override public boolean onTouchEvent(MotionEvent touchEvent) { switch (touchEvent.getAction()) { case MotionEvent.ACTION_DOWN: { oldTouchValue = touchEvent.getX(); break; } case MotionEvent.ACTION_UP: { float currentX = touchEvent.getX(); if (oldTouchValue < currentX) { vf.setInAnimation(AnimationHelper.inFromLeftAnimation()); vf.setOutAnimation(AnimationHelper.outToRightAnimation()); vf.showNext(); } if (oldTouchValue > currentX) { vf.setInAnimation(AnimationHelper.inFromRightAnimation()); vf.setOutAnimation(AnimationHelper.outToLeftAnimation()); vf.showPrevious(); } break; } case MotionEvent.ACTION_MOVE: { // TODO: Some code to make the ViewFlipper // act like the home screen. break; } } return false; } public static class AnimationHelper { public static Animation inFromRightAnimation() { Animation inFromRight = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); inFromRight.setDuration(350); inFromRight.setInterpolator(new AccelerateInterpolator()); return inFromRight; } public static Animation outToLeftAnimation() { Animation outtoLeft = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); outtoLeft.setDuration(350); outtoLeft.setInterpolator(new AccelerateInterpolator()); return outtoLeft; } // for the next movement public static Animation inFromLeftAnimation() { Animation inFromLeft = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); inFromLeft.setDuration(350); inFromLeft.setInterpolator(new AccelerateInterpolator()); return inFromLeft; } public static Animation outToRightAnimation() { Animation outtoRight = new TranslateAnimation( Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f); outtoRight.setDuration(350); outtoRight.setInterpolator(new AccelerateInterpolator()); return outtoRight; } } 

…处理视图翻转,但animation非常“开/关”。 我想知道如果有人能帮助我最后一部分。 假设我可以访问LinearLayouts,有没有一种方法可以根据deltaX和deltaY设置布局的位置?

有人给了我这个链接,并说我应该参考applyTransformation方法暗示如何做到这一点,但我不知道如何重复这种相同的行为。

Solutions Collecting From Web of "使用MotionEvent.ACTION_MOVE制作像主屏幕的ViewFlipper"

在移动手指的同时移动视图很容易完成:

 case MotionEvent.ACTION_MOVE: final View currentView = vf.getCurrentView(); currentView.layout((int)(touchEvent.getX() - oldTouchValue), currentView.getTop(), currentView.getRight(), currentView.getBottom()); break; 

现在这只是移动目前的观点,而不是邻居。 我还没有testing,但可能可以通过getChildAt获得:

 vf.getChildAt(vf.getDisplayedChild() - 1); // previous vf.getChildAt(vf.getDisplayedChild() + 1); // next 

希望有所帮助。

如果我理解你的请求,现在应该使用View Pager实现这个效果

看起来像这样:

在这里输入图像说明