2013-09-21 23 views
0

我有一個由其他不同視圖組成的複雜視圖。我希望能夠垂直拖動一個視圖來縮放另一個視圖。希望我製作的這幅圖解釋了我需要實現的情況。 See graphic 。我嘗試拖放,但我只有一個垂直拖動它。我也嘗試過使用onTouchListener。我有點辛苦視圖2是一個ViewPager,所以我做了一個竅門,在視圖2的頂部用ontouchlistener添加一個透明圖像,並且我無法實現平滑的移動。有任何想法嗎?如何在Android中同時拖放視圖(僅垂直)並在其上縮放另一個視圖?

回答

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); 
    } 

} 
+0

我想了解你的代碼適用於我的情況。但是如何在拖動(或觸摸+移動)的同時逐步縮放上部視圖? Touch(down)時是否可以在不注意步驟的情況下更改LayoutParams?感謝您的回覆 – DroidBeginner

+0

我甚至不明白類聲明中的第一行:':FooClass,View.IOnTouchListener' – DroidBeginner

+0

:在c#中繼承,並且被擴展。在你的情況下,你只需要擴展IOnTouchListener的繼承只是相對於我從我的項目中拉出來的。 –