TextView實現分頁功能, 計算每頁可放下幾個字
mString是一個很大的字串, tvDoc是一個TextView, 現在要取其中一段, 字數剛好要能夠放在一個TextView裡, 不能多也不能少. 另外這一段裡面有一個關鍵字, 一定要放在整個頁面的中間的位置.
另外, 因為每個文字的字寬都不一樣, 所以必須先取大約一段文字, 放到TextView裡, 才能測得實際上可放入的字數.
方法如下:
mLength = mString.length();
//sbBe.abl[0]是那個關鍵字的開始位置, 往前後各取500個字
int sPos=Math.max(sbBe.abl[0]-500,0);
//mOffset 預取文字到關鍵字的字距
final int mOffset=Math.min(500,sbBe.abl[0]);
int ePos=Math.min(sPos+1000,mLength-1);
final String preDisplay=mString.substring(sPos,ePos);
//先將預取的文字放入TextView內
tvDoc.setText(preDisplay);
tvDoc.postDelayed(new Runnable() {
@Override
public void run() {
Layout layout = tvDoc.getLayout();
Rect r = new Rect();
tvDoc.getLocalVisibleRect(r);
//TextView的高度
int bottom = r.bottom;
int topOfLastLine = bottom - tvDoc.getPaddingTop() - tvDoc.getPaddingBottom()-tvDoc.getLineHeight();
//maxLines每頁可放入的最大行數
//getLineForVertical由垂直像素計算行數
int maxLines=layout.getLineForVertical(topOfLastLine);
//關鍵字所在行數
int mLine=layout.getLineForOffset(mOffset);
//關鍵字所在行數, 往前推最大行數的一半為開始截取行
int sLine = mLine-maxLines/2-1;
int eLine=mLine+(maxLines-(mLine-sLine));
int sOffset=layout.getLineStart(sLine);
int eOffset=layout.getLineEnd(eLine);
tvDoc.setText(preDisplay.substring(sOffset,eOffset));
}
}, 100);