2017-12-17 25 views
-1

5つのビューが内部にあるLinearLayoutがあり、1x5グリッドを形成します。ドラッグされたオブジェクトをドラッグ元に揃える方法は?

このLinearLayoutがドラッグされます。

現在、5つのビューのそれぞれでonTouchListenersを設定し、ドラッグの5つのうちのどれが開始され、LinearLayoutでmotionEvent.getAction()を呼び出すかを確認しています。

LinearLayoutがドラッグ開始点ではなく中央でドラッグされるため、これは不完全です。

MotionEventの開始時にLinearLayoutを変換する方法はありませんので、ドラッグの開始元はドラッグ中に指の下にありますか?これを行うにはのLinearLayout

private final class MyTouchListener implements View.OnTouchListener { 
    //public boolean onTouch(View view, MotionEvent motionEvent) { 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     LinearLayout ship = (LinearLayout)view.getParent(); 
     dragCellIndex = ship.indexOfChild(view); 
     dragCellTotal = ship.getChildCount(); 
     view = ship; 

     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {    
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 
+0

いくつか試しましたか?いくつかのコードを怒らせた? –

+0

私は元の投稿に使用しているタッチリスナーを追加しました。私はLinearLayout内にドラッグ起源の左右にいくつのセルがあるのか​​を確認しようとしました。左側のsetTranslationX(cell.length()* - 1)と右側のsetTranslationX(cell.length())にそれぞれについて調べました。それは何も変わらなかった。 –

答えて

1

内の5つのビューのそれぞれに設定されている

MyTouchListener、あなたは数学の計算のビットをしたいのですが。あなたの指のタッチを取得するか、またはX座標とY座標をmotionEventからドラッグし、それらの差をLinearLayoutの左上隅のX座標とY座標で計算し、それらを2つの変数に保存します。

このように、LinearLayoutをドラッグすると、これらの変数をX座標とY座標に追加し、LinearLayoutをその点に移動するだけです。私はあなたがその考えを持っていることを願っています

私はカードゲームを開発する際にこの方法を使用しましたが、魅力的です。

+0

motionEvent()を呼び出した直後、または直後にLinearLayoutにX座標とY座標を追加する必要がありますか? –

+0

最初のタッチ(ACTION_DOWN)で、getX()メソッドとgetY()メソッドを使用して、onTouchEvent(MotionEvent motionEvent)内のmotionEventからX座標とY座標を取得します。 LinearLayoutのXとYを使って距離(対応する座標の差)を計算し、それをいくつかの変数に保存します。次に、ACTION_MOVEでこれらの変数を使用して、保存された座標を追加してLinearLayoutの動きを調整します。 –