2

こんばんは

次のように、ドラッグ可能なビューで onTouchListener を使用し、ドラッグ ゾーン ビューで onDragListener を使用して、ドラッグ アンド ドロップを実装しようとしています。

これが MyDragListener です。

class MyDragListener implements OnDragListener {
  Drawable enterShape = getResources().getDrawable(R.drawable.ic_launcher);
  Drawable normalShape = getResources().getDrawable(R.drawable.ic_launcher);

  @Override
  public boolean onDrag(View v, DragEvent event) {
    int action = event.getAction();
    switch (event.getAction()) {

    /*Some irrelevant cases*/

    case DragEvent.ACTION_DROP:
      // Dropped, reassign View to ViewGroup
        View view = (View) event.getLocalState();
        ViewGroup owner = (ViewGroup) view.getParent();
        owner.removeView(view);
        FrameLayout container;
        container = (FrameLayout) v;
    container.addView(view);
    view.setX(event.getX());
    view.setY(event.getY()); 
        view.setVisibility(View.VISIBLE);
      break;
      default:
      break;
    }
    return true;
  }
}

そして、このリスナーを私の例ではframeLayoutであるドラッグゾーンに次のように割り当てています:

 FrameLayout f= (FrameLayout) findViewById(id.FrameLayout);

    f.setOnDragListener(new MyDragListener());

レイアウトは次のとおりです。

<FrameLayout 
android:id="@+id/FrameLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0.8">

<ImageView
    android:contentDescription="This is the main panel of the program"
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/blank" 
    android:isScrollContainer="true"
    />
<Button 
    android:id="@+id/DraggableButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Drag me -_-"
    />

問題は、生の X、Y 座標しか取得できず、正確な結果が得られなかったことです....

これをonTouchListenerで処理しようとしました(そしてDragListenerにipを与えました)。これにより、コンテナの座標が得られ、ドラッグ中に正確な結果が得られましたが、ビューをドロップすると消えました。MyTouchListener コードは次のとおりです。

private final class MyTouchListener implements OnTouchListener {
    @Override
      public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
          ClipData data = ClipData.newPlainText("", "");
          DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
          view.startDrag(data, shadowBuilder, view, 0);
          view.setVisibility(View.INVISIBLE);
          return true;
        } 
        else 
            if(motionEvent.getAction()==MotionEvent.ACTION_UP)
            {
                    // View view = (View) motionEvent.getLocalState();

                    view.setX(motionEvent.getX());
                    view.setY(motionEvent.getY());


                  view.setVisibility(View.VISIBLE);
               return true;
                }
        return false;


      }
    }

誰か私が何をすべきか教えてもらえますか?

4

1 に答える 1

0

次のようなことをしなければなりません:

case DragEvent.ACTION_DROP:
  // Dropped, reassign View to ViewGroup
    View view = (View) event.getLocalState();
    ViewGroup owner = (ViewGroup) view.getParent();
    owner.removeView(view);
    FrameLayout container;
    container = (FrameLayout) v;
    float y = event.getY() - view.getHeight()/2;

    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(view.getWidth(), view.getHeight());
    layoutParams.setMargins(0, (int)y, 0, 0);
    view.setLayoutParams(layoutParams);

    container.addView(view);
    view.setVisibility(View.VISIBLE);
  break;
于 2015-03-29T06:35:58.033 に答える