xw885

Android TTS实现简单阅读器(二)                2012-03-18 21:14:30

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://vaero.blog.51cto.com/4350852/809876

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

 

3)公共工具

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

 

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-05-18
  • 2022-12-23
  • 2021-11-17
  • 2022-01-19
  • 2022-02-10
  • 2021-08-02
  • 2021-05-29
猜你喜欢
  • 2021-09-24
  • 2022-12-23
  • 2022-12-23
  • 2021-10-17
  • 2022-01-08
  • 2022-12-23
  • 2021-12-24
相关资源
相似解决方案