3

メイン レイアウトにオブジェクトをドラッグするドラッグ アンド ドロップ アプリケーションを作成しています。私の問題は、画像ビューの無制限/無限のコピーが必要なため、画像をできるだけ多くドラッグできるようにすることです。

たとえば、ハート型の場合、既に画像をドラッグすると、レイアウトに画像 (ハート) が 1 つしかないため、別のハート型を持つことはできません。

ここに画像の説明を入力

これは、imageViews(スター、ハート、ライトニング)に触れる私のコードです:

private final class MyTouchListener implements OnTouchListener {

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

    }

これは、ドロップ ゾーン/メイン イメージのドラッグ リスナーです。

class MyDragListener implements OnDragListener {
    @Override
      public boolean onDrag(View v, DragEvent event) {
        int action = event.getAction();
        final int X = (int) event.getX();
        final int Y = (int) event.getY();

        switch (event.getAction()) {
        case DragEvent.ACTION_DRAG_STARTED:
        // do nothing
          break;
        case DragEvent.ACTION_DRAG_ENTERED:
          break;
        case DragEvent.ACTION_DRAG_EXITED:        
          break;
        case DragEvent.ACTION_DROP:
          // Dropped, reassign View to ViewGroup
          View view = (View) event.getLocalState();
          ViewGroup owner = (ViewGroup) view.getParent();
          owner.removeView(view);
          RelativeLayout container = (RelativeLayout) v;

          RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(30, 30);
           params1.leftMargin = (int) event.getX() - 15;
           params1.topMargin = (int) event.getY() -15;

          container.addView(view,params1);
          view.setVisibility(View.VISIBLE);
          break;
        case DragEvent.ACTION_DRAG_ENDED:
          default:
          break;
        }
        return true;
      }
  }
4

1 に答える 1

2

あなたのケースでのドラッグアンドドロップは、キャンバスで開発する方がはるかに簡単です。

View を拡張するクラスを作成し、内部に画像を描画する rect を作成し、そのビューに setOntouch を設定し、rect にタッチを追従させ、invalidate() を使用してビューを強制的に再描画します。

編集 キャンバスを使用する場合、余白やレイアウトパラメーターに頭を悩ませることはありません。単純です。

DragDropView.java

public class DragDropView extends View implements OnTouchListener  {
    Rect originalRect , draggableRect;
    int left, right, top, bottom, newX, newY, size;
    Drawable originalDrawable,draggableDrawable;

    public DragDropView(Context context)
    {
        super(context, null);
        size = 20;
        originalRect= new Rect();
        originalRect.set(200, 200, 240, 240); //left , top , right , bottom
        draggableRect= new Rect();
        draggableRect.set(200, 200, 240, 240);
        originalDrawable = getResources().getDrawable(R.drawable.ic_launcher);
        draggableDrawable = getResources().getDrawable(R.drawable.ic_launcher);
        originalDrawable.setBounds(originalRect); // since it wont move no need to do that in onDraw()
        newX = 220;
        newY=220;
        this.setOnTouchListener(this);
    }
    public DragDropView(Context context, AttributeSet attrs)
    {    super(context, attrs);    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        originalDrawable.draw(canvas);
        draggableRect.set(newX-size, newY-size, newX+size, newY+size);
        draggableDrawable.setBounds(draggableRect);
        draggableDrawable.draw(canvas);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        newX = (int)event.getX();
        newY = (int)event.getY();
        invalidate(); // force redraw

        //if you need special touch events
//      //on touch down
//      if( event.getAction() == MotionEvent.ACTION_DOWN )
//      {   }
//      //on touch move
//      if( event.getAction() == MotionEvent.ACTION_MOVE )
//      {   }
//      //on touch up
//      if( event.getAction() == MotionEvent.ACTION_UP )
//      {   }

        return true; // always return true to let touch listener listen to next touch
    }
}

YourActivity.java

DragDropView dragDropView = new DragDropView();
于 2013-10-29T14:36:11.577 に答える