我在 ViewFlipper 上使用 GestureDetector 来实现 showPrevious 和 showNext。一切都很好。但是,我想要 ViewFlipper 动画立即跟随手指手势的效果,而不是在手势完成之后。有什么建议吗?
问问题
3440 次
1 回答
6
据我所知,您必须手动完成。下面的代码应该为您指明正确的方向。您必须添加动态动画,以便视图在翻转期间不会闪烁。根据 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;
}
于 2011-05-05T22:33:17.930 回答