如何实现检测被拖过另一个视图的视图?

时间:2016-08-28 03:23:30

标签: android drag-and-drop

我希望有一个可拖动的视图,同时能够持续监控到目标"的距离。查看并检测何时拖动可拖动视图在目标视图上。我的想法是获取两个视图的Rect's并使用intersect()来检查它们是否正在触摸。但是我的实现并不顺利 - 有时它检测到错误位置的重叠或者没有检测到重叠的结束。 你能告诉我我做错了什么或者可能导致正确的做法吗? (我不能使用startDrag(),因为它不允许在拖动时监视事件。

onCreate中的代码:

//find UI
myTextView = (TextView) findViewById(R.id.textView);
myImageView = (ImageView) findViewById(R.id.imageView);

//assign touch listener
myTextView.setOnTouchListener(new MyTouchListener());

MyTouchListener的代码:

class MyTouchListener implements View.OnTouchListener {

        //last coordinates
        float lastX;
        float lastY;

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    view.bringToFront();
                    lastX = motionEvent.getRawX();
                    lastY = motionEvent.getRawY();
                }

                case MotionEvent.ACTION_MOVE: {

                    //motion difference
                    float deltaX = motionEvent.getRawX() - lastX;
                    float deltaY = motionEvent.getRawY() - lastY;

                    //set new last coordinates
                    lastX = motionEvent.getRawX();
                    lastY = motionEvent.getRawY();

                    //animate view to new location
                    view.animate().translationXBy(deltaX).translationYBy(deltaY).setDuration(0).start();

                    //get Rects
                    Rect textViewRect = new Rect((int)lastX+myTextView.getLeft(), (int)lastY+myTextView.getTop(), (int)lastX+myTextView.getRight(), (int)lastY+myTextView.getBottom());
                    Rect imageViewRect = new Rect(myImageView.getLeft(), myImageView.getTop(), myImageView.getRight(), myImageView.getBottom());


                    if (imageViewRect.intersect(textViewRect)) {
                        myImageView.setImageDrawable(getResources().getDrawable(android.R.drawable.ic_dialog_info));
                    } else {
                        myImageView.setImageDrawable(getResources().getDrawable(android.R.drawable.ic_delete));
                    }
                }
            }

            return true;
        }
    }

1 个答案:

答案 0 :(得分:0)

动画翻译是不必要的,因为触摸事件应该平滑地移动TextView。只需将新的X,Y坐标分配给TextView,如下所示:

view.setX(view.getX() + deltaX);
view.setY(view.getY() + deltaY);