【问题标题】:Restrict user to drag view out of the layout in android drag drop限制用户在android拖放中将视图拖出布局
【发布时间】:2019-10-31 07:33:27
【问题描述】:

我有一个OnDragListener 我通过Onlongclick 视图在此侦听器上放置视图,但我试图解决的问题是我想限制视图放置在布局视图之外,甚至不能放置视图的不同参数的布局稍微有点外(根据可拖动对象的不同长度和宽度) 当视图在 on drag listener 布局上拖动时,我还试图在输入框中获取当前更改的运行时坐标 x y 的位置

@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

【问题讨论】:

  • @VedprakashWagh,如果你能帮上忙,先生

标签: android layout view drag out


【解决方案1】:
        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);

您可以根据需要设置其他条件。

【讨论】:

  • 感谢它正在工作并限制将视图放置在外面,但现在视图无法放置在我将其丢弃的位置.....请详细说明
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多