2016年5月10日 星期二

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);

  © Blogger templates Psi by Ourblogtemplates.com 2008

Back to TOP