简体   繁体   English

限制用户将视图拖出android拖放中的布局

[英]Restrict user to drag view out of the layout in android drag drop

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 xy in entry boxes while the view is dragging on the on drag listener layout 我有一个OnDragListener我通过Onlongclick视图在这个监听器上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;
}

dont want to be placed out of layout like this 不希望被放置在这样的布局之外

在此输入图像描述

I want user to place views full inside the layout like this 我希望用户像这样在布局中完整地放置视图

在此输入图像描述

        RelativeLayout container = (RelativeLayout) v;

Check if X drag Point and view length add up more than drag container length. 检查X拖动点和视图长度是否超过拖动容器长度。 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. 如果是,则从拖动容器宽度中减去视图宽度以获得X点,这将限制某些零件视图以放置在拖动容器之外。 Otherwise, Drag X point should be enough to place view inside drag container. 否则,拖动X点应足以在拖动容器内放置视图。

            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. 对于使用两个视图的高度数据的Y约束也是如此。

            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. 您可以根据您的要求设置其他条件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM