【问题标题】:How to ignore overlying views and detect onFling (onSwipe)?如何忽略重叠视图并检测 onFling (onSwipe)?
【发布时间】:2017-10-04 12:47:18
【问题描述】:

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

我尝试将 onSwipeListener 添加到主布局并将 GestureListener 添加到整个 Activity 都同样成功。

我当前(无效)的解决方案如下:

 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 处于顶部没有子视图的状态,则它按预期工作。

所以问题是:我可以做些什么来让活动获取手势忽略覆盖视图?

【问题讨论】:

    标签: android swipe gesture-recognition onfling


    【解决方案1】:

    问题是子视图获取触摸事件而不是将其提供给父视图。 如果您没有使用覆盖视图可点击事件,您可以关闭该视图可点击属性,如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

    【讨论】:

    • 在 ViewGroup 中拦截触摸事件是我所需要的。谢谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多