//读取文件,设置翻页时的阴影和背面文字

public class BookPageFactory {private File book_file = null;private MappedByteBuffer m_mbBuf = null;private int m_mbBufLen = 0;private int m_mbBufBegin = 0;private int m_mbBufEnd = 0;private String m_strCharsetName = "GBK";private Bitmap m_book_bg = null;private int mWidth;private int mHeight;private Vector<String> m_lines = new Vector<String>();private int m_fontSize = 24;private int m_textColor = Color.BLACK;private int m_backColor = 0xffff9e85; // 背景颜色private int marginWidth = 10; // 左右与边缘的距离private int marginHeight = 15; // 上下与边缘的距离private int mLineCount; // 每页可以显示的行数private float mVisibleHeight; // 绘制内容的宽private float mVisibleWidth; // 绘制内容的宽private boolean m_isfirstPage,m_islastPage;private Paint mPaint;public BookPageFactory(int w, int h) {mWidth = w;mHeight = h;mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setTextAlign(Align.LEFT);mPaint.setTextSize(m_fontSize);mPaint.setColor(m_textColor);mVisibleWidth = mWidth - marginWidth * 2;mVisibleHeight = mHeight - marginHeight * 2;mLineCount = (int) (mVisibleHeight / m_fontSize); // 可显示的行数}public void openbook(String strFilePath) throws IOException {book_file = new File(strFilePath);long lLen = book_file.length();m_mbBufLen = (int) lLen;m_mbBuf = new RandomAccessFile(book_file, "r").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, lLen);}protected byte[] readParagraphBack(int nFromPos) {int nEnd = nFromPos;int i;byte b0, b1;if (m_strCharsetName.equals("UTF-16LE")) {i = nEnd - 2;while (i > 0) {b0 = m_mbBuf.get(i);b1 = m_mbBuf.get(i + 1);if (b0 == 0x0a && b1 == 0x00 && i != nEnd - 2) {i += 2;break;}i--;}} else if (m_strCharsetName.equals("UTF-16BE")) {i = nEnd - 2;while (i > 0) {b0 = m_mbBuf.get(i);b1 = m_mbBuf.get(i + 1);if (b0 == 0x00 && b1 == 0x0a && i != nEnd - 2) {i += 2;break;}i--;}} else {i = nEnd - 1;while (i > 0) {b0 = m_mbBuf.get(i);if (b0 == 0x0a && i != nEnd - 1) {i++;break;}i--;}}if (i < 0)i = 0;int nParaSize = nEnd - i;int j;byte[] buf = new byte[nParaSize];for (j = 0; j < nParaSize; j++) {buf[j] = m_mbBuf.get(i + j);}return buf;}// 读取上一段落protected byte[] readParagraphForward(int nFromPos) {int nStart = nFromPos;int i = nStart;byte b0, b1;// 根据编码格式判断换行if (m_strCharsetName.equals("UTF-16LE")) {while (i < m_mbBufLen - 1) {b0 = m_mbBuf.get(i++);b1 = m_mbBuf.get(i++);if (b0 == 0x0a && b1 == 0x00) {break;}}} else if (m_strCharsetName.equals("UTF-16BE")) {while (i < m_mbBufLen - 1) {b0 = m_mbBuf.get(i++);b1 = m_mbBuf.get(i++);if (b0 == 0x00 && b1 == 0x0a) {break;}}} else {while (i < m_mbBufLen) {b0 = m_mbBuf.get(i++);if (b0 == 0x0a) {break;}}}int nParaSize = i - nStart;byte[] buf = new byte[nParaSize];for (i = 0; i < nParaSize; i++) {buf[i] = m_mbBuf.get(nFromPos + i);}return buf;}protected Vector<String> pageDown() {String strParagraph = "";Vector<String> lines = new Vector<String>();while (lines.size() < mLineCount && m_mbBufEnd < m_mbBufLen) {byte[] paraBuf = readParagraphForward(m_mbBufEnd); // 读取一个段落m_mbBufEnd += paraBuf.length;try {strParagraph = new String(paraBuf, m_strCharsetName);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}String strReturn = "";if (strParagraph.indexOf("\r\n") != -1) {strReturn = "\r\n";strParagraph = strParagraph.replaceAll("\r\n", "");} else if (strParagraph.indexOf("\n") != -1) {strReturn = "\n";strParagraph = strParagraph.replaceAll("\n", "");}if (strParagraph.length() == 0) {lines.add(strParagraph);}while (strParagraph.length() > 0) {int nSize = mPaint.breakText(strParagraph, true, mVisibleWidth,null);lines.add(strParagraph.substring(0, nSize));strParagraph = strParagraph.substring(nSize);if (lines.size() >= mLineCount) {break;}}if (strParagraph.length() != 0) {try {m_mbBufEnd -= (strParagraph + strReturn).getBytes(m_strCharsetName).length;} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return lines;}protected void pageUp() {if (m_mbBufBegin < 0)m_mbBufBegin = 0;Vector<String> lines = new Vector<String>();String strParagraph = "";while (lines.size() < mLineCount && m_mbBufBegin > 0) {Vector<String> paraLines = new Vector<String>();byte[] paraBuf = readParagraphBack(m_mbBufBegin);m_mbBufBegin -= paraBuf.length;try {strParagraph = new String(paraBuf, m_strCharsetName);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}strParagraph = strParagraph.replaceAll("\r\n", "");strParagraph = strParagraph.replaceAll("\n", "");if (strParagraph.length() == 0) {paraLines.add(strParagraph);}while (strParagraph.length() > 0) {int nSize = mPaint.breakText(strParagraph, true, mVisibleWidth,null);paraLines.add(strParagraph.substring(0, nSize));strParagraph = strParagraph.substring(nSize);}lines.addAll(0, paraLines);}while (lines.size() > mLineCount) {try {m_mbBufBegin += lines.get(0).getBytes(m_strCharsetName).length;lines.remove(0);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}m_mbBufEnd = m_mbBufBegin;return;}protected void prePage() throws IOException {if (m_mbBufBegin <= 0) {m_mbBufBegin = 0;m_isfirstPage=true;return;}else m_isfirstPage=false;m_lines.clear();pageUp();m_lines = pageDown();}public void nextPage() throws IOException {if (m_mbBufEnd >= m_mbBufLen) {m_islastPage=true;return;}else m_islastPage=false;m_lines.clear();m_mbBufBegin = m_mbBufEnd;m_lines = pageDown();}public void onDraw(Canvas c) {if (m_lines.size() == 0)m_lines = pageDown();if (m_lines.size() > 0) {if (m_book_bg == null)c.drawColor(m_backColor);elsec.drawBitmap(m_book_bg, 0, 0, null);int y = marginHeight;for (String strLine : m_lines) {y += m_fontSize;c.drawText(strLine, marginWidth, y, mPaint);}}float fPercent = (float) (m_mbBufBegin * 1.0 / m_mbBufLen);DecimalFormat df = new DecimalFormat("#0.0");String strPercent = df.format(fPercent * 100) + "%";int nPercentWidth = (int) mPaint.measureText("999.9%") + 1;c.drawText(strPercent, mWidth - nPercentWidth, mHeight - 5, mPaint);}public void setBgBitmap(Bitmap BG) {m_book_bg = BG;}public boolean isfirstPage() {return m_isfirstPage;}public boolean islastPage() {return m_islastPage;}}

//电子书阅读主类

public class Turntest extends Activity {private PageWidget mPageWidget;Bitmap mCurPageBitmap, mNextPageBitmap;Canvas mCurPageCanvas, mNextPageCanvas;BookPageFactory pagefactory;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);mPageWidget = new PageWidget(this);setContentView(mPageWidget);mCurPageBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);mNextPageBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);mCurPageCanvas = new Canvas(mCurPageBitmap);mNextPageCanvas = new Canvas(mNextPageBitmap);pagefactory = new BookPageFactory(480, 800);pagefactory.setBgBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.bg));try {pagefactory.openbook("/sdcard/test.txt");pagefactory.onDraw(mCurPageCanvas);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();Toast.makeText(this, "电子书不存在,请将《test.txt》放在SD卡根目录下",Toast.LENGTH_SHORT).show();}mPageWidget.setBitmaps(mCurPageBitmap, mCurPageBitmap);mPageWidget.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent e) {boolean ret=false;if (v == mPageWidget) {if (e.getAction() == MotionEvent.ACTION_DOWN) {mPageWidget.abortAnimation();mPageWidget.calcCornerXY(e.getX(), e.getY());pagefactory.onDraw(mCurPageCanvas);if (mPageWidget.DragToRight()) {try {pagefactory.prePage();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}if(pagefactory.isfirstPage())return false;pagefactory.onDraw(mNextPageCanvas);} else {try {pagefactory.nextPage();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}if(pagefactory.islastPage())return false;pagefactory.onDraw(mNextPageCanvas);}mPageWidget.setBitmaps(mCurPageBitmap, mNextPageBitmap);}               ret = mPageWidget.doTouchEvent(e);return ret;}return false;}});}}

Android app的电子书翻页卷曲功能_第1张图片

更多相关文章

  1. 10本最新的Android开发电子书免费下载
  2. 疯狂Android讲义(奋斗的小鸟)_PDF 电子书
  3. 珍藏的Android电子书
  4. Android ListView的背景和黑色边缘化的问题
  5. 免费电子书《Android 研发工程师高级进阶》
  6. 12本最棒的Android开发电子书强力推荐
  7. OpenCV自学笔记31. Android 上使用jni和opencv 实现边缘检测和直
  8. 苹果为“制裁”亚马逊,禁止Kindle应用内购买电子书
  9. Android opencv(三) 边缘检测Sobel、Canny

随机推荐

  1. php 显示某一个时间相当于当前时间在多少
  2. php默认有最大执行时间
  3. nginx + fastcgi  php配置下,安全的文件
  4. 如何使用变量访问多维数组中的某些元素?
  5. php 基本的常用字符串函数
  6. Laravel Migration - 创建从现有列填充
  7. 天气预报API接口大全
  8. 《Zend studio 12 + UPUPW+PHP5.4开发平
  9. 使用jQuery和ajax更改浏览器地址栏URL,无
  10. php-fpm的两种配置方式