欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android自定义控件创建翻页接口详细代码

程序员文章站 2024-03-04 21:14:12
本文分享的这个类的目的是为在看书翻页时,需要进行的动作提供接口,利用android自定义控件创建翻页接口,具体内容如下 bookpage.java pack...

本文分享的这个类的目的是为在看书翻页时,需要进行的动作提供接口,利用android自定义控件创建翻页接口,具体内容如下

bookpage.java

package com.horse.util;
import java.text.decimalformat;
import java.util.vector;

import com.horse.bean.chapter;

import android.graphics.bitmap;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.paint;
import android.graphics.paint.align;
import android.text.format.time;

/**
 * 这个类的目的是为在看书翻页时,需要进行的动作提供接口。
 * 包括翻向下一页,翻向上一页。在翻到每章最后一页时,如果后面还有章节就继续翻向下一章节,没有就向用户显示已读完。
 * 在翻向上一章节时,如果前面还有章节,就翻到上一章节,没有就向用户显示,这已经是第一章节。
 * 
 * 在直觉上认为这个应该只设置成一个接口,因为只需向视图层提供动作接口,也就是本类应属于模型层。则其设置为一个借口可能也合适。
 * 但是如果设置成一个接口,那么接口的实现类,有多个都要保存的数据。那么为了代码重用,抽象类可能比接口更加合适。 上面是个人分析,可能不是很合适。
 * 
 * @author mjz
 * 
 */
public class bookpage {
 // configuration information
 private int screenwidth; // 屏幕宽度
 private int screenheight; // 屏幕高度
 private int fontsize; // 字体大小
 private int linehgight; //每行的高度
 private int marginwidth = 15; // 左右与边缘的距离
 private int marginheight = 15; // 上下与边缘的距离
 private int textcolor; // 字体颜色
 private bitmap bgbitmap; // 背景图片
 private int bgcolor; // 背景颜色

 private paint paint;
 private paint paintbottom;
 private int visiblewidth; // 屏幕中可显示文本的宽度
 private int visibleheight;
 private chapter chapter; // 需要处理的章节对象
 private vector<string> linesve; // 将章节內容分成行,并将每页按行存储到vector对象中
 private int linecount; // 一个章节在当前配置下一共有多少行

 private string content;
 private int chapterlen; // 章节的长度
 // private int curcharpos; // 当前字符在章节中所在位置
 private int charbegin; // 每一页第一个字符在章节中的位置
 private int charend; // 每一页最后一个字符在章节中的位置
 private boolean isfirstpage;
 private boolean islastpage;

 private vector<vector<string>> pagesve;
 int pagenum;

 /**
 * 在新建一个bookpage对象时,需要向其提供数据,以支持屏幕翻页功能。
 * 
 * @param screenwidth
 *      屏幕宽度,用来计算每行显示多少字
 * @param screenheight
 *      屏幕高度,用来计算每页显示多少行
 * @param chapter
 *      章节对象
 */
 public bookpage(int screenwidth, int screenheight, chapter chapter) {
 this.screenheight = screenheight;
 this.screenwidth = screenwidth;
 this.chapter = chapter;
 init();
 }

 /**
 * 初始最好按照定义变量的顺序来初始化,统一。在将来需要修改某个变量的时候,容易找到。 对代码维护应该也很有用吧。
 */
 protected void init() {
 bgbitmap = null;
 bgcolor = 0xffff9e85;
 textcolor = color.black;
 content = chapter.getcontent();
 chapterlen = content.length();
 // curcharpos = 0;
 charbegin = 0;
 charend = 0;
 fontsize = 30;
 linehgight = fontsize + 8;
 linesve = new vector<string>();

 paint = new paint(paint.anti_alias_flag);
 paint.settextalign(align.left);
 paint.settextsize(fontsize);
 paint.setcolor(textcolor);
 
 paintbottom = new paint(paint.anti_alias_flag);
 paintbottom.settextalign(align.left);
 paintbottom.settextsize(fontsize / 2);
 paintbottom.setcolor(textcolor);

 visiblewidth = screenwidth - marginwidth * 2;
 visibleheight = screenheight - marginheight * 2;
 linecount = visibleheight / linehgight - 2;
 isfirstpage = true;
 islastpage = false;
 pagesve = new vector<vector<string>>();
 pagenum = -1;
 slicepage();
 }

 public vector<string> getcurpage() {
 return linesve;
 }

 protected void slicepage() {
 pagesve.clear();
 int curpos = 0;
 while (curpos < chapterlen) {
  vector<string> lines = new vector<string>();
  charbegin = curpos;
  while (lines.size() < linecount && curpos < chapterlen) {
  int i = content.indexof("\n", curpos);
  string paragraphstr = content.substring(curpos, i);
  // curcharpos += i;
  if (curpos == i)
   lines.add("");

  while (paragraphstr.length() > 0) {
   int horsize = paint.breaktext(paragraphstr, true,
    visiblewidth, null);
   lines.add(paragraphstr.substring(0, horsize));
   paragraphstr = paragraphstr.substring(horsize);
   curpos += horsize;
   if (lines.size() > linecount)
   break;
  }
  // 如果是把一整段读取完的话,需要给当前位置加1
  if (paragraphstr.length() == 0)
   curpos += "\n".length();
  }
  pagesve.add(lines);
 }

 }

 /**
 * 翻到下一页
 */
 public boolean nextpage() {
 if (islastpage()) {
  if (!nextchapter()) // 如果已经到本书末尾,那么不能继续执行翻页代码
  return false;
 }
 /*
  * vector<string> lines = new vector<string>(); charbegin = charend;
  * while (lines.size() < linecount && charend < chapterlen) { int i =
  * content.indexof("\n", charend); string paragraphstr =
  * content.substring(charend, i); // curcharpos += i; if (charend == i)
  * lines.add("");
  * 
  * while (paragraphstr.length() > 0) { int horsize =
  * paint.breaktext(paragraphstr, true, visiblewidth, null);
  * lines.add(paragraphstr.substring(0, horsize)); paragraphstr =
  * paragraphstr.substring(horsize); charend += horsize; if (lines.size()
  * > linecount) break; } // 如果是把一整段读取完的话,需要给当前位置加1 if
  * (paragraphstr.length() == 0) charend += "\n".length(); } linesve =
  * lines;
  */
 linesve = pagesve.get(++pagenum);
 return true;
 }

 /**
 * 翻到上一页
 */
 public boolean prepage() {
 if (isfirstpage()) {
  if (!prechapter()) // 如果已经到本书第一章,就不能继续执行翻页代码
  return false;
 }
 /*
  * vector<string> lines = new vector<string>(); string backstr =
  * content.substring(0, charbegin); charend = charbegin;
  * 
  * while (lines.size() < linecount && charbegin > 0) { int i =
  * backstr.lastindexof("\n"); if(i == -1) i = 0; string paragraphstr =
  * backstr.substring(i, charbegin); vector<string> vet = new
  * vector<string>(lines);
  * 
  * // if(charbegin == i)lines.add("");
  * 
  * while (paragraphstr.length() > 0) { int horsize =
  * paint.breaktext(paragraphstr, true, visiblewidth, null);
  * lines.add(paragraphstr.substring(0, horsize)); paragraphstr =
  * paragraphstr.substring(horsize); charbegin -= horsize; if
  * (lines.size() > linecount) break; }
  * 
  * backstr = content.substring(0, charbegin); int j = -1; for (string
  * line : vet) lines.insertelementat(line, ++j); } linesve = lines;
  */
 linesve = pagesve.get(--pagenum);
 return true;
 }

 /**
 * 跳到下一章,若返回值为false,则当前章节已经为最后一章
 */
 public boolean nextchapter() {
 int order = chapter.getorder();
 chapter tempchapter = iohelper.getchapter(order + 1);
 if (tempchapter == null)
  return false;
 chapter = tempchapter;
 content = chapter.getcontent();
 chapterlen = content.length();
 // curcharpos = 0;
 charbegin = 0;
 charend = 0;
 slicepage();
 pagenum = -1;
 return true;
 }

 /**
 * 跳到上一章,若返回值为false,则当前章节已经为第一章
 */
 public boolean prechapter() {
 int order = chapter.getorder();
 chapter tempchapter = iohelper.getchapter(order - 1);
 if (tempchapter == null)
  return false;
 chapter = tempchapter;
 content = chapter.getcontent();
 chapterlen = content.length();
 // curcharpos = chapterlen;
 charbegin = chapterlen;
 charend = chapterlen;
 slicepage();
 pagenum = pagesve.size();
 return true;
 }

 public boolean isfirstpage() {
 if (pagenum <= 0)
  return true;
 return false;
 }

 public boolean islastpage() {
 if (pagenum >= pagesve.size() - 1)
  return true;
 return false;
 }

 public void draw(canvas c) {
 if (linesve.size() == 0)
  nextpage();
 if (linesve.size() > 0) {
  if (bgbitmap == null)
  c.drawcolor(bgcolor);
  else
  c.drawbitmap(bgbitmap, 0, 0, null);

  int y = marginheight;
  for (string line : linesve) {
  y += linehgight;
  c.drawtext(line, marginwidth, y, paint);
  }
 }

 // float percent = (float) (charbegin * 1.0 / chapterlen);
 float percent = (float) ((pagenum + 1) * 1.0 / pagesve.size());
 decimalformat df = new decimalformat("#0.0");
 string percetstr = df.format(percent * 100) + "%";

 time time = new time();
 time.settonow();
 string timestr;
 if (time.minute < 10)
  timestr = "" + time.hour + " : 0" + time.minute;
 else
  timestr = "" + time.hour + " : " + time.minute;

 int pswidth = (int) paintbottom.measuretext("99.9%") + 2;
 int titwidth = (int) paintbottom.measuretext(chapter.gettitle());

 
 c.drawtext(timestr, marginwidth / 2, screenheight - 5, paintbottom);
 c.drawtext(chapter.gettitle(), screenwidth / 2 - titwidth / 2,
  screenheight - 5, paintbottom);
 c.drawtext(percetstr, screenwidth - pswidth, screenheight - 5, paintbottom);
 }

 public void setbgbitmap(bitmap bmap) {
 bgbitmap = bitmap.createscaledbitmap(bmap, screenwidth, screenheight,
  true);
 }

}

com.horse.bean.chapter

package com.horse.bean;
/**
 * 章节信息,包括标题和内容,及顺序
 * @author mjz
 *
 */
public class chapter { 
 private string title;
 private string content;
 private int order;
 
 public string gettitle() {
 return title;
 }
 public void settitle(string title) {
 this.title = title;
 }
 public string getcontent() {
 return content;
 }
 public void setcontent(string content) {
 this.content = content;
 }
 public int getorder() {
 return order;
 }
 public void setorder(int order) {
 this.order = order;
 }
 
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。