【问题标题】:detect ScrollView vertical scroll direction检测ScrollView垂直滚动方向
【发布时间】:2019-07-22 11:42:29
【问题描述】:

我尝试过使用ObservableScrollViewCustomScrollView

我遇到的问题是 OnScrollChanged 在任何情况下都不会被解雇。 我想检测滚动视图是向下还是向上滚动。 任何帮助表示赞赏。

我也这样尝试过,但没有结果

 mScrollView?.viewTreeObserver?.addOnScrollChangedListener {
            if (viewScrolled < mScrollView?.getScrollY()!!) {
                viewScrolled = mScrollView?.getScrollY()!!
                Log.d("scroll", "scrolling up")
            }
            if (viewScrolled > mScrollView?.getScrollY()!!) {
                viewScrolled = mScrollView?.getScrollY()!!
                Log.d("scroll", "scrolling down")
            }
        }

这个监听器有效,但问题是在这种情况下如何检测上下滚动

 mScrollView?.viewTreeObserver?.addOnScrollChangedListener {}

【问题讨论】:

    标签: android


    【解决方案1】:

    Kotlin 中的每个视图实例都包含对 viewTreeObserver 的引用,因此当您在滚动视图中滚动列表时,您应该调用 addScrollChangedListener() 方法。

    并基于此确定滚动视图。它是 Java 代码,但您可以转换为 Kotlin。

    scrollView.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            int scrollY = rootScrollView.getScrollY(); // For ScrollView
            int scrollX = rootScrollView.getScrollX(); // For HorizontalScrollView
            // DO SOMETHING WITH THE SCROLL COORDINATES
        }
    });
    

    【讨论】:

    • 当我们每次都为 scrollx 得到 0 时如何处理坐标
    【解决方案2】:

    我的建议是在滚动视图上使用GestureDetectorSimpleGestureListener。这将允许您通过setOnTouchListener 添加 GestureDetector。请记住从您添加的侦听器中返回 false,否则您可能会从滚动条中获得一些意外行为(您不想消耗触摸事件,只需监视它们)

    这是您感兴趣的SimpleGestureListener 中方法的签名。这为您提供了 Y 的移动距离,它是正数或负数,表示向下或向上。

    onScroll
    Added in API level 1
    
    public boolean onScroll (MotionEvent e1, 
                    MotionEvent e2, 
                    float distanceX, 
                    float distanceY)
    

    这是用于手势检测的 Android 培训页面:https://developer.android.com/training/gestures/detector

    关于onDown的更多信息和说明:GestureDetector.SimpleOnGestureListener and GestureDetectorCompat don't work. What's wrong with my code?

    更新:

    代码应该类似于以下内容:

    val scrollView = ScrollView(context)
    val gestureListener = object : GestureDetector.SimpleOnGestureListener() {
        override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean {
            // Use distanceY
            return false
        }
    }
    val gestureDetector = GestureDetector(context, gestureListener)
    scrollView.setOnTouchListener { v, event ->
        gestureDetector.onTouchEvent(event)
    }
    

    【讨论】:

    • 你能告诉我如何在 ScrollView 中使用它
    • onScroll 未触发\
    猜你喜欢
    • 1970-01-01
    • 2016-02-18
    • 2020-09-23
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多