`

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;
			}
	    	
	    });
   	}
    
    
    
}
分享到:
评论

相关推荐

    android 阅读器 源码.rar

    总的来说,“android 阅读器 源码.rar”提供了深入了解Android阅读器开发的宝贵资料,通过深入研究,开发者不仅可以掌握Android应用开发的基本技能,还能提升对复杂功能实现的理解,进一步提高自己的编程能力。

    史上最NB的android阅读器代码

    首先,关于Android阅读器开发,其核心在于处理各种格式的文档,如EPUB、PDF、MOBI等。在Android系统中,原生并不支持PDF的显示,因此,我们需要借助第三方库或者自行实现PDF解析和渲染。这里提到的"AndroidPdfViewer...

    ANDROID阅读器_企业项目实习

    《Android阅读器_企业项目实习》是一份详细指导实习生参与Android阅读器开发的文档,旨在帮助实习生通过实际项目提升Android应用开发技能。本项目不仅涵盖了基础功能实现,还强调了在企业环境中所需的实践能力和技术...

    Android新闻阅读器

    对于Android平台而言,开发一款高效、易用的新闻阅读器,不仅需要对Android系统有深入理解,还要掌握数据抓取技术和Java编程。本文将深入探讨如何利用Java在Android平台上构建一个功能完善的新闻阅读器应用。 一、...

    Android应用源码电子书阅读器源码-IT计算机-毕业设计.zip

    这篇文档将深入解析《Android应用源码电子书阅读器源码》这个项目,它是一个针对IT计算机专业学生的毕业设计示例,旨在帮助他们理解和实践Android应用程序的开发。在这个项目中,我们将探讨Android App的移动开发...

    基于Android平台的小说阅读器.zip

    在本项目"基于Android平台的小说阅读器"中,开发者运用了Android Studio这一强大的集成开发环境,构建了一个轻量级的应用程序,旨在提供一个简洁、便捷的阅读体验。这款小说阅读器并未采用复杂的数据库系统,而是...

    android阅读器

    ### Android阅读器开发详解 #### 一、项目概述 **标题**:“Android阅读器” **描述**:基于现有的源码进行二次开发,增加书签、字体缩放与书架等功能,构建一个完整的TXT文本阅读器。 #### 二、功能模块分析 #...

    Android文本阅读器源代码-IT计算机-毕业设计.zip

    本篇将深入解析一款名为“Android文本阅读器”的毕业设计源码,旨在帮助初学者及毕业生理解Android应用的开发流程,并提供一个实际项目的学习参考。 首先,我们关注的是“Android文本阅读器”这一应用的核心功能。...

    Android程序研发源码Android Txt文本阅读器源码.zip

    在Android平台上,开发一款TXT文本阅读器涉及到许多关键知识点,这些知识涵盖了Android应用的基础架构、UI设计、文件操作以及文本处理等。以下是对这个源码项目中可能涉及的关键技术点的详细说明: 1. **Android...

    Android 小说阅读器CoolReader源码.rar

    本文将深入探讨这款开源Android小说阅读器的源码,帮助开发者理解其内部机制,为自己的阅读应用开发提供灵感和参考。 首先,我们看到的是源码中的图片资源,如1-120ZZ054200-L.jpg和1_120909005653_1.jpg。这些图片...

    android 阅读器源码

    【Android阅读器源码解析】 在移动设备上,阅读电子书籍已经成为现代生活的一部分,而Android平台因其开源性和广泛的用户基础,成为了开发阅读应用的理想选择。本篇将详细探讨一款名为"开心阅读"的Android TXT文件...

    基于安卓开发的TXT阅读器源码

    在Android平台上,开发一个TXT阅读器是一个常见的任务,它能够帮助用户轻松地浏览和阅读存储在设备SD卡上的TXT文本文件。"基于安卓开发的TXT阅读器源码"项目提供了这样的功能,允许开发者深入理解如何实现这样的应用...

    Android阅读器翻页

    本文将深入探讨“Android阅读器翻页”这一主题,包括其改良版本的功能增强,如支持播放视频和图片显示,以及实现这些功能所涉及的关键技术。 首先,Android阅读器翻页的核心是模拟真实的图书翻页效果。这通常涉及到...

    看代码学Android开发系列:AndroidPDF阅读器源代码

    在Android平台上,开发一款PDF阅读器是一个常见的需求,它能够帮助用户查看和处理PDF文档。本文将基于"看代码学Android开发系列:Android PDF阅读器源代码"这一主题,深入探讨Android PDF阅读器的实现原理和关键技术...

    基于Android的看小说APP源码Android本科毕业设计Android小说阅读器、小说APP源码

    总的来说,这个Android小说阅读器项目涵盖了Android应用开发的多个核心方面,包括UI设计、数据存储、网络通信、多线程处理、权限管理以及用户体验优化,是Android开发学习的宝贵实践案例。通过研究源代码,开发者能...

    Android 阅读器源码

    这个"Android阅读器源码"提供了一个完整的解决方案,允许开发者快速整合到自己的项目中,节省了从零开始构建阅读器功能的时间和精力。下面我们将深入探讨这个源码中的关键知识点。 1. **UI设计**: - **书架界面**...

    新浪RSS 阅读器 android源码

    新浪RSS阅读器是一款基于Android平台的应用程序,它允许用户订阅并阅读来自新浪的RSS新闻源。源码分析有助于开发者理解RSS订阅和解析的过程,以及如何在Android环境下构建一个功能完善的新闻阅读应用。以下是对该...

Global site tag (gtag.js) - Google Analytics