Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ImageView在拖动时消失_Android_Drag And Drop - Fatal编程技术网

Android ImageView在拖动时消失

Android ImageView在拖动时消失,android,drag-and-drop,Android,Drag And Drop,我想将我的ImageView拖动到我的RelativeLayout中的任何位置。当我尝试拖动ImageView时,它可以工作,但当我从屏幕上松开手指时,它就消失了。我找不到错误在哪里 以下是我的代码结构: 仅长按Listener查看图像 imageView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) {

我想将我的
ImageView
拖动到我的
RelativeLayout
中的任何位置。当我尝试拖动
ImageView
时,它可以工作,但当我从屏幕上松开手指时,它就消失了。我找不到错误在哪里

以下是我的代码结构:

仅长按Listener查看图像

imageView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            ClipData.Item item = new ClipData.Item((CharSequence)v.getTag());
            String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};

            ClipData dragData = new ClipData(v.getTag().toString(),mimeTypes, item);
            View.DragShadowBuilder myShadow = new View.DragShadowBuilder(imageView);

            v.startDrag(dragData,myShadow,null,0);
            v.setVisibility(View.GONE);
            return true;
        }
    });
DragListener方法

        imageView.setOnDragListener(new View.OnDragListener() {

        @Override
        public boolean onDrag(View v, DragEvent event) {
            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_STARTED:

                     layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); //layoutParams is defined on Top.
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED");

                   break;

                case DragEvent.ACTION_DRAG_ENTERED:
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED");
                    int x_cord = (int) event.getX();
                    int y_cord = (int) event.getY();
                    Log.d(msg,"Drag Location Entered "+x_cord+" Ycord "+y_cord);

                    break;


                case DragEvent.ACTION_DRAG_EXITED:
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED");
                    x_cord = (int) event.getX();
                    y_cord = (int) event.getY();
                    Log.d(msg, "Drag Exited xcord " + x_cord + " Ycord " + y_cord);


                    layoutParams.leftMargin = x_cord;
                    layoutParams.topMargin = y_cord;

                    v.setLayoutParams(layoutParams);
                    Log.d(msg, "layoutparams set success.");
                        v.setVisibility(View.VISIBLE);
                        Log.d(msg,"Made View Visible");

                    break;

                case DragEvent.ACTION_DRAG_LOCATION:
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION");
                    x_cord = (int) event.getX();
                    y_cord = (int) event.getY();
                    Log.d(msg,"Drag Location xcord "+x_cord+" Ycord "+y_cord);
                    break;


                case DragEvent.ACTION_DRAG_ENDED:
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENDED");
                    break;

                case DragEvent.ACTION_DROP:
                    Log.d(msg, "ACTION_DROP event");


                    break;
                default:
                    break;
            }
            return true;
        }
    });
        imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(imageView);
                imageView.startDrag(data, shadowBuilder, imageView, 0);
                return true;
            }
            else
            {
                return false;
            }
        }
    });
OnTouchListener方法

        imageView.setOnDragListener(new View.OnDragListener() {

        @Override
        public boolean onDrag(View v, DragEvent event) {
            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_STARTED:

                     layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); //layoutParams is defined on Top.
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED");

                   break;

                case DragEvent.ACTION_DRAG_ENTERED:
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED");
                    int x_cord = (int) event.getX();
                    int y_cord = (int) event.getY();
                    Log.d(msg,"Drag Location Entered "+x_cord+" Ycord "+y_cord);

                    break;


                case DragEvent.ACTION_DRAG_EXITED:
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED");
                    x_cord = (int) event.getX();
                    y_cord = (int) event.getY();
                    Log.d(msg, "Drag Exited xcord " + x_cord + " Ycord " + y_cord);


                    layoutParams.leftMargin = x_cord;
                    layoutParams.topMargin = y_cord;

                    v.setLayoutParams(layoutParams);
                    Log.d(msg, "layoutparams set success.");
                        v.setVisibility(View.VISIBLE);
                        Log.d(msg,"Made View Visible");

                    break;

                case DragEvent.ACTION_DRAG_LOCATION:
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION");
                    x_cord = (int) event.getX();
                    y_cord = (int) event.getY();
                    Log.d(msg,"Drag Location xcord "+x_cord+" Ycord "+y_cord);
                    break;


                case DragEvent.ACTION_DRAG_ENDED:
                    Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENDED");
                    break;

                case DragEvent.ACTION_DROP:
                    Log.d(msg, "ACTION_DROP event");


                    break;
                default:
                    break;
            }
            return true;
        }
    });
        imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(imageView);
                imageView.startDrag(data, shadowBuilder, imageView, 0);
                return true;
            }
            else
            {
                return false;
            }
        }
    });

我怀疑你把整件事都搞错了。在底线中,您看不到
ImageView
,因为您调用了:

v.setVisibility(View.GONE);
 case DragEvent.ACTION_DRAG_ENDED:
        case DragEvent.ACTION_DRAG_ENDED:
        v.setVisibility(View.VISIBLE);
        break;
在您的
OnCLickListener
中,您永远不会更改它

问题是,您将
DragListener
分配给布局中的任何
视图
,您希望得到有关
DragEvents
的通知,但无论如何都会发生拖动,即使您不会通过调用
startDrag()将任何侦听器分配给任何
视图
系统开始使用
ShadowBuilder
进行拖动

总之,如果拖动一个
视图
,通常会将
DragListener
指定给布局中的其他
视图
,即您悬停在其上方的视图。你似乎认为通过打电话:

v.setLayoutParams(layoutParams);
这就是导致
视图
跟随您的手指,而实际上是呼叫的原因:

v.startDrag()
是什么对它负责

无论如何,如果你打电话:

v.setVisibility(View.GONE);
 case DragEvent.ACTION_DRAG_ENDED:
        case DragEvent.ACTION_DRAG_ENDED:
        v.setVisibility(View.VISIBLE);
        break;

您应该可以看到
ImageView
的背面。

一个技巧是对屏幕背景色的图像应用颜色过滤器(按照链接:)并注释
v.setVisibility(View.GONE)行在onLongClickListener中