我有一个全屏的TextView,里面包含着一长串需要滚动查看的Spanned文本。TextView的getLineCount()方法可以获得整个文本块所用的总行数,但我想知道当前屏幕上可见的文本行数。
更好的方法是,有没有办法找出当前屏幕上可见的文本行范围?例如,在视图滚动时,是否可以确定当前可见的是第20到60行的文本?
我有一个全屏的TextView,里面包含着一长串需要滚动查看的Spanned文本。TextView的getLineCount()方法可以获得整个文本块所用的总行数,但我想知道当前屏幕上可见的文本行数。
更好的方法是,有没有办法找出当前屏幕上可见的文本行范围?例如,在视图滚动时,是否可以确定当前可见的是第20到60行的文本?
我找到了答案:
int height = myTextView.getHeight();
int scrollY = myTextView.getScrollY();
Layout layout = myTextView.getLayout();
int firstVisibleLineNumber = layout.getLineForVertical(scrollY);
int lastVisibleLineNumber = layout.getLineForVertical(scrollY+height);
ViewTreeObserver vto = txtViewEx.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewTreeObserver obs = txtViewEx.getViewTreeObserver();
obs.removeOnGlobalLayoutListener(this);
height = txtViewEx.getHeight();
scrollY = txtViewEx.getScrollY();
Layout layout = txtViewEx.getLayout();
firstVisibleLineNumber = layout.getLineForVertical(scrollY);
lastVisibleLineNumber = layout.getLineForVertical(height+scrollY);
}
});