TextView 滚动效果 android

这里要说的就是一个滚动的效果。所以肯定要用到TextView的滚动效果。同样的还要求TextView在水平方向和垂直方向上都可以滚动。刚做的时候,也是没有头绪,后来想到了,TextView有一个ScrollTo或者ScrollBy方法,何不如此一用呢!

       1.前期找资料

        因为刚开始,不知道怎么能够滚动,所以先去网上查找资料,垂直滚动很容易实现,直接使用TextView的
setMovementMethod(ScrollingMovementMethod.getInstance());

        方法就可以了。可是水平滚动如何实现?晚上说在TextView的前面在套一层HorizontalScrollView,这个我也做了尝试,效果不佳,因为你有可能要在程序中动态的改变TextView的布局,这样子程序中就会出错;在者如果你设定了你的TextView为500px,而你的内容一行要有 700px,这时你的内容不会自动的切为两行;第三,在添加一个HorizontalScrollView感觉很不舒服,起码界面是这样。所以综合这几点,我放弃了使用这种方法。接着就想到用ScrollTo方法,首先需要声明的是,采用这种方法,你的程序中是没有水平和垂直滚动条的,这个你可以自己去优化实现,理论上是绝对可行的。

java代码:
001 public class Test_ScrollingText extends Activity implements OnTouchListener,OnGestureListener { // 实现触摸和手势的接口
002  
003 private <a href="http://www.ligotop.comprivate">www.ligotop.com
004 private</a> TextView mContent;
005 private DisplayMetrics metrics;
006 private int mScreenWidth, mScreenHeight;// 屏幕分辨率
007 private GestureDetector mDetector;// 手势监听者
008 private String mDisplayTxt = "";
009 private int mCurrentX = 0,
010 mCurrentY = 0;// TextView左上角的像素值
011  
012 /** Called when the activity is first created. */
013 @Override
014 public void onCreate(Bundle savedInstanceState) {
015 super.onCreate(savedInstanceState);
016 requestWindowFeature(Window.FEATURE_NO_TITLE);
017 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
018 WindowManager.LayoutParams.FLAG_FULLSCREEN);// 全屏
019 metrics = new
020 DisplayMetrics();
021 getWindowManager().getDefaultDisplay().getMetrics(metrics);
022 mScreenWidth = metrics.widthPixels;
023 mScreenHeight = metrics.heightPixels;// 获得屏幕分辨率
024 setContentView(R.layout.main);// 指定布局
025 mContent = (TextView) findViewById(R.id.content);
026  
027 resetTextView();
028 loadFile();
029 mDetector = new GestureDetector(this);
030 mContent.setOnTouchListener(this);
031 mContent.setLongClickable(true);// 初始化,注意这三步是必不可少的,但没顺序的限制
032 mContent.setText(mDisplayTxt);// 显示文件内容
033 }
034  
035 // 加载文件
036 private void loadFile() {
037 // TODO Auto-generated method stub
038 String mTemp;
039 try {
040 InputStream mInputStream = getAssets().open("jinju.txt");
041 BufferedReader mBufferedInputStream = new BufferedReader(
042 new InputStreamReader(mInputStream));
043 while
044 ((mTemp = mBufferedInputStream.readLine()) != null) {
045 mDisplayTxt +=
046 mTemp;
047 }
048 mDisplayTxt = mDisplayTxt.replace(' ', '
049 ');
050 }
051 catch (IOException e) {
052 // TODO Auto-generated catch block
053 e.printStackTrace();
054 }
055 }
056  
057 // 重置TextView的大小
058  
059 private void resetTextView() {
060 // TODO Auto-generated method stub
061 LinearLayout.LayoutParams mParams = (LayoutParams) mContent.getLayoutParams();
062 mParams.width = mScreenWidth + 300;
063 mParams.height = mScreenHeight + 500;
064 mContent.setLayoutParams(mParams);
065 }
066 // 触摸TextView
067 @Override
068 public boolean onTouch(View v, MotionEvent event) {
069  
070 // TODO Auto-generated method stub
071 return mDetector.onTouchEvent(event);// 工作交给手势监听者
072 }
073 // 下面的各个函数是OnGestureListener的实现,具体动作这里不做赘述
074 @Override
075 public boolean onDown(MotionEvent e) {
076 // TODO Auto-generated method stub
077 return false;
078  
079 }
080  
081 @Override
082 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
083 // TODO Auto-generated method stub
084 return false;
085 }
086  
087 @Override
088 public void onLongPress(MotionEvent e) {
089 // TODO Auto-generated method stub
090 }
091 @Override
092 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {
093  
094 // TODO Auto-generated method stub
095 int mLayoutWidth = mContent.getLayoutParams().width; // 获得TextView的宽度
096 int mLayoutHeight = mContent.getLineCount() * mContent.getLineHeight();
097 // 获得TextView的实际高度
098 if (mCurrentX + distanceX >= 0) {
099 if (mCurrentX + distanceX > mLayoutWidth - mScreenWidth) {
100 mCurrentX = mLayoutWidth - mScreenWidth;
101 } else {
102 mCurrentX = (int) (mCurrentX + distanceX);
103 }
104 } else {
105 mCurrentX = 0;
106 }
107 if (mCurrentY + distanceY >= 0) {
108 if (mCurrentY + distanceY > mLayoutHeight - mScreenHeight) {
109 mCurrentY = mLayoutHeight - mScreenHeight;
110 } else {
111 mCurrentY = (int) (mCurrentY + distanceY);
112 }
113 } else {
114  
115  
116 mCurrentY = 0;
117 }
118  
119  
120 mContent.scrollTo(mCurrentX, mCurrentY);
121 // 使文本滚动到指定的地方
122 return false;
123 }
124  
125 @Override
126 public void onShowPress(MotionEvent e) {
127 // TODO Auto-generated method stub
128 }
129  
130 @Override
131 public boolean onSingleTapUp(MotionEvent e) {
132 // TODO Auto-generated method stub
133 return false;
134 }
135  
136  
137 }

你可能感兴趣的:(java,android,优化,String,null,float)