Android TextView layout 的一些有用的函數
以下是我的app中用到的一段程式碼片段, 因為用到textview 的 layout, 記錄一些有用的方法
getScrollSpot()是從目前Scroll的位置(Y座標), 計算出在那一行, 並傳回該行第一個字符在textview內的偏移位置
setScrollSpot()則相反, 從字符在textview內的偏移位置, 反推目前Scroll的位置(Y座標)
以上兩個我自己寫的函數, 用來記錄手機在rotation前的位置, 在rotation之後再scroll到該位置
float getScrollSpot() {
int y = sv.getScrollY();
Layout layout = tvDoc.getLayout();
if (layout == null)
return 0;
int topPadding = -layout.getTopPadding();
if (y <= topPadding) {
return (float) (topPadding - y) / tvDoc.getLineHeight();
}
//getLineForVertical 從Y座標取得目前的行數
int line = layout.getLineForVertical(y - 1) + 1;
//getLineStart(line)從目前的行數取得此行第一個字符在textview內所有字串中從頭開始的偏移位置
//getLineEnd(line)從目前的行數取得此行最後一個字符在textview內所有字串中從頭開始的偏移位置
int offset = layout.getLineStart(line);
//getLineTop取得此行上緣所在的Y座標
int above = layout.getLineTop(line) - y;//above好像不需要
return offset + (float) above / tvDoc.getLineHeight();
//(float) above / tvDoc.getLineHeight();看不懂不知當時為何這樣寫
}
void setScrollSpot(float spot) {
int offset = (int) spot;
int above = (int) ((spot - offset) * tvDoc.getLineHeight());
Layout layout = tvDoc.getLayout();
if (layout == null) {
return;
}
//從字符在textview內所有字串中從頭開始的偏移位置,計算出目前的行數
int line = layout.getLineForOffset(offset);
//再由行數計算y座標
int y = (line == 0 ? -layout.getTopPadding() : layout.getLineTop(line))
- above;
//捲到到該位置
sv.scrollTo(0, y);
}