好吧,这是下半部分==,上半部分请看《Android TTS实现简单阅读器(一)》。

 

 3)公共工具

         这个也贴出来吧==。
 
GlobalUtil.java

  1. /** 
  2.  * @brief 全局公用类 
  3.  * @details 各部分公用内容都较少,就丢一起了==。 
  4.  */ 
  5. public final class GlobalUtil { 
  6.  
  7.     /** Bob Lee懒加载:内部类GlobalUtilHolder */ 
  8.     static class GlobalUtilHolder { 
  9.         static GlobalUtil instance = new GlobalUtil(); 
  10.     } 
  11.  
  12.     /** Bob Lee懒加载:返回GlobalUtil的单例 */ 
  13.     public static GlobalUtil getInstance() { 
  14.         return GlobalUtilHolder.instance; 
  15.     } 
  16.  
  17.     /** 获取窗口默认显示信息 */ 
  18.     public Display getDisplay(Context mContext) { 
  19.         WindowManager wm = (WindowManager) mContext 
  20.                 .getSystemService(Context.WINDOW_SERVICE); 
  21.         return wm.getDefaultDisplay(); 
  22.     } 
  23.  
  24.     /** 动画方式 */ 
  25.     public enum AnimMode { 
  26.         UP_IN, UP_OUT, DOWN_IN, DOWN_OUT, LEFT_IN, LEFT_OUT, RIGHT_IN, RIGHT_OUT 
  27.     }; 
  28.  
  29.     /** 
  30.      * @brief 横移或竖移动画 
  31.      *  
  32.      * @param v  移动视图 
  33.      * @param animMode 动画方式 
  34.      * @param durationMillis 持续时间 
  35.      */ 
  36.     public void startTransAnim(View v, AnimMode animMode, long durationMillis) { 
  37.         int w = v.getWidth(), h = v.getHeight(); // 获取移动视图宽高 
  38.         float fromXDelta = 0, toXDelta = 0, fromYDelta = 0, toYDelta = 0
  39.         switch (animMode) { 
  40.         case UP_IN: 
  41.             fromYDelta = -h; 
  42.             break
  43.         case UP_OUT: 
  44.             toYDelta = -h; 
  45.             break
  46.         case DOWN_IN: 
  47.             fromYDelta = h; 
  48.             break
  49.         case DOWN_OUT: 
  50.             toYDelta = h; 
  51.             break
  52.         case LEFT_IN: 
  53.             fromXDelta = -w; 
  54.             break
  55.         case LEFT_OUT: 
  56.             toXDelta = -w; 
  57.             break
  58.         case RIGHT_IN: 
  59.             fromXDelta = w; 
  60.             break
  61.         case RIGHT_OUT: 
  62.             toXDelta = w; 
  63.             break
  64.         } 
  65.         TranslateAnimation transAnim = new TranslateAnimation(fromXDelta, 
  66.                 toXDelta, fromYDelta, toYDelta); // 位移动画 
  67.         transAnim.setDuration(durationMillis); // 设置时间 
  68.         v.startAnimation(transAnim); // 开始动画 
  69.     } 
  70.  
  71.     /** 
  72.      * @brief InputStream转为String 
  73.      *  
  74.      * @param is 输入流 
  75.      * @param encoding 编码方式 
  76.      * @return 字符串结果 
  77.      * @throws UnsupportedEncodingException 不支持的编码 
  78.      */ 
  79.     public String is2Str(InputStream is, String encoding) 
  80.             throws UnsupportedEncodingException { 
  81.         /* 
  82.          * 不直接从InputStream里读byte[],再转成String,以避免截断汉字。 
  83.          * 如utf8一个汉字3字节,用byte[1024]会截断末尾而乱码。 
  84.          */ 
  85.         InputStreamReader isReader = new InputStreamReader(is, encoding); 
  86.         /* 以char[]方式读取 */ 
  87.         StringBuffer out = new StringBuffer(); 
  88.         try { 
  89.             char[] b = new char[4096]; // 1024*4*2Byte 
  90.             for (int n; (n = isReader.read(b)) != -1;) { 
  91.                 out.append(b, 0, n); 
  92.             } 
  93.             return out.toString(); 
  94.         } catch (IOException e) { 
  95.             e.printStackTrace(); 
  96.         } 
  97.         return ""
  98.     } 
  99.  
  100.     /** 
  101.      * @brief 带BOM的文本的FileInputStream转为String,自动判断编码类型 
  102.      *  
  103.      * @param fis 文件输入流 
  104.      * @return 字符串结果 
  105.      * @throws UnsupportedEncodingException 不支持的编码 
  106.      */ 
  107.     public String is2Str(FileInputStream fis) 
  108.             throws UnsupportedEncodingException { 
  109.         // 转成BufferedInputStream 
  110.         BufferedInputStream bis = new BufferedInputStream(fis); 
  111.         // 简单判断文本编码 
  112.         String encoding = getIsEncoding(bis); 
  113.         // 转成BufferedReader 
  114.         BufferedReader reader = new BufferedReader(new InputStreamReader(bis, 
  115.                 encoding)); 
  116.         /* 以readLine()方式读取 */ 
  117.         StringBuffer out = new StringBuffer(); 
  118.         try { 
  119.             for (String s; (s = reader.readLine()) != null;) { 
  120.                 out.append(s); 
  121.                 out.append("\n"); 
  122.             } 
  123.             return out.toString(); 
  124.         } catch (IOException e) { 
  125.             e.printStackTrace(); 
  126.         } 
  127.         return ""
  128.     } 
  129.  
  130.     /** 
  131.      * @brief 带BOM的文本判断,否则认为GB2312(即ANSI类型的TXT) 
  132.      * @details 复杂文件编码检测,请google cpdetector! 
  133.      *  
  134.      * @param is InputStream 
  135.      * @return 编码类型 
  136.      *  
  137.      * @warning markSupported为true时才进行判断,否则返回默认GB2312。 
  138.      * \n FileInputStream不支持mark/reset操作;BufferedInputStream支持此操作。 
  139.      */ 
  140.     public String getIsEncoding(InputStream is) { 
  141.         String code = "GB2312"
  142.         // Log.e("is.markSupported()", "==" + is.markSupported() + "=="); 
  143.         if (is.markSupported()) { // 支持mark() 
  144.             try { 
  145.                 is.mark(5); // 打个TAG(5>3) 
  146.                 byte[] head = new byte[3]; 
  147.                 is.read(head); 
  148.                 if (head[0] == -1 && head[1] == -2
  149.                     code = "UTF-16"
  150.                 if (head[0] == -2 && head[1] == -1
  151.                     code = "Unicode"
  152.                 if (head[0] == -17 && head[1] == -69 && head[2] == -65
  153.                     code = "UTF-8"
  154.                 is.reset(); // 返回TAG 
  155.             } catch (IOException e) { 
  156.                 e.printStackTrace(); 
  157.             } 
  158.         } 
  159.         return code; 
  160.     } 
  161.  
 
四、阅读器截图
1)进入画面.png

应用图标.png

 
2)长按屏幕.png

应用图标.png

 
3)自带two.txt.png

应用图标.png

 
4)“浏览…操作”的截图

浏览...(1).png

浏览...(1).png
 

浏览...(1).png

浏览...(2).png
 

浏览...(1).png

浏览...(3).png
 
五、后记

         直接读大文本,后果自负啊。(没做控制呢T^T)

 

 

         ps:应用的入口图标 应用图标.png ,可爱吧^^。