Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.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 检查拖动的视图是否在另一个视图的范围内_Android - Fatal编程技术网

Android 检查拖动的视图是否在另一个视图的范围内

Android 检查拖动的视图是否在另一个视图的范围内,android,Android,我正在尝试创建一个类似于Facebook的messenger应用程序的浮动布局,该应用程序具有删除视图,当拖动到该视图时,该视图会被删除。它将删除聊天泡泡 但我的问题是,我似乎无法检测我的气泡布局是否在删除视图的范围内 提前感谢您的建议或帮助!:D 这是我的活动: private WindowManager mWindowManager; private View FloatingView, DeleteView; @Override public void onCreate() {

我正在尝试创建一个类似于Facebook的messenger应用程序的浮动布局,该应用程序具有删除视图,当拖动到该视图时,该视图会被删除。它将删除聊天泡泡

但我的问题是,我似乎无法检测我的气泡布局是否在删除视图的范围内

提前感谢您的建议或帮助!:D

这是我的活动:

private WindowManager mWindowManager;
private View FloatingView, DeleteView;

@Override
public void onCreate() {
    super.onCreate();

    mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    Display display = mWindowManager.getDefaultDisplay();
    final Point size = new Point();
    display.getSize(size);
    final float dpWidth = size.x;
    final float dpHeight = size.y;

    FloatingView = LayoutInflater.from(this).inflate(R.layout.layout_floating_widget, null);
    DeleteView = LayoutInflater.from(this).inflate(R.layout.layout_delete, null);

    WindowManager.LayoutParams paramss = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT);
    mWindowManager.addView(DeleteView, paramss);


    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);
    mWindowManager.addView(FloatingView, params);


        FloatingView.setOnTouchListener(new View.OnTouchListener() {
        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    initialX = params.x;
                    initialY = params.y;
                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();
                    return true;

                case MotionEvent.ACTION_MOVE:
                    DeleteView.setVisibility(View.VISIBLE);

                    params.x = initialX + (int) (event.getRawX() - initialTouchX);
                    params.y = initialY + (int) (event.getRawY() - initialTouchY);
                    mWindowManager.updateViewLayout(FloatingView, params);
                    return true;


                case MotionEvent.ACTION_UP:
                    DeleteView.setVisibility(View.INVISIBLE);

                //THIS IS WHAT I HAVE DONE SO FAR FOR THE BOUNDS DETECTION
                    if (event.getRawY() >= DeleteView.getHeight()) {
                        Toast.makeText(FloatingViewService.this, "WITHIN DELETE VIEW", Toast.LENGTH_SHORT).show();

                        if (FloatingView != null) mWindowManager.removeView(FloatingView);
                    }
                    return true;
            }
            return false;
        }
    });
}
试试这个:

Rect outRect = new Rect();
int[] location = new int[2];
添加此方法

  private boolean isViewInBounds(View view, int x, int y){
    view.getDrawingRect(outRect);
    view.getLocationOnScreen(location);
    outRect.offset(location[0], location[1]);
    return outRect.contains(x, y);
}
并将此添加到您的操作中

  case MotionEvent.ACTION_UP:
                    DeleteView.setVisibility(View.INVISIBLE);

                    if(isViewInBounds(DeleteView, x, y)){
                        DeleteView.dispatchTouchEvent(event);
                        Toast.makeText(FloatingViewService.this, "WITHIN", Toast.LENGTH_SHORT).show();
                    }
                    return true;