天天看點

Android TTS實作簡單閱讀器(二)

 <b>3</b><b>)公共工具</b>

         這個也貼出來吧==。

GlobalUtil.java

/** 

 * @brief 全局公用類 

 * @details 各部分公用内容都較少,就丢一起了==。 

 */ 

public final class GlobalUtil { 

    /** Bob Lee懶加載:内部類GlobalUtilHolder */ 

    static class GlobalUtilHolder { 

        static GlobalUtil instance = new GlobalUtil(); 

    } 

    /** Bob Lee懶加載:傳回GlobalUtil的單例 */ 

    public static GlobalUtil getInstance() { 

        return GlobalUtilHolder.instance; 

    /** 擷取視窗預設顯示資訊 */ 

    public Display getDisplay(Context mContext) { 

        WindowManager wm = (WindowManager) mContext 

                .getSystemService(Context.WINDOW_SERVICE); 

        return wm.getDefaultDisplay(); 

    /** 動畫方式 */ 

    public enum AnimMode { 

        UP_IN, UP_OUT, DOWN_IN, DOWN_OUT, LEFT_IN, LEFT_OUT, RIGHT_IN, RIGHT_OUT 

    }; 

    /** 

     * @brief 橫移或豎移動畫 

     *  

     * @param v  移動視圖 

     * @param animMode 動畫方式 

     * @param durationMillis 持續時間 

     */ 

    public void startTransAnim(View v, AnimMode animMode, long durationMillis) { 

        int w = v.getWidth(), h = v.getHeight(); // 擷取移動視圖寬高 

        float fromXDelta = 0, toXDelta = 0, fromYDelta = 0, toYDelta = 0; 

        switch (animMode) { 

        case UP_IN: 

            fromYDelta = -h; 

            break; 

        case UP_OUT: 

            toYDelta = -h; 

        case DOWN_IN: 

            fromYDelta = h; 

        case DOWN_OUT: 

            toYDelta = h; 

        case LEFT_IN: 

            fromXDelta = -w; 

        case LEFT_OUT: 

            toXDelta = -w; 

        case RIGHT_IN: 

            fromXDelta = w; 

        case RIGHT_OUT: 

            toXDelta = w; 

        } 

        TranslateAnimation transAnim = new TranslateAnimation(fromXDelta, 

                toXDelta, fromYDelta, toYDelta); // 位移動畫 

        transAnim.setDuration(durationMillis); // 設定時間 

        v.startAnimation(transAnim); // 開始動畫 

     * @brief InputStream轉為String 

     * @param is 輸入流 

     * @param encoding 編碼方式 

     * @return 字元串結果 

     * @throws UnsupportedEncodingException 不支援的編碼 

    public String is2Str(InputStream is, String encoding) 

            throws UnsupportedEncodingException { 

        /* 

         * 不直接從InputStream裡讀byte[],再轉成String,以避免截斷漢字。 

         * 如utf8一個漢字3位元組,用byte[1024]會截斷末尾而亂碼。 

         */ 

        InputStreamReader isReader = new InputStreamReader(is, encoding); 

        /* 以char[]方式讀取 */ 

        StringBuffer out = new StringBuffer(); 

        try { 

            char[] b = new char[4096]; // 1024*4*2Byte 

            for (int n; (n = isReader.read(b)) != -1;) { 

                out.append(b, 0, n); 

            } 

            return out.toString(); 

        } catch (IOException e) { 

            e.printStackTrace(); 

        return ""; 

     * @brief 帶BOM的文本的FileInputStream轉為String,自動判斷編碼類型 

     * @param fis 檔案輸入流 

    public String is2Str(FileInputStream fis) 

        // 轉成BufferedInputStream 

        BufferedInputStream bis = new BufferedInputStream(fis); 

        // 簡單判斷文本編碼 

        String encoding = getIsEncoding(bis); 

        // 轉成BufferedReader 

        BufferedReader reader = new BufferedReader(new InputStreamReader(bis, 

                encoding)); 

        /* 以readLine()方式讀取 */ 

            for (String s; (s = reader.readLine()) != null;) { 

                out.append(s); 

                out.append("\n"); 

     * @brief 帶BOM的文本判斷,否則認為GB2312(即ANSI類型的TXT) 

     * @details 複雜檔案編碼檢測,請google cpdetector! 

     * @param is InputStream 

     * @return 編碼類型 

     * @warning markSupported為true時才進行判斷,否則傳回預設GB2312。 

     * \n FileInputStream不支援mark/reset操作;BufferedInputStream支援此操作。 

    public String getIsEncoding(InputStream is) { 

        String code = "GB2312"; 

        // Log.e("is.markSupported()", "==" + is.markSupported() + "=="); 

        if (is.markSupported()) { // 支援mark() 

            try { 

                is.mark(5); // 打個TAG(5&gt;3) 

                byte[] head = new byte[3]; 

                is.read(head); 

                if (head[0] == -1 &amp;&amp; head[1] == -2) 

                    code = "UTF-16"; 

                if (head[0] == -2 &amp;&amp; head[1] == -1) 

                    code = "Unicode"; 

                if (head[0] == -17 &amp;&amp; head[1] == -69 &amp;&amp; head[2] == -65) 

                    code = "UTF-8"; 

                is.reset(); // 傳回TAG 

            } catch (IOException e) { 

                e.printStackTrace(); 

        return code; 

<b>四、閱讀器截圖</b>

<b>1</b><b>)進入畫面.png</b>

<a target="_blank" href="http://blog.51cto.com/attachment/201203/210444737.png"></a>

<b>2</b><b>)長按螢幕.png</b>

<a target="_blank" href="http://blog.51cto.com/attachment/201203/210444611.png"></a>

<b>3</b><b>)自帶two.txt.png</b>

<a target="_blank" href="http://blog.51cto.com/attachment/201203/210444464.png"></a>

<b>4</b><b>)“浏覽…</b><b>操作”的截圖</b>

<a target="_blank" href="http://blog.51cto.com/attachment/201203/210559357.png"></a>

浏覽...(1).png

<a target="_blank" href="http://blog.51cto.com/attachment/201203/210559971.png"></a>

浏覽...(2).png

<a target="_blank" href="http://blog.51cto.com/attachment/201203/210559791.png"></a>

浏覽...(3).png

<b>五、後記</b>

         直接讀大文本,後果自負啊。(沒做控制呢T^T)

<a href="http://down.51cto.com/data/2360079" target="_blank">附件:http://down.51cto.com/data/2360079</a>

     本文轉自winorlose2000 51CTO部落格,原文連結:http://blog.51cto.com/vaero/809876,如需轉載請自行聯系原作者

繼續閱讀