`

android阅读器开发

阅读更多
很早前就想做一个小说阅读器的。最近终于做了下来。
其实很简单,这里只做了一小部分显示部分,还有标签,回翻的部分没有做。
读取文件采用RandomAccessFile对大文件进行操作。
早前使用read(byte[] b) 进行读取,可是总是有些意外,就是偶尔在一页的最后一行的几个字符出现乱码,导致下一页的前部分也会有乱码。而且这个问题很奇怪,自己在纯java环境中是没有任何的问题,可是只要在android虚拟机中就出现问题了。
后来采用readLine()方法。
一下是全部代码:
package com.duduli.li;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ScrollView;
import android.widget.TextView;

public class Ibook2Activity extends Activity {
	private ScrollView sv;
	private TextView tv;
	private RandomAccessFile raf;
	private int scrollViewY = 0;
	private StringBuilder sb;
	private long currentPoint;
	private long fileLeght;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
//        sv = (ScrollView) this.findViewById(R.id.scrollView);
        tv = (TextView) this.findViewById(R.id.textView);
        sv = (ScrollView) this.findViewById(R.id.scrollView);
        
        
        
        File file = new File("/sdcard/zhuxian.txt");
        try {
			raf = new RandomAccessFile(file, "r");
			fileLeght = raf.length();
			System.out.println("文件总长度: "+fileLeght);
			sb = new StringBuilder();
			for(int i=0; i<=50;i++){
				if(raf.getFilePointer() != fileLeght){
//					string += new String(raf.readLine().getBytes("8859_1"), "gb2312")+("\r\n");
					sb.append(new String(raf.readLine().getBytes("8859_1"), "gb2312")+("\r\n"));
	//				break;
			}else{
				break;
			}
			}
			
//			System.out.println(sb);
			currentPoint = raf.getFilePointer();
			System.out.println(currentPoint);
			tv.setText(sb);
//			tv.setText(string);
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	    sv.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
//				string = "";
				if(event.getAction() == MotionEvent.ACTION_UP){
					if (sv.getScrollY() == 0) {  
						System.out.println("up");
					} else if (sv.getScrollY() - scrollViewY < 2 && sv.getScrollY() >= scrollViewY) {  
						try {
							raf.seek(currentPoint);
							
							sb.delete(0, sb.length());
							for(int i=0; i<=50;i++){
								if(raf.getFilePointer() != fileLeght){
//									string += new String(raf.readLine().getBytes("8859_1"), "gb2312")+("\r\n");
									sb.append(new String(raf.readLine().getBytes("8859_1"), "gb2312")+("\r\n"));
//									break;
								}else{
									break;
								}
								
							}
//							System.out.println(string);
							
							currentPoint = raf.getFilePointer();
							tv.setText(sb);
//							tv.setText(string);
							sv.scrollTo(0, 0);
							
							
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} else {  
		                scrollViewY = sv.getScrollY();
//		                System.out.println(sv.getScrollY());
		            }  
					System.out.println("currentPoint: "+currentPoint);
					System.out.println("ScrollY: "+sv.getScrollY());
					
				}
				return false;
			}
	    	
	    });
   	}
    
    
    
    
}


续:下面这个代码加入获得到达底部进行toast提示。

package com.duduli.li;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class Ibook2Activity extends Activity {
	private ScrollView sv;
	private TextView tv;
	private RandomAccessFile raf;
	private int scrollViewY = 0;
	private StringBuilder sb;
	private long currentPoint;
	private long fileLeght;
	private boolean flag = true;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
//        sv = (ScrollView) this.findViewById(R.id.scrollView);
        tv = (TextView) this.findViewById(R.id.textView);
        sv = (ScrollView) this.findViewById(R.id.scrollView);
        
        
        
        File file = new File("/sdcard/test.txt");
        try {
			raf = new RandomAccessFile(file, "r");
			fileLeght = raf.length();
			System.out.println("文件总长度: "+fileLeght);
			sb = new StringBuilder();
			for(int i=0; i<=50;i++){
				if(raf.getFilePointer() != fileLeght){
//					string += new String(raf.readLine().getBytes("8859_1"), "gb2312")+("\r\n");
					sb.append(new String(raf.readLine().getBytes("8859_1"), "gb2312")+("\r\n"));
	//				break;
			}else{
				break;
			}
			}
			
//			System.out.println(sb);
			currentPoint = raf.getFilePointer();
			System.out.println(currentPoint);
			tv.setText(sb);
//			tv.setText(string);
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	    sv.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
//				string = "";
				if(event.getAction() == MotionEvent.ACTION_UP){
					if (sv.getScrollY() == 0) {  
						System.out.println("up");
						
					
					} else if (sv.getScrollY() - scrollViewY < 2 && sv.getScrollY() >= scrollViewY) {  
						try {
							
							if(flag){
								System.out.println("begin");
								raf.seek(currentPoint);
								
								sb.delete(0, sb.length());
								for(int i=0; i<=50;i++){
									if(raf.getFilePointer() != fileLeght){
//										string += new String(raf.readLine().getBytes("8859_1"), "gb2312")+("\r\n");
										sb.append(new String(raf.readLine().getBytes("8859_1"), "gb2312")+("\r\n"));
//										break;
									}else{
										
//										
										flag = false;
										break;
									}
							}
							
								
								
//							System.out.println(string);
							
							currentPoint = raf.getFilePointer();
							tv.setText(sb);
//							tv.setText(string);
							sv.scrollTo(0, 0);
							
							}
							
							
							
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} else {  
		                scrollViewY = sv.getScrollY();
//		                System.out.println(sv.getScrollY());
		            }  
					if(!flag && (tv.getHeight() - sv.getScrollY() <= 362)){
							Toast.makeText(getApplicationContext(), "本文已结束",
								     Toast.LENGTH_SHORT).show();
					}
					System.out.println(tv.getHeight());
					System.out.println(sv.getScrollY());
					
				}
				
				return false;
			}
	    	
	    });
   	}
    
    
    
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics