阅读更多 由于现在TXT文本很多,特别是好多小说也是以这个文件格式出现,毕竟这个格式所占用不必要的空间比较小。像我这样的人就非常喜欢在手机上看小说,经常下载好多的TXT格式小说存到手机上以便空闲时候看。于是乎也试图做了一下如何在Android上实现看大文本的txt文档。

  虽然现在类似的应用还真不少,不过个人看到的基本不公布源码,而公布源码的基本都是不能看大文本的,所以自己去实现了一下。现在只是粗略实现了,实现方法是每次当滑动到屏幕底端时,从文件读2048字节出来显示到屏幕上。到屏幕底端再读是为了不给用户有刷屏的感觉,使用起来感觉不到只读了2048字节出来,比较流畅。现在由于只是试验流畅性,所以只写了向下浏览的,而没有写往回读,也就是说往回翻是无效的。

  废话不多说,代码是王道。这个是主文件:

package net.wangliping.filemanager; import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.nio.CharBuffer; import android.app.Activity;import android.net.Uri;import android.os.AsyncTask;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import android.util.Log;import android.widget.ScrollView; import net.wangliping.test.R; public class TxtReader extends Activity implements        RealTimeTextView.OnTextChangedListener {     private static final String LOG_TAG = "TxtReader";    private static final int SHOW_TXT = 1;     private SwanTextView mTextShow;    private ScrollView mScrollView;    private String mStringShow = null;     private boolean mContinueRead = true;    private boolean mHaveNewText  = false;     private int mCurBottom = -1;    private int mNum = -1;     private final Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {            case SHOW_TXT:                mTextShow.setText((CharBuffer) msg.obj);                break;            default:                super.handleMessage(msg);            }        }    };     public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.txt_reader);         Uri uri = getIntent().getData();         mScrollView = (ScrollView) findViewById(R.id.text_show_scroll);         mTextShow = (RealTimeTextView) findViewById(R.id.text_show);           mTextShow.setOnTextChangedListener(this);         new TextShowTask().execute(uri);    }     private void showText(Uri uri) throws IOException, InterruptedException {         InputStreamReader is = new InputStreamReader(new FileInputStream(                uri.getPath()), "GB2312");         StringBuilder sb = new StringBuilder();        char[] buf = new char[1024 * 2];        while (true) {            if (mCurBottom == mScrollView.getScrollY()) {                Log.d(LOG_TAG, "curBtm:" + mCurBottom + " scroll:"                        + mScrollView.getScrollY());                 mCurBottom = -1;                mNum++;                 if (mNum % 2 == 0) {                    mContinueRead = true;                                       Log.d(LOG_TAG, "YES");                }            }             if (mContinueRead && is.read(buf) > 0) {                mContinueRead = false;                 if (sb.length() > 4096) {                    sb.delete(0, 2048);                     Message msg = mHandler.obtainMessage(SHOW_TXT);                                   msg.obj = CharBuffer.wrap(sb.toString());                    mHandler.sendMessage(msg);                     mStringShow = sb.append(buf).toString();                    mHaveNewText = true;                } else {                    while (sb.length() < 4096) {                        sb.append(buf);                        is.read(buf);                    }                     sb.append(buf);                    Message msg = mHandler.obtainMessage(SHOW_TXT);                    msg.obj = CharBuffer.wrap(sb.toString());                    mHandler.sendMessage(msg);                }            }        }    }     private class TextShowTask extends AsyncTask {        @Override        protected void onPostExecute(Object param) {            Log.d(LOG_TAG, "Send broadcast");        }         @Override        protected Object doInBackground(Object... params) {            Uri uri = (Uri) params[0];             try {                showText(uri);            } catch (Exception e) {                Log.d(LOG_TAG, "Exception", e);            }             return null;        }    }     @Override    public void onPreOnDraw(int bottom) {               mCurBottom = bottom - mScrollView.getHeight();         if (mHaveNewText && !TextUtils.isEmpty(mStringShow)) {            mHaveNewText = false;             Message msg = mHandler.obtainMessage(SHOW_TXT);            msg.obj = CharBuffer.wrap(mStringShow);            mHandler.sendMessage(msg);        }    }}


这个为了得到TextView底部的位置而扩展了TextView类:

package net.wangliping.filemanager; import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.widget.TextView; public class SwanTextView extends TextView {     private int mPreBottom = -1;    private OnTextChangedListener textChangedListener = null;     public SwanTextView(Context context) {        super(context);    }     public SwanTextView(Context context, AttributeSet attrs) {        super(context, attrs);    }     public SwanTextView(Context context, AttributeSet attrs,            int defStyle) {        super(context, attrs, defStyle);    }     @Override    protected void onDraw(Canvas canvas) {         if (mPreBottom != getBottom()) {            mPreBottom = getBottom();             if (textChangedListener != null)                textChangedListener.onPreOnDraw(mPreBottom);        }         super.onDraw(canvas);    }     public static interface OnTextChangedListener {        public void onPreOnDraw(int bottom);    }     public void setOnTextChangedListener(OnTextChangedListener listener) {        textChangedListener = listener;    }}


这个就是资源文件了:

<?xml version="1.0" encoding="utf-8"?>                        


更多相关文章

  1. 和菜鸟一起学android4.0.3源码之lcd屏幕背光调节
  2. android 性能分析(优化)-利用AOP技术,字节码方法插桩,实现 android
  3. [应用代码] android源码之多线程断点续传下载
  4. Android(安卓)的 ListView 的CheckBox标题栏显示文本之后显示单
  5. Android格式化外部设备如USB等
  6. Android(安卓)SDK 源码下载,eclipse关联代码
  7. Android(安卓)文本阅读以及TextView指定字符高亮显示
  8. MTK Android(安卓)N 源码Rom Root
  9. [置顶] Android(安卓)IPC 通讯机制源码分析【下】

随机推荐

  1. Android(安卓)Service完全解析
  2. Android实现下拉框(Spinner)
  3. android listview check 事件
  4. android 遍历安装过的包名
  5. 横向 纵向结合的ScrollView
  6. android 内核添加tourch screen
  7. Android 一些常用的但是记不住的设置
  8. android 版 双色球号码生成
  9. android实现左右滑动菜单
  10. Android 自定义滚动视图