2016年5月8日 星期日

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

  © Blogger templates Psi by Ourblogtemplates.com 2008

Back to TOP