2017-02-27 62 views
0

(Xamarin with Visual Studio 2015)我想實現一個簡單的活動inwith一個Imageview,它可以通過觸摸來移動/拖動:這是我實現的,但圖像閃爍並且移動速度較慢。你能舉一個例子來說明如何實現這個嗎? 感謝您的幫助!Xamarin Imageview Drag Sample

private void TouchMeImageViewOnTouch(object sender, View.TouchEventArgs touchEventArgs) 
    { 
     View bild = (View)sender; 
     RelativeLayout.LayoutParams layouti = (RelativeLayout.LayoutParams)bild.LayoutParameters; 
     switch (touchEventArgs.Event.Action & MotionEventActions.Mask) 
     { 
      case MotionEventActions.Down: 
       xDelta = touchEventArgs.Event.GetX()-layouti.LeftMargin; 
       yDelta = touchEventArgs.Event.GetX() - layouti.LeftMargin; 
       break; 
      case MotionEventActions.Move: 
       int wert = (int)touchEventArgs.Event.GetX(); 
       yvalue = touchEventArgs.Event.GetY()-yDelta; 
       xvalue = touchEventArgs.Event.GetX()-xDelta; 
       float xdpi = (int) Resources.DisplayMetrics.Density; 
       layouti.LeftMargin = (int)xvalue; 
       layouti.TopMargin = (int)yvalue; 
       container.Invalidate(); 
       break; 

      case MotionEventActions.Up: 
       break; 

      default: 
       break; 
     } 

     xPositionText.Text = xvalue.ToString(); 
     yPositionText.Text = yvalue.ToString(); 
    } 

回答

1

我試圖實現一個可拖動的imageview進行測試。在Android模擬器中拖動速度很慢。但通過在真實設備中進行測試,它可以正常工作並快速移動。

試試下面的代碼示例:

public class MainActivity : Activity, IOnTouchListener 
{ 
    Button dragAbleBt; 
    ImageView imgV1; 
    int screenWidth = 0; 
    int screenHeight = 0; 
    int lastX = 0, lastY = 0; 
    public bool OnTouch(View v, MotionEvent e) 
    { 

     MotionEventActions ea = e.Action; 
     switch (ea) { 
      case MotionEventActions.Down: 
       lastX = (int)e.RawX; 
       lastY = (int)e.RawY;     
       break; 
      case MotionEventActions.Move: 
       int dx = (int)e.RawX - lastX; 
       int dy = (int)e.RawY - lastY; 
       int left = v.Left + dx; 
       int right = v.Right + dx; 
       int top = v.Top + dy; 
       int bottom = v.Bottom + dy; 
       if (left < 0) 
       { 
        left = 0; 
        right = left + v.Width; 
       } 
       if (right > screenWidth) 
       { 
        right = screenWidth; 
        left = right - v.Width; 
       } 
       if (top < 0) 
       { 
        top = 0; 
        bottom = top + v.Height; 
       } 
       if (bottom > screenHeight) 
       { 
        bottom = screenHeight; 
        top = bottom - v.Height; 
       } 
       v.Layout(left, top, right, bottom); 
       lastX = (int) e.RawX; 
       lastY = (int) e.RawY; 
       v.PostInvalidate(); 
       break; 
      case MotionEventActions.Up:     
       break;     
     } 
     if (v.Id == Resource.Id.imageView1) 
     { 
      return true; 
     } 
     return false; 
    } 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView (Resource.Layout.Main); 
     //DisplayMetrics dm = Resources.DisplayMetrics; 
     //screenWidth = dm.WidthPixels; 
     //screenHeight = dm.HeightPixels; 
     dragAbleBt = FindViewById<Button>(Resource.Id.button1); 
     imgV1 = FindViewById<ImageView>(Resource.Id.imageView1); 
     dragAbleBt.SetOnTouchListener(this); 
     imgV1.SetOnTouchListener(this); 
    } 

    public override void OnWindowFocusChanged(bool hasFocus) 
    { 
     base.OnWindowFocusChanged(hasFocus); 
     if (hasFocus) 
     { 
      Rect outRect = new Rect(); 
      this.Window.FindViewById(Window.IdAndroidContent).GetDrawingRect(outRect); 
      screenWidth = outRect.Width(); 
      screenHeight = outRect.Height(); 
     } 
    } 
} 

請參考源代碼以github

+0

NICE!這個工作,甚至在模擬器上平滑!非常感謝!我將分析代碼以瞭解我已閱讀​​的Android解決方案與此新解決方案之間的差異! –

+0

@MehmetAtes如果答案幫助你,請將它標記爲答案thx :) –