他の異なるビューで構成される複雑なビューがあります。あるビューを垂直にドラッグして、その上にある別のビューをスケーリングできるようにしたいと思います。私が作成したこのグラフィックが、私が達成する必要がある状況を説明していることを願っています。 グラフィックを参照してください 。ドラッグアンドドロップで試してみましたが、縦にドラッグするのは1つだけです。onTouchListener も試してみました。少し苦労しました。 View 2 は ViewPager なので、ontouchlistener で View 2 の上部に透明な画像を追加するというトリックを作成しましたが、スムーズな動きが得られませんでした。何か案は?
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 に答える