在做一個小的電子書程序,要求電子書具有放大縮小的功能,所以肯定的要用到TextView的滾動效果。同樣的還要求TextView在水平方向和垂直方向上都可以滾動。剛做的時候,也是沒有頭緒,后來想到了,TextView有一個ScrollTo或者ScrollBy方法,何不如此一用呢!
1.前期找資料
?????? 因為剛開始,不知道怎么能夠滾動,所以先去網上查找資料,垂直滾動很容易實現,直接使用TextView的
??? setMovementMethod(ScrollingMovementMethod.getInstance());
方法就可以了。可是水平滾動如何實現?晚上說在TextView的前面在套一層HorizontalScrollView,這個我也做了嘗試,效果不佳,因為你有可能要在程序中動態的改變TextView的布局,這樣子程序中就會出錯;在者如果你設定了你的TextView為500px,而你的內容一行要有700px,這時你的內容不會自動的切為兩行;第三,在添加一個HorizontalScrollView感覺很不舒服,起碼界面是這樣。所以綜合這幾點,我放棄了使用這種方法。接著就想到用ScrollTo方法,首先需要聲明的是,采用這種方法,你的程序中是沒有水平和垂直滾動條的,這個你可以自己去優化實現,理論上是絕對可行的。我現在說的是我能保證文本可以水平和垂直滾動,但沒有保證有滾動條。好,接下來,King就以一個實例做一下簡單的使用。
2.我的實現。(里面注釋很詳細,就不過多說了)
3.后續
??? 我的文件是jinju.txt,是放在assets文件夾下面的,當然你可以放在其他的位置,指定你自己的路徑就可以了,main.xml里面只有一個TextView,所以也沒貼出來,下面看幾張效果圖:
http://hi.baidu.com/ljlkings/blog/item/ffe87e6cc51843cf80cb4a55.html
設置帶滾動條的TextView
本來是想做一個顯示文字信息的,當文字很多時View的高度不能超過一個固定的值,當文字很少時View的高度小于那個固定值時,按View的高度顯示。因為ScrollView沒有maxHeight,無法滿足需求,只好另找方法了。
View本身是可以設置ScrollBar,這樣就不一定需要依賴ScrollView了。TextView有個屬性maxLine,這樣也就滿足了需求了,只要設置一個TextView帶ScrollBar的,然后設置maxLine就可以了。
還需要在代碼了設置TextView可以滾動。
Android中計算一個文件在TextView中的顯示
http://hi.baidu.com/ljlkings/blog/item/47f1afdb8874c9fd39012fdd.html
1.前期找資料
?????? 因為剛開始,不知道怎么能夠滾動,所以先去網上查找資料,垂直滾動很容易實現,直接使用TextView的
??? setMovementMethod(ScrollingMovementMethod.getInstance());
方法就可以了。可是水平滾動如何實現?晚上說在TextView的前面在套一層HorizontalScrollView,這個我也做了嘗試,效果不佳,因為你有可能要在程序中動態的改變TextView的布局,這樣子程序中就會出錯;在者如果你設定了你的TextView為500px,而你的內容一行要有700px,這時你的內容不會自動的切為兩行;第三,在添加一個HorizontalScrollView感覺很不舒服,起碼界面是這樣。所以綜合這幾點,我放棄了使用這種方法。接著就想到用ScrollTo方法,首先需要聲明的是,采用這種方法,你的程序中是沒有水平和垂直滾動條的,這個你可以自己去優化實現,理論上是絕對可行的。我現在說的是我能保證文本可以水平和垂直滾動,但沒有保證有滾動條。好,接下來,King就以一個實例做一下簡單的使用。
2.我的實現。(里面注釋很詳細,就不過多說了)
public class Test_ScrollingText extends Activity implements OnTouchListener,
OnGestureListener { // 實現觸摸和手勢的接口
private TextView mContent;
private DisplayMetrics metrics;
private int mScreenWidth, mScreenHeight;// 屏幕分辨率
private GestureDetector mDetector;// 手勢監聽者
private String mDisplayTxt = "";
private int mCurrentX = 0, mCurrentY = 0;// TextView左上角的像素值
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// 全屏
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
mScreenWidth = metrics.widthPixels;
mScreenHeight = metrics.heightPixels;// 獲得屏幕分辨率
setContentView(R.layout.main);// 指定布局
mContent = (TextView) findViewById(R.id.content);
resetTextView();
loadFile();
mDetector = new GestureDetector(this);
mContent.setOnTouchListener(this);
mContent.setLongClickable(true);// 初始化,注意這三步是必不可少的,但沒順序的限制
mContent.setText(mDisplayTxt);// 顯示文件內容
}
// 加載文件
private void loadFile() {
// TODO Auto-generated method stub
String mTemp;
try {
InputStream mInputStream = getAssets().open("jinju.txt");
BufferedReader mBufferedInputStream = new BufferedReader(
new InputStreamReader(mInputStream));
while ((mTemp = mBufferedInputStream.readLine()) != null) {
mDisplayTxt += mTemp;
}
mDisplayTxt = mDisplayTxt.replace(' ', '\n');
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 重置TextView的大小
private void resetTextView() {
// TODO Auto-generated method stub
LinearLayout.LayoutParams mParams = (LayoutParams) mContent
.getLayoutParams();
mParams.width = mScreenWidth + 300;
mParams.height = mScreenHeight + 500;
mContent.setLayoutParams(mParams);
}
// 觸摸TextView
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return mDetector.onTouchEvent(event);// 工作交給手勢監聽者
}
// 下面的各個函數是OnGestureListener的實現,具體動作這里不做贅述
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
int mLayoutWidth = mContent.getLayoutParams().width; // 獲得TextView的寬度
int mLayoutHeight = mContent.getLineCount() * mContent.getLineHeight(); // 獲得TextView的實際高度
if (mCurrentX + distanceX >= 0) {
if (mCurrentX + distanceX > mLayoutWidth - mScreenWidth) {
mCurrentX = mLayoutWidth - mScreenWidth;
} else {
mCurrentX = (int) (mCurrentX + distanceX);
}
} else {
mCurrentX = 0;
}
if (mCurrentY + distanceY >= 0) {
if (mCurrentY + distanceY > mLayoutHeight - mScreenHeight) {
mCurrentY = mLayoutHeight - mScreenHeight;
} else {
mCurrentY = (int) (mCurrentY + distanceY);
}
} else {
mCurrentY = 0;
}
mContent.scrollTo(mCurrentX, mCurrentY); // 使文本滾動到指定的地方
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
}
3.后續
??? 我的文件是jinju.txt,是放在assets文件夾下面的,當然你可以放在其他的位置,指定你自己的路徑就可以了,main.xml里面只有一個TextView,所以也沒貼出來,下面看幾張效果圖:
http://hi.baidu.com/ljlkings/blog/item/ffe87e6cc51843cf80cb4a55.html
設置帶滾動條的TextView
本來是想做一個顯示文字信息的,當文字很多時View的高度不能超過一個固定的值,當文字很少時View的高度小于那個固定值時,按View的高度顯示。因為ScrollView沒有maxHeight,無法滿足需求,只好另找方法了。
View本身是可以設置ScrollBar,這樣就不一定需要依賴ScrollView了。TextView有個屬性maxLine,這樣也就滿足了需求了,只要設置一個TextView帶ScrollBar的,然后設置maxLine就可以了。
<TextView
android:id="@+id/text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="false"
android:maxLines="10"
android:scrollbars="vertical"
/>
還需要在代碼了設置TextView可以滾動。
TextView textView = (TextView)findViewById(R.id.text_view);
textView.setMovementMethod(ScrollingMovementMethod.getInstance());
Android中計算一個文件在TextView中的顯示
http://hi.baidu.com/ljlkings/blog/item/47f1afdb8874c9fd39012fdd.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

