如何忽略重叠视图并检测 onFling (onSwipe)?

How to ignore overlying views and detect onFling (onSwipe)?

我有很多 Child 的观点。我需要的是对 Swipe 或 Fling 动作做出反应。问题是它只有在我删除所有 Child 时才真正起作用,否则主布局顶部的 Child 视图会阻止我尝试滑动。

我尝试将 onSwipeListener 添加到主布局并将 GestureListener 添加到整个布局 activity 都取得了同样的成功。

我当前的 (non-working) 解决方案如下:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_schedule);

        main_layout = findViewById(R.id.schedule_main_view);
        Animation fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade);
        main_layout.startAnimation(fadeInAnimation);

        GestureDetector.SimpleOnGestureListener simpleOnGestureListener =
                new GestureDetector.SimpleOnGestureListener() {
                    @Override
                    public boolean onDown(MotionEvent event) {
                        return true;
                    }

                    @Override
                    public boolean onFling(MotionEvent event1, MotionEvent event2,
                                           float velocityX, float velocityY) {
                        Log.d(null,"Fling");
                        int dx = (int) (event2.getX() - event1.getX());
                        // don't accept the fling if it's too short
                        // as it may conflict with a button push
                        if (Math.abs(dx) > 20
                                && Math.abs(velocityX) > Math.abs(velocityY)) {
                            if (velocityX > 0) {
                                Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
                                Log.d(DEBUG_TAG, "onFling To Right");
                            } else {
                                Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
                                Log.d(DEBUG_TAG, "onFling To Left");
                            }
                            return true;
                        } else {
                            return false;
                        }
                    }
                };

        shift = getIntent().getIntExtra(WEEK_SHIFT, CURRENT_WEEK);
        mDetector = new GestureDetectorCompat(this,simpleOnGestureListener);
        unDimScreen();
        setupWeek();
    }

重复一遍:如果 activity 处于顶部没有 child 视图的状态,它会按预期工作。

所以问题是:我可以做些什么来使 activity 获取手势而忽略上层视图?

问题是子视图获取触摸事件,但没有将其提供给父视图。 如果您没有在重叠视图上使用可点击事件,您可以关闭该视图可点击 属性 ,如 view.setClickable(false); ... 然后所有点击事件都将进入其父视图。如果它不起作用,您可以像这样在每个重叠视图上定义触摸侦听器:

view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return false;
    }
});

更新: 这是这个问题的另一个(正确的)解决方案:https://developer.android.com/training/gestures/viewgroup.html#delegate

尝试将 android:clickable="true"android:descendantFocusability="blocksDescendants" 设置为要在 xml 文件中滑动的视图。这应该会阻止 children 接收点击事件。