我在ViewFlipper上使用GestureDetector来实现showPrevious和showNext。 一切都好。但是,我希望ViewFlipper动画能够立即跟随手指手势,而不是手势完成后。 有什么建议吗?
答案 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;
}