我有一个由其他不同视图组成的复杂视图。我希望能够垂直拖动一个视图以缩放其上方的另一个视图。希望我制作的这张图能解释我需要达到的情况。 见图形 。我试过拖放,但我只有一个垂直拖动它。我也尝试过使用 onTouchListener。我有点难过,因为 View 2 是 ViewPager,所以我做了一个技巧,在 View 2 的顶部使用 ontouchlistener 添加了一个透明图像,但我无法实现平滑的移动。有任何想法吗?
问问题
450 次
1 回答
0
我很困惑。为什么将相同的 onTouch 侦听器附加到所有 3 个视图,然后在触摸操作后调整每个视图的大小不起作用?添加类似下面的触摸侦听器,然后在同一父视图中调整每个视图的大小或相对权重而不是动画。
public class ViewFlipperSwipeDetector : FooClass, View.IOnTouchListener
{
//private Activity activity;
private ViewFlipper viewflipper;
int MIN_DISTANCE = 100;
private float downX, downY, upX, upY;
public ViewFlipperSwipeDetector(ViewFlipper viewflipper)
{
//this.activity = activity;
this.viewflipper = viewflipper;
}
private Animation inFromRightAnimation()
{
Animation inFromRight = new TranslateAnimation(
Dimension.RelativeToParent, +1.0f, Dimension.RelativeToParent, 0.0f,
Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, 0.0f);
inFromRight.Duration = 400;
inFromRight.Interpolator = new AccelerateInterpolator();
return inFromRight;
}
private Animation outToLeftAnimation()
{
Animation outtoLeft = new TranslateAnimation(
Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, -1.0f,
Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, 0.0f);
outtoLeft.Duration = 400;
outtoLeft.Interpolator = new AccelerateInterpolator();
return outtoLeft;
}
private Animation inFromLeftAnimation()
{
Animation inFromLeft = new TranslateAnimation(
Dimension.RelativeToParent, -1.0f, Dimension.RelativeToParent, 0.0f,
Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, 0.0f);
inFromLeft.Duration = 400;
inFromLeft.Interpolator = new AccelerateInterpolator();
return inFromLeft;
}
private Animation outToRightAnimation()
{
Animation outtoRight = new TranslateAnimation(
Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, +1.0f,
Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, 0.0f);
outtoRight.Duration = 400;
outtoRight.Interpolator = new AccelerateInterpolator();
return outtoRight;
}
protected void onRightToLeftSwipe()
{
//Toast.MakeText(activity, "RightToLeftSwipe!", ToastLength.Short).Show();
viewflipper.InAnimation = inFromRightAnimation();
viewflipper.OutAnimation = outToLeftAnimation();
viewflipper.ShowNext();
}
protected void onLeftToRightSwipe()
{
// Toast.MakeText(activity, "LeftToRightSwipe!", ToastLength.Short).Show();
viewflipper.InAnimation = inFromLeftAnimation();
viewflipper.OutAnimation = outToRightAnimation();
viewflipper.ShowPrevious();
}
protected void onTopToBottomSwipe()
{
//Toast.MakeText(activity, "TopToBottomSwipe!", ToastLength.Short).Show();
//activity.doSomething();
}
protected void onBottomToTopSwipe()
{
//Toast.MakeText(activity, "BottomToTopSwipe!", ToastLength.Short).Show();
//activity.doSomething();
}
public bool OnTouch(View v, MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
{
downX = e.GetX();
downY = e.GetY();
return true;
}
case MotionEventActions.Up:
{
upX = e.GetX();
upY = e.GetY();
float deltaX = downX - upX;
float deltaY = downY - upY;
// swipe horizontal?
if (Math.Abs(deltaX) > MIN_DISTANCE)
{
// left or right
if (deltaX < 0) { this.onLeftToRightSwipe(); return true; }
if (deltaX > 0) { this.onRightToLeftSwipe(); return true; }
}
else
{
//Toast.MakeText(activity, "Swipe was only " + Math.Abs(deltaX) + " long, need at least " + MIN_DISTANCE, ToastLength.Short).Show();
return false;
}
// swipe vertical?
if (Math.Abs(deltaY) > MIN_DISTANCE)
{
// top or down
if (deltaY < 0) { this.onTopToBottomSwipe(); return true; }
if (deltaY > 0) { this.onBottomToTopSwipe(); return true; }
}
else
{
//Toast.MakeText(activity, "Swipe was only " + Math.Abs(deltaX) + " long, need at least " + MIN_DISTANCE, ToastLength.Short);
return false;
}
return true;
}
}
return false;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
}
于 2013-09-21T20:12:14.143 回答