Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ViewFlipper that follows gestures immediately

I’m using GestureDetector on ViewFlipper to implement showPrevious and showNext. Everything is fine. However, I wanna have the effect that ViewFlipper animation follows finger gesture right away, instead of after gesture is done. Any advise?

like image 542
chao Avatar asked Apr 05 '11 06:04

chao


1 Answers

As far as I know you have to do it manually. The code below should point you into the right direction. You have to add dynamic animations so the view don't flicker during the flipp. There is more you need to do, depending of the content in the viewflipper, but it should get you started.

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;
}
like image 116
taktiger Avatar answered Sep 26 '22 01:09

taktiger