1

我有 4 个垂直堆叠的水平滚动视图,它们占据了整个屏幕。我希望能够检测到屏幕上任意位置的垂直向下滑动,并在发生这种情况时执行特定功能。我在具有 onTouchListener 的屏幕上放置了一个空布局,我通过计算开始 Y 位置和结束 Y 位置来检测向下滑动,如果它是一定距离,我调用该函数。

问题在于视图如何使用触摸事件。我似乎只能检测到垂直滑动事件,或者我可以滚动水平滚动视图,但我找不到允许我检测两者的解决方案(即,如果我向下滑动,请注册,否则,让水平滚动视图向左移动/正确的)。

我应该注意,水平滚动视图是自定义的,并且它们自己包含自己的 ontouchlisteners,但这并不重要,因为问题是将触摸事件从空布局传递到滚动视图,只要运动不是向下滑动. (请注意,我不想在 ACTION_UP 上进行计算;如果用户在屏幕上向下移动时手指向下,即使他们没有抬起手指,也应该调用该动作)

这是我用来检测空布局上的触摸的提取代码(就像现在一样,它没有检测到向下滑动......但滚动视图移动。如果我将最后一个返回语句更改为 true,我可以检测到向下滑动,但滚动视图不会向左/向右移动。我认为必须有某种方式允许两者?)谢谢你的帮助!:

     touchArea.setOnTouchListener(new OnTouchListener()
     {
        float startY;
        float startX;

        public boolean onTouch(View v, MotionEvent event)
        {

            Log.d(TAG, "in onTouch");

            switch (event.getAction()) 
            {
                case MotionEvent.ACTION_DOWN:
                    startX = event.getX();
                    startY = event.getY();

                    Log.d(TAG, "action down");
                    Log.d(TAG, "start x is: " + startX + " startY is: " + startY);

                case MotionEvent.ACTION_MOVE:

                    Log.d(TAG, "action move");

                    if(event.getY() - startY > MIN_SWIPE_DISTANCE)
                    {
                        Log.d(TAG, "swipe down");

                        //EXECUTE FUNCTION HERE

                        return true;

                    }
                    else
                    {
                        return false;
                    }

                case MotionEvent.ACTION_UP:

                    Log.d(TAG, "ACTION UP");

                    break;

                case MotionEvent.ACTION_CANCEL:

                    Log.d(TAG, "ACTION CANCEL");
                    break;

                default:

                    Log.d(TAG, "unknown touch event");
                    break;

            }

            return false;
        }

    });
4

0 回答 0