0

I have one OnDragListener I drop views on this listener by Onlongclick views but the problem am trying to solve is I want to restrict the view to be placed out of the layout view, it can't be placed even a little outside in the layout for different parameters of views (in terms of different length and breadth of drag able object) also am trying to get the location of current changing run time coordinates x y in entry boxes while the view is dragging on the on drag listener layout

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    final ImageView imgVW = (ImageView) findViewById(R.id.imageView);
    final TextView txtVW = (TextView) findViewById(R.id.textView);





    txtVW.setOnLongClickListener(this);

    imgVW.setOnLongClickListener(this);

    findViewById(R.id.layout3).setOnDragListener(this);




}

@Override
public boolean onDrag(View v, DragEvent event) {

    int action = event.getAction();

    switch (action) {

        case DragEvent.ACTION_DRAG_STARTED:

            if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {

                return true;
            }

            return false;

        case DragEvent.ACTION_DRAG_ENTERED:

            v.invalidate();
            return true;

        case DragEvent.ACTION_DRAG_LOCATION:

            return true;

        case DragEvent.ACTION_DRAG_EXITED:

            v.invalidate();
            return true;

        case DragEvent.ACTION_DROP:

            ClipData.Item item = event.getClipData().getItemAt(0);

            String dragData = item.getText().toString();

            Toast.makeText(this, "Dragged data is " + dragData, Toast.LENGTH_SHORT).show();



            float X=event.getX();
            float Y=event.getY();
            v.invalidate();


            View vw = (View) event.getLocalState();
            ViewGroup owner = (ViewGroup) vw.getParent();
            owner.removeView(vw);

            RelativeLayout container = (RelativeLayout) v;


            vw.setX(X-(vw.getWidth()/2));
            vw.setY(Y-(vw.getHeight()/2));
            container.addView(vw);


            return true;

        case DragEvent.ACTION_DRAG_ENDED:

            v.invalidate();

            if (event.getResult()) {

                Toast.makeText(this, "The drop was handled.", Toast.LENGTH_SHORT).show();

            }

            else
                Toast.makeText(this, "The drop didn't work.", Toast.LENGTH_SHORT).show();

            return true;
        default:
            Log.e("DragDrop Example", "Unknown action type received by OnDragListener.");
            break;
    }

    return true;
}

@Override
public boolean onLongClick(View v) {

    ClipData.Item item = new ClipData.Item((CharSequence) v.getTag());

    String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
    ClipData data = new ClipData(v.getTag().toString(), mimeTypes, item);

    View.DragShadowBuilder dragshadow = new View.DragShadowBuilder(v);

    v.startDrag(data
            , dragshadow
            , v
            , 0
    );



    return true;
}

dont want to be placed out of layout like this

enter image description here

I want user to place views full inside the layout like this

enter image description here

Deˣ
  • 4,191
  • 15
  • 24

1 Answers1

0
        RelativeLayout container = (RelativeLayout) v;

Check if X drag Point and view length add up more than drag container length. If yes just subtract view width from drag container width to get X point which will constraint some part view to get placed outside of drag container. Otherwise, Drag X point should be enough to place view inside drag container.

            if((X+vw.getWidth())>container.getWidth())
              vw.setX(container.getWidth()-vw.getWidth());
            else
              vw.setX(X);

Same for Y constraint using height data of both views.

            if((Y+vw.getHeight())>container.getHeight())
              vw.setY(container.getHeight()-(vw.getHeight());
            else
              vw.setY(Y);

        container.addView(vw);

You can set else condition as per your requirement.

krez
  • 38
  • 6
  • thanks it is working and restricting to place view outside but now view is not place able where exactly I am dropping it..... kindly please elaborate – Rupesh Kumar Jun 18 '19 at 06:56