立即跟随手势的Android ViewFlipper

时间:2011-04-05 06:02:38

标签: android animation viewflipper gesturedetector

我在ViewFlipper上使用GestureDetector来实现showPrevious和showNext。 一切都好。但是,我希望ViewFlipper动画能够立即跟随手指手势,而不是手势完成后。 有什么建议吗?

1 个答案:

答案 0 :(得分:6)

据我所知,你必须手动完成。下面的代码应该指向正确的方向。您必须添加动态动画,以便在flipp期间视图不会闪烁。根据viewflipper中的内容,您需要做的更多,但它应该让您开始。

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction())
    {
        case MotionEvent.ACTION_DOWN:
        {
            //Gets the startpoint for you finger
            pressDownPoint = event.getX();

            //Gets how many view there is in the viewflipper
            flipperViewCount = flipper.getChildCount();

            //Checks if there is a view to the left of the current view
//if there is, it positions it to the left of the current view
            if (flipper.getDisplayedChild() > 0)
            {
                View leftChild = flipper.getChildAt(flipper.getDisplayedChild() - 1);
                //You must set the left view to invisible or visible 
//or it will not move to the position you tell it
                leftChild.setVisibility(View.INVISIBLE);
                leftChild.layout(-screenWidth, 
                        leftChild.getTop(), 0, 
                        leftChild.getBottom());
            }

            //Same as above but for the view to the right
            if (flipper.getDisplayedChild() < flipperViewCount - 1)
            {
                View rightChild = flipper.getChildAt(flipper.getDisplayedChild() + 1);
                rightChild.setVisibility(View.INVISIBLE);
                rightChild.layout(screenWidth, 
                        rightChild.getTop(), screenWidth * 2, 
                        rightChild.getBottom());
            }
            break;
        }
        case MotionEvent.ACTION_UP:
        {
            //Gets the absolute position on the screen
            float releasePoint = event.getRawX();

            //Calculates if the fling is to the right or left
//The screenDensity variable is simply the density of the device
//Have in mind that this will not flipp the viewflipper if you drag
//your finger less than about 0.5cm (depeding on the device)
//In that case you need to make an animation that takes the view back
//to its original position. Else it will just get stuck where you
//let go with your finger.
            if (Math.abs(pressDownPoint - releasePoint) / screenDensity > 30)
            {
                if (pressDownPoint > releasePoint)
                {
                    myAnimLeft(); //Method with your animation
                    flipper.showNext();
                }
                else
                {
                    myAnimRight();
                    flipper.showPrevious();
                }
            }
            break;
        }
        case MotionEvent.ACTION_MOVE:
        {
            View currentView = flipper.getCurrentView();

            //Moves the current view
//screenWidth is based on the current devices screen width
            currentView.layout((int)(event.getRawX() - pressDownPoint), 
                    currentView.getTop(), (int)(event.getRawX() - pressDownPoint) + screenWidth, 
                    currentView.getBottom());

            //Moves the view to the left if there is one
            if (flipper.getDisplayedChild() > 0)
            {
                View leftChild = flipper.getChildAt(flipper.getDisplayedChild() - 1);
                leftChild.layout((int)(event.getRawX() - pressDownPoint - screenWidth), 
                        leftChild.getTop(), (int)(event.getRawX() - pressDownPoint), 
                        leftChild.getBottom());

                //Sets the left view to visible so it shows
                if (leftChild.getVisibility() == View.INVISIBLE)
                {
                    leftChild.setVisibility(View.VISIBLE);
                }
            }

            //Same as above but for the view to the right
            if (flipper.getDisplayedChild() < flipperViewCount - 1)
            {
                View rightChild = flipper.getChildAt(flipper.getDisplayedChild() + 1);
                rightChild.layout((int)(event.getRawX() - pressDownPoint + screenWidth), 
                        rightChild.getTop(), (int)(event.getRawX() - pressDownPoint + (screenWidth * 2)), 
                        rightChild.getBottom());

                if (rightChild.getVisibility() == View.INVISIBLE)
                {
                    rightChild.setVisibility(View.VISIBLE);
                }
            }
        }

    }
    return true;
}