跟随手势的Android ViewFlipper

7

我正在使用GestureDetector在ViewFlipper上实现showPrevious和showNext。一切都很好。然而,我希望能够实现ViewFlipper动画立即跟随手指移动的效果,而不是等手势结束后再执行动画。有什么建议吗?

1个回答

6
据我所知,您必须手动完成。下面的代码应该指向正确的方向。您需要添加动态动画,以便在翻转期间视图不会闪烁。根据视图翻转器中的内容,您还需要进行更多操作,但这应该可以让您入门。
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接