从其他视图拖动时检测视图上的触摸事件

dca*_*121 19 android ontouchlistener android-view

如果用户触摸视图A并在视图B上拖动到底部,如何检测触摸事件.我想在视图B中检测触摸事件.

我在视图B中添加了触摸侦听器,但如果用户最初触摸A并拖过B,则不会接收事件.

在此输入图像描述

Lui*_*uis 62

您可以使用下面的代码来实现您的请求:

测试视图边界的方法(用于代码beloow)

    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);
    }
Run Code Online (Sandbox Code Playgroud)

用两个测试 TextView

    final TextView viewA = (TextView)  findViewById(R.id.textView);
    final TextView viewB = (TextView)  findViewById(R.id.textView2);
Run Code Online (Sandbox Code Playgroud)

设置视图A.

空白OnClickListener是必须保持OnTouchListener活跃,直到ACTION_UP

    viewA.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {}
    });

    viewA.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int x = (int)event.getRawX();
            int y = (int)event.getRawY();
            if(event.getAction() == MotionEvent.ACTION_UP){
                if(isViewInBounds(viewB, x, y))
                    viewB.dispatchTouchEvent(event);
                else if(isViewInBounds(viewA, x, y)){
                    Log.d(TAG, "onTouch ViewA");
                    //Here goes code to execute on onTouch ViewA
                }
            }
            // Further touch is not handled
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

设置视图B.

仅当您还要按viewB并拖动到viewA时,才需要这样做

    viewB.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {}
    });

    viewB.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int x = (int)event.getRawX();
            int y = (int)event.getRawY();
            if(event.getAction() == MotionEvent.ACTION_UP){
                if(isViewInBounds(viewA, x, y))
                    viewA.dispatchTouchEvent(event);
                else if(isViewInBounds(viewB, x, y)){
                    Log.d(TAG, "onTouch ViewB");
                    //Here goes code to execute on onTouch ViewB
                }
            }
            // Further touch is not handled
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

问候.