将触摸监听器事件绕过布局

时间:2019-06-11 07:13:21

标签: android layout android-linearlayout ontouchlistener

我有一个LinearLayout包含其他一些视图。我已经在其上实现了onTouchListener,我想用用户手势来移动它。但其中包含其他一些视图,这些视图包含点击侦听器。我在这种布局中有一个ImageView和2个按钮,这些视图都有自己的单击侦听器。看看布局。

enter image description here

我只能在用户单击“可用空间”然后开始拖动时移动布局。而我想移动布局,即使用户开始从上方拖动 Imageview,btn1或Btn2。

我知道,因为BTN1,2和ImageView被设置为可单击,这就是为什么它们使用LinearLayout的onTouchListener的原因。这是touchListener的一些代码

@Override
    public boolean onTouch(View mView, MotionEvent event) {
        View view = null;

        if(!(mView instanceof  LinearLayout) && !(mView instanceof RelativeLayout)){

            view = (View)(mView.getParent().getParent().getParent());
        }else{
            view = mView;
        }

        final int X = (int) event.getRawX();
        //final int Y = (int) event.getRawY();
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                _xDelta = X - lParams.leftMargin;

                Log.d("TTP", "X_Delta " + _xDelta + " X " + X + " left margin " + lParams.leftMargin);

                break;
            case MotionEvent.ACTION_UP:
                int notMoved = X - _xDelta;
                if(notMoved == 0){
                    Log.d("TTP", "ACTION UP ");
                    return  false;
                }


                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                break;
            case MotionEvent.ACTION_POINTER_UP:
                Log.d("TTP", "POINTER UP ");
                break;
            case MotionEvent.ACTION_MOVE:
                RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();


                int mTotalMargin = X - _xDelta;

                boolean isMovingRight = mTotalMargin > 0;


                if ((isMovingRight && mTotalMargin < (getScreenWidth() / 2)) || (!isMovingRight && mTotalMargin > (getScreenWidth() / -2))) {

                    layoutParams.leftMargin = mTotalMargin;
                    layoutParams.rightMargin = mTotalMargin * -1;
                    view.setLayoutParams(layoutParams);
                    Log.d("TTP", "Mov X_Delta " + _xDelta + " X " + X + " getScreenWidth " + getScreenWidth() + " TotalMargin " + mTotalMargin + " " + isMovingRight);

                }

                break;

            case MotionEvent.ACTION_CANCEL:
                Log.d("TTP", "CANCEL ");

                return false;
        }

        return true;
    }

**所以我的问题是,无论单击事件如何,如何绕过从BTN1,2和ImageView到LinearLayout的拖动操作。请帮助我,我被困在这里**

0 个答案:

没有答案