Ограничить пользователя перетаскивать вид из макета в Android Drop Drop - PullRequest
0 голосов
/ 17 июня 2019

У меня есть один OnDragListener Я отбрасываю представления на этом слушателе с помощью Onlongclick представлений, но проблема, которую я пытаюсь решить, заключается в том, что я хочу ограничить представление, которое будет размещено вне представления макета, его нельзя разместить даженемного снаружи в макете для различных параметров видов (с точки зрения разной длины и ширины перетаскиваемого объекта) также пытаюсь получить местоположение текущих изменяющихся координат времени выполнения xy в полях ввода, в то время как вид перетаскивается при перетаскиваниимакет слушателя

@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;
}

не хочу, чтобы его размещали вне макета, как это

enter image description here

Я хочу, чтобы пользователь размещал представления полностью внутри макета, как это

enter image description here

1 Ответ

0 голосов
/ 17 июня 2019
        RelativeLayout container = (RelativeLayout) v;

Убедитесь, что перетаскивание X Точка и длина вида больше, чем длина контейнера перетаскивания. Если да, просто вычтите ширину вида из ширины контейнера перетаскивания, чтобы получить точку X, которая будет ограничивать некоторый вид детали для размещения вне контейнера перетаскивания. В противном случае точки перетаскивания X должно быть достаточно для размещения вида внутри контейнера перетаскивания.

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

То же самое для ограничения Y с использованием данных о высоте обоих видов.

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

        container.addView(vw);

Вы можете установить другое условие согласно вашему требованию.

...