分享

使TextView文本可以水平和垂直滚动

 WindySky 2016-03-01
     在做一个小的电子书程序,要求电子书具有放大缩小的功能,所以肯定的要用到TextView的滚动效果。同样的还要求TextView在水平方向和垂直方向上都可以滚动。刚做的时候,也是没有头绪,后来想到了,TextView有一个ScrollTo或者ScrollBy方法,何不如此一用呢!

1.前期找资料

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

    setMovementMethod(ScrollingMovementMethod.getInstance());

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

2.我的实现。(里面注释很详细,就不过多说了)

Java代码  收藏代码
  1. public class Test_ScrollingText extends Activity implements OnTouchListener,  
  2.   
  3.         OnGestureListener { // 实现触摸和手势的接口  
  4.   
  5.     private TextView mContent;  
  6.   
  7.     private DisplayMetrics metrics;  
  8.   
  9.     private int mScreenWidth, mScreenHeight;// 屏幕分辨率  
  10.   
  11.     private GestureDetector mDetector;// 手势监听者  
  12.   
  13.     private String mDisplayTxt = "";  
  14.   
  15.     private int mCurrentX = 0, mCurrentY = 0;// TextView左上角的像素值  
  16.   
  17.    
  18.     /** Called when the activity is first created. */  
  19.   
  20.     @Override  
  21.   
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.   
  24.         super.onCreate(savedInstanceState);  
  25.   
  26.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  27.   
  28.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  29.   
  30.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);// 全屏  
  31.    
  32.         metrics = new DisplayMetrics();  
  33.   
  34.         getWindowManager().getDefaultDisplay().getMetrics(metrics);  
  35.   
  36.         mScreenWidth = metrics.widthPixels;  
  37.   
  38.         mScreenHeight = metrics.heightPixels;// 获得屏幕分辨率  
  39.    
  40.         setContentView(R.layout.main);// 指定布局  
  41.   
  42.         mContent = (TextView) findViewById(R.id.content);  
  43.    
  44.         resetTextView();  
  45.   
  46.         loadFile();  
  47.   
  48.         mDetector = new GestureDetector(this);  
  49.   
  50.         mContent.setOnTouchListener(this);  
  51.   
  52.         mContent.setLongClickable(true);// 初始化,注意这三步是必不可少的,但没顺序的限制  
  53.   
  54.         mContent.setText(mDisplayTxt);// 显示文件内容  
  55.   
  56.     }  
  57.   
  58.    
  59.     // 加载文件  
  60.   
  61.     private void loadFile() {  
  62.   
  63.         // TODO Auto-generated method stub  
  64.   
  65.         String mTemp;  
  66.   
  67.         try {  
  68.   
  69.             InputStream mInputStream = getAssets().open("jinju.txt");  
  70.   
  71.             BufferedReader mBufferedInputStream = new BufferedReader(  
  72.   
  73.                     new InputStreamReader(mInputStream));  
  74.   
  75.             while ((mTemp = mBufferedInputStream.readLine()) != null) {  
  76.   
  77.                 mDisplayTxt += mTemp;  
  78.   
  79.             }  
  80.   
  81.             mDisplayTxt = mDisplayTxt.replace(' ', '\n');  
  82.   
  83.         } catch (IOException e) {  
  84.   
  85.             // TODO Auto-generated catch block  
  86.   
  87.             e.printStackTrace();  
  88.   
  89.         }  
  90.   
  91.     }  
  92.   
  93.    
  94.     // 重置TextView的大小  
  95.   
  96.     private void resetTextView() {  
  97.   
  98.         // TODO Auto-generated method stub  
  99.   
  100.         LinearLayout.LayoutParams mParams = (LayoutParams) mContent  
  101.   
  102.                 .getLayoutParams();  
  103.   
  104.         mParams.width = mScreenWidth + 300;  
  105.   
  106.         mParams.height = mScreenHeight + 500;  
  107.   
  108.         mContent.setLayoutParams(mParams);  
  109.   
  110.     }  
  111.   
  112.    
  113.     // 触摸TextView  
  114.   
  115.     @Override  
  116.   
  117.     public boolean onTouch(View v, MotionEvent event) {  
  118.   
  119.         // TODO Auto-generated method stub  
  120.   
  121.         return mDetector.onTouchEvent(event);// 工作交给手势监听者  
  122.   
  123.     }  
  124.   
  125.    
  126.     // 下面的各个函数是OnGestureListener的实现,具体动作这里不做赘述  
  127.   
  128.     @Override  
  129.   
  130.     public boolean onDown(MotionEvent e) {  
  131.   
  132.         // TODO Auto-generated method stub  
  133.   
  134.         return false;  
  135.   
  136.     }  
  137.   
  138.    
  139.     @Override  
  140.   
  141.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  142.   
  143.             float velocityY) {  
  144.   
  145.         // TODO Auto-generated method stub  
  146.   
  147.         return false;  
  148.   
  149.     }  
  150.   
  151.    
  152.     @Override  
  153.   
  154.     public void onLongPress(MotionEvent e) {  
  155.   
  156.         // TODO Auto-generated method stub  
  157.   
  158.    
  159.     }  
  160.    
  161.   
  162.     @Override  
  163.   
  164.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
  165.   
  166.             float distanceY) {  
  167.   
  168.         // TODO Auto-generated method stub  
  169.   
  170.         int mLayoutWidth = mContent.getLayoutParams().width; // 获得TextView的宽度  
  171.   
  172.         int mLayoutHeight = mContent.getLineCount() * mContent.getLineHeight(); // 获得TextView的实际高度  
  173.   
  174.         if (mCurrentX + distanceX >= 0) {  
  175.   
  176.             if (mCurrentX + distanceX > mLayoutWidth - mScreenWidth) {  
  177.   
  178.                 mCurrentX = mLayoutWidth - mScreenWidth;  
  179.   
  180.             } else {  
  181.   
  182.                 mCurrentX = (int) (mCurrentX + distanceX);  
  183.   
  184.             }  
  185.   
  186.         } else {  
  187.   
  188.             mCurrentX = 0;  
  189.   
  190.         }  
  191.   
  192.         if (mCurrentY + distanceY >= 0) {  
  193.   
  194.             if (mCurrentY + distanceY > mLayoutHeight - mScreenHeight) {  
  195.   
  196.                 mCurrentY = mLayoutHeight - mScreenHeight;  
  197.   
  198.             } else {  
  199.   
  200.                 mCurrentY = (int) (mCurrentY + distanceY);  
  201.   
  202.             }  
  203.   
  204.         } else {  
  205.   
  206.             mCurrentY = 0;  
  207.   
  208.         }  
  209.   
  210.         mContent.scrollTo(mCurrentX, mCurrentY); // 使文本滚动到指定的地方  
  211.   
  212.         return false;  
  213.   
  214.     }  
  215.   
  216.    
  217.     @Override  
  218.   
  219.     public void onShowPress(MotionEvent e) {  
  220.   
  221.         // TODO Auto-generated method stub  
  222.   
  223.    
  224.   
  225.     }  
  226.   
  227.    
  228.     @Override  
  229.   
  230.     public boolean onSingleTapUp(MotionEvent e) {  
  231.   
  232.         // TODO Auto-generated method stub  
  233.   
  234.         return false;  
  235.   
  236.     }  
  237.   
  238. }  


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就可以了。
Xml代码  收藏代码
  1. <TextView    
  2.     android:id="@+id/text_view"    
  3.     android:layout_width="fill_parent"    
  4.     android:layout_height="wrap_content"    
  5.     android:singleLine="false"    
  6.     android:maxLines="10"    
  7.     android:scrollbars="vertical"    
  8.     />    

还需要在代码了设置TextView可以滚动。
Java代码  收藏代码
  1. TextView textView = (TextView)findViewById(R.id.text_view);     
  2. textView.setMovementMethod(ScrollingMovementMethod.getInstance());  


Android中计算一个文件在TextView中的显示
http://hi.baidu.com/ljlkings/blog/item/47f1afdb8874c9fd39012fdd.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多