【问题标题】:How to get the current Y offset of a ScrollView如何获取 ScrollView 的当前 Y 偏移量
【发布时间】:2019-06-25 00:14:28
【问题描述】:

ScrollView 有设置 x 和 y 滚动偏移的方法,但没有获取当前偏移的方法(我真正感兴趣的是 y 偏移,因为 ScrollView 只支持垂直滚动)。我没有看到任何可以在超类中使用的方法,并尝试了 getTop() 用于内容视图,它始终为零。我错过了什么吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    在 ScrollView 上调用 getScrollY()

    查看文档:http://developer.android.com/reference/android/view/View.html#getScrollY%28%29

    【讨论】:

    • 我想知道我的滚动视图是否包裹了一个带有周期性增加内容的 textView(如日志视图)是否显示了最后一行文本。做到了:boolean lastLineVisible = scrollView.getScrollY() + scrollView.getHeight() + 100 >= textView.getHeight()
    【解决方案2】:

    你为什么不尝试这样的事情呢?

    targetScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {
                int scrollX = targetScrollView.getScrollX();
                Log.d(TAG, "scrollX: " + scrollX);
            }
        });
    

    【讨论】:

    • অস্থির সল্যুশন,惊人的解决方案....谢谢,我喜欢你的解决方案。经过 6 年的 Android 应用开发,我终于找到了解决方案。
    【解决方案3】:

    如果您确定在使用 getScrollY() 或 getTop() 后应该得到一些值,请尝试将这些方法放入 a

    yourScroolView.post(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getApplicationContext(),"Current Y is : "+getScrollY,Toast.LENGTH_SHORT).show();
                }
            });
    

    现在应该可以了。根据我对这种方法的理解,它只会在布局被绘制后运行。这可能是您之前一直获得 0 的原因之一。希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 这些方法受到保护,因此只有在继承 ScrollView 时才能访问。
      • 谢谢,克里斯蒂安,您的解决方案对我有帮助。我已经有一个来自 ScrollView 的子类视图。它应该使用侦听器 setOnScrollViewListener (nicholasmelnick.com/entries/104) 来计算。使用 getScrollY() 的第一个解决方案也可以正常工作。
      【解决方案5】:

      我通过以下方式实现。首先获取屏幕高度和宽度。

      DisplayMetrics metrics = getResources().getDisplayMetrics();
      float screenWidth = metrics.widthPixels;
      float screenHeight = metrics.heightPixels;
      

      然后找出文档高度(总,显示的内容以及屏幕外的内容)

      public float getDocumentHeight(){
          return (computeVerticalScrollRange() * screenHeight)/computeVerticalScrollExtent();
      }
      

      终于得到了偏移量

      public float getTopY(){
          return (getDocumentHeight() * computeVerticalScrollOffset())/computeVerticalScrollRange();
      }
      

      这为您提供了相对于您正在查看的文档部分的窗口顶部,以便您可以找到事件的确切位置

      public boolean onTouchEvent(MotionEvent event) {
            int y = event.getY() + (int) getTopY();
          }
      

      你也可以做类似的事情来处理宽度

      【讨论】:

        猜你喜欢
        • 2018-11-11
        • 2015-02-14
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 2020-07-03
        • 2014-07-27
        • 2023-03-22
        相关资源
        最近更新 更多