Android 如何获取滚动视图的当前Y偏移量
ScrollView有一个设置x和y滚动偏移的方法,但没有获取当前偏移的方法(我真正感兴趣的是y偏移,因为ScrollView只支持垂直滚动)。我看不到任何方法可以在超类中工作,并尝试对内容视图使用getTop(),该视图始终为零。我遗漏了什么吗?关于:和。在ScrollView上调用Android 如何获取滚动视图的当前Y偏移量,android,Android,ScrollView有一个设置x和y滚动偏移的方法,但没有获取当前偏移的方法(我真正感兴趣的是y偏移,因为ScrollView只支持垂直滚动)。我看不到任何方法可以在超类中工作,并尝试对内容视图使用getTop(),该视图始终为零。我遗漏了什么吗?关于:和。在ScrollView上调用getScrollY() 有关文档,请参见此处:如果您确定在使用getScrollY()或getTop()后应该获得一些值,请尝试将这些方法放在 yourScroolView.post(new Runnable()
getScrollY()
有关文档,请参见此处:如果您确定在使用getScrollY()或getTop()后应该获得一些值,请尝试将这些方法放在
yourScroolView.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"Current Y is : "+getScrollY,Toast.LENGTH_SHORT).show();
}
});
现在应该可以了。根据我对这个方法的理解,它只会在绘制布局之后运行。这可能是您以前一直获得0的原因之一。希望能有所帮助。我通过以下几点实现了目标。首先得到屏幕的高度和宽度
DisplayMetrics metrics = getResources().getDisplayMetrics();
float screenWidth = metrics.widthPixels;
float screenHeight = metrics.heightPixels;
然后找出文档高度(总数、显示内容和屏幕外内容)
最后得到偏移量
public float getTopY(){
return (getDocumentHeight() * computeVerticalScrollOffset())/computeVerticalScrollRange();
}
这将为您提供相对于所看到文档部分的窗口顶部,以便您可以通过以下方式找到事件的确切位置:
public boolean onTouchEvent(MotionEvent event) {
int y = event.getY() + (int) getTopY();
}
您也可以做一些类似于处理宽度的操作为什么不试试这样的操作
targetScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
int scrollX = targetScrollView.getScrollX();
Log.d(TAG, "scrollX: " + scrollX);
}
});
这些方法是受保护的,因此只有在您对ScrollView进行子类化时才可以访问。谢谢,克里斯蒂安,您的解决方案帮助了我。我已经从ScrollView中获得了一个子类视图。应该使用侦听器setOnScrollViewListener()计算它。还有一个使用getScrollY()的第一个解决方案是正确的。我想知道我的scrollView是否在使用周期性增加的内容(如日志视图)包装textView时显示了最后一行文本。这就做到了:boolean lastLineVisible=scrollView.getScrollY()+scrollView.getHeight()+100>=textView.getHeight()
অস্থির সল্যুশন, 惊人的解决方案。。。。谢谢,我喜欢你的解决方案。经过6年的Android应用开发,我终于找到了解决方案。
targetScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
int scrollX = targetScrollView.getScrollX();
Log.d(TAG, "scrollX: " + scrollX);
}
});