2016-12-27 33 views
0

私は単純なドラッグドロップアプリケーションをアンドロイドで作成しました。今は、ビュー自体に触れることなくビューをx軸上で移動したいと思います。ユーザーが画面に触れた画面。どのようにこの効果を達成できますか。オブジェクトの下をタッチしてビューをドラッグし、それに応じて移動

現在、私はドラッグドロップ操作のチュートリアルを使用しています。私は親ビューでOnTouchListnerを適用しました。しかし、これは良いアイデアではないと思います。誰かが私にそれを行う正しい方法を提案することができます。ここで

は私のコード

rel.setOnTouchListener(this); 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     switch (event.getActionMasked()) { 
      case MotionEvent.ACTION_DOWN: 
       dX = v.getX() - event.getRawX(); 
       dY = v.getY() - event.getRawY(); 
       lastAction = MotionEvent.ACTION_DOWN; 
       break; 

      case MotionEvent.ACTION_MOVE: 
       v.setY(event.getRawY() + dY); 
       v.setX(event.getRawX() + dX); 
       lastAction = MotionEvent.ACTION_MOVE; 
       break; 

      case MotionEvent.ACTION_UP: 
       if (lastAction == MotionEvent.ACTION_DOWN) 
        Toast.makeText(MainActivity.this, "Clicked!", Toast.LENGTH_SHORT).show(); 
       break; 

      default: 
       return false; 
     } 
     return true; 
    } 

で、私のXMLコードは、私は、私は答えは、それが助けられるようにsomeone.ThisコードはX上でビューを移動することを書いていますコメントしたよう

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rel" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

     <ImageView 
      android:id="@+id/ball" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:src="@drawable/ball" /> 
</RelativeLayout> 
+0

'MotionEvent.ACTION_MOVE:'から 'v.setY(event.getRawY()+ dY);'行を削除できますか? –

+0

@MayurRaval yesとなり、x軸方向にのみ移動します – AbhayBohra

答えて

0

最後にこの問題は、コードに変更を加えることで解決します。この効果を達成する。

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
      dx = v.getX() - event.getRawX(); 
      dy = v.getY() - event.getRawY(); 
      ball_dx = ball.getX(); 
      lastAction = MotionEvent.ACTION_DOWN; 
      break; 

     case MotionEvent.ACTION_MOVE: 
      // ball.setY(event.getRawY() + dy); 
      if ((event.getRawX() + dx + ball_dx) < screenwidth - 80 && (event.getRawX() + dx + ball_dx) > 10) 
       ball.setX(event.getRawX() + dx + ball_dx); 
      lastAction = MotionEvent.ACTION_MOVE; 
      break; 

     case MotionEvent.ACTION_UP: 
      if (lastAction == MotionEvent.ACTION_DOWN) 
       Toast.makeText(MainActivity.this, "Clicked!", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      return false; 
    } 
    return true; 
} 
0

軸のみ

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
      dX = v.getX() - event.getRawX(); 
      dY = v.getY() - event.getRawY(); 
      lastAction = MotionEvent.ACTION_DOWN; 
      break; 

     case MotionEvent.ACTION_MOVE: 
      //remove this v.setY() line 
      v.setX(event.getRawX() + dX); 
      lastAction = MotionEvent.ACTION_MOVE; 
      break; 

     case MotionEvent.ACTION_UP: 
      if (lastAction == MotionEvent.ACTION_DOWN) 
       Toast.makeText(MainActivity.this, "Clicked!", Toast.LENGTH_SHORT).show(); 
      break; 

     default: 
      return false; 
    } 
    return true; 
} 
関連する問題