2012-03-21 15 views
2

私のAndroidアプリケーションでは、別のLinearLayout上にImageViewを「スポーン」ポイントとして持っています。より多くのLinearLayoutsは "スポーン"を囲んでいます。ドラッグアンドドロップを使用してIDを判別しますか?

ImageViewが "青"と呼ばれ、他に2つのLinearLayoutsがあるとします。 1つは「blueArea」と呼ばれ、もう1つは「redArea」です。青がblueAreaにドロップされた場合、アクションが開始されます。青がredAreaにドロップされた場合、別のアクションが開始されます。

私は基本的に、ドロップされているものとドロップされている場所を知りたいです。ビューがレイアウト上にあるときに検出できるように、ImageViewsとLinearLayoutsを「タグ付け」するにはどうすればよいですか?どうしたらいいですか?

これまでに私が思いついたのはこれです。

// R.drawable.blue is the ImageView. 
// R.id.blue is the LinearLayout. 

public View blue = findViewById(R.drawable.blue); 
findViewById(R.id.blue).setOnTouchListener(new TouchListener()); 

findViewById(R.id.blueArea).setOnDragListener(new DragListener()); 
findViewById(R.id.redArea).setOnDragListener(new DragListener()); 
findViewById(R.id.spawn).setOnDragListener(new DragListener()); 

ClipData data = ClipData.newPlainText("", ""); 
DragShadowBuilder shadowBuilder; 
private final class TouchListener implements OnTouchListener { 
    public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getAction(); 
     if (action == MotionEvent.ACTION_DOWN) { 
      shadowBuilder = new View.DragShadowBuilder(v); 
      v.startDrag(data, shadowBuilder, v, 0); 
      v.setVisibility(View.INVISIBLE); 
      } 
     return true; 
     } 
    } 

boolean containsDraggable = true; 
class DragListener implements OnDragListener { 
public boolean onDrag(View v, DragEvent event) { 
    int action = event.getAction(); 
    View view = (View) event.getLocalState(); 
    if (action == DragEvent.ACTION_DRAG_STARTED) { 
     } 
    if (action == DragEvent.ACTION_DRAG_ENTERED) { 
     containsDraggable = true; 
     } 
    if (action == DragEvent.ACTION_DRAG_EXITED) { 
     containsDraggable = false; 
     } 
    if (action == DragEvent.ACTION_DRAG_LOCATION) { 
     // TODO 
     } 
    if (action == DragEvent.ACTION_DRAG_ENDED) { 
     if (dropEventNotHandled(event)) { 
      view.setVisibility(View.VISIBLE); 
      } 
     } 
    if (action == DragEvent.ACTION_DROP && containsDraggable) { 
     view.setVisibility(View.VISIBLE); 
     releaseTrue(); 
     } 
    return true; 
    } 
} 
private boolean dropEventNotHandled(DragEvent event) { 
    return !event.getResult(); 
    } 
    public void releaseTrue() { 
     score++; 
     textScore.setText(String.valueOf(score)); 
    } 
    public void releaseFalse() { 
     score--; 
     textScore.setText(String.valueOf(score)); 
    } 
+0

何をsetTag()メソッドを使用して、すべてのオブジェクトのタグを指定して、特定のオブジェクトのLayoutParamsに移動が行われるたびにアクセスした場合、その後、あなたはAction_Upに、たとえば、これらの属性を比較することができ、もし彼らは十分に近い(幅、高さ、マージン)、おそらく彼らはお互いにあります。これはおそらく最良の解決策ではありませんが、それはうまくいくはずです –

答えて

2

あなたは

public boolean onDrag(View v, DragEvent event) { 

は、上記の3つのビュー(すなわちビューV)と呼ばれる3つのすべてのビューのための

.setOnDragListener(new DragListener()); 

を追加しているので、

ので、あなたが持つことができます異なる動作をしたい場合はswitch文を使用します。

switch(v.getId()){ 
case R.id.blueArea: 
//action for blue.. 
break 
} 
+0

これはレイアウトごとにそれぞれのケースを設定しますが、今は何がドロップされているかを調べる必要があります。私のビューからClipDataをどのように渡すのですか? – Kurty

+0

ビューv = event.getLocalState();ドラッグした(v.startDrag(data、shadowBuilder、v、0);)ビューを表示します。 –

関連する問題