TextView 滚动效果 android

来源:互联网 发布:帝国cms采集插件 编辑:程序博客网 时间:2024/04/29 22:39
这里要说的就是一个滚动的效果。所以肯定要用到TextView的滚动效果。同样的还要求TextView在水平方向和垂直方向上都可以滚动。刚做的时候,也是没有头绪,后来想到了,TextView有一个ScrollTo或者ScrollBy方法,何不如此一用呢!

       1.前期找资料

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

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

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