Android开发当中,尤其是在做电子书等方面的项目时,难免会遇到翻书效果的使用。下面就来讲解下,实现翻书效果的实例。
 
  eBook继承FrameLayout,好处在于FrameLayout有图层效果,后添加的View类能覆盖前面的View。
 
  初始化:定义一个LinearLayout的成员变量mView,将page.xml inflate 成View分别用leftPage,rightPage引用,并初始化其数据,将leftPage,rightPage通过addView添加到 mView,然后将mView添加到eBook。在eBook里定义一个私有类BookView extends View。 并定义成员变量 BookView mBookView; 最后将mBookView添加的eBook中,这样,mView中的内容为书面内容,mBookView中的内容为特效内容。后续手势动作:可将各种手势的特效动作画于mBookView的画布中。
 
  Java代码:
 
  package eoe.book;
 
  import Android.app.Activity;
 
  import android.os.Bundle;
 
  import android.util.Log;
 
  import android.view.View;
 
  import android.widget.ImageView;
 
  public class Book extends Activity {
 
  /** Called when the activity is first 
created. */
 
  eBook mBook;
 
  public void onCreate(Bundle savedInstanceState) {
 
  super.onCreate(savedInstanceState);
 
  setContentView(R.layout.main);
 
  mBook = (eBook)findViewById(R.id.my_book);
 
  mBook.addLayoutRecForPage(R.layout.page,21);
 
  mBook.setListener(new eBook.Listener() {
 
  public void onPrevPage() {
 
  updateContent();
 
  }
 
  public void onNextPage() {
 
  updateContent();
 
  }
 
  public void onInit() {
 
  updateContent();
 
  }
 
  });
 
  }
 
  private void updateContent(){
 
  int index = mBook.getIndexForLeftPage();
 
  View left = mBook.getLeftPage(),right = mBook.getRightPage();
 
  View next1 = mBook.getNextPage1(),next2 = mBook.getNextPage2();
 
  View prev1 = mBook.getPrevPage1(),prev2 = mBook.getPrevPage2();
 
  if(left != null)setImg(left,index);
 
  if(right != null)setImg(right,index+1);
 
  if(next1 != null)setImg(next1,index+2);
 
  if(next2 != null)setImg(next2,index+3);
 
  if(prev1 != null)setImg(prev1,index-1);
 
  if(prev2 != null)setImg(prev2,index-2);
 
  mBook.invalidate();
 
  }
 
  private void setImg(View v , int index){
 
  if(index >= 0 && index < 20){
 
  ImageView img = (ImageView)v.findViewById(R.id.book_img);
 
  if(img == null)return;
 
  Log.d("eBook","set Img");
 
  switch(index%6){
 
  case 0:
 
  img.setImageResource(R.drawable.p1);
 
  
break;
 
  case 1:
 
  img.setImageResource(R.drawable.p2);
 
  break;
 
  case 2:
 
  img.setImageResource(R.drawable.p3);
 
  break;
 
  case 3:
 
  img.setImageResource(R.drawable.p4);
 
  break;
 
  case 4:
 
  img.setImageResource(R.drawable.p5);
 
  break;
 
  case 5:
 
  img.setImageResource(R.drawable.p6);
 
  break;
 
  default:
 
  break;
 
  }
 
  }
 
  }
 
  }
 
  我们在来看看xml代码:
 
  java代码:
 
  main.xml文件:
 
  <?xml version="1.0" encoding="utf-8"?>
 
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
  android:orientation="vertical"
 
  android:layout_width="fill_parent"
 
  android:layout_height="fill_parent">
 
  <com.book.eBook android:id="@+id/my_book"
 
  android:layout_width="fill_parent"
 
  android:layout_height="fill_parent"/>
 
  </LinearLayout>
 
  page.xml文件:
 
  <?xml version="1.0" encoding="utf-8"?>
 
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
  android:orientation="vertical"
 
  android:layout_width="fill_parent"
 
  android:layout_height="fill_parent"
 
  android:padding="20dip"
 
  android:background="#FFFFDD">
 
  <ImageView android:layout_width="fill_parent" android:id="@+id/book_img"
 
  android:layout_height="fill_parent" android:layout_weight="1"
 
  android:scaleType="fitXY" android:src="@drawable/p1"/>
 
  <com.book.TelEdit
 
  android:id="@+id/book_text"
 
  android:layout_width="fill_parent"
 
  android:background="#ffffdd"
 
  android:gravity="top"
 
  android:typeface="sans"
 
  android:capitalize="sentences"
 
  android:lineSpacingExtra="5dip"
 
  android:textSize="15dip"
 
  android:textColor="#000000"
 
  android:layout_height="fill_parent"
 
  android:paddingTop="30dip"
 
  android:layout_weight="1"/>
 
  </LinearLayout>
 
 
 
  控件TelEdit.java代码:
 
  java代码:
 
  package eoe.book;
 
  import android.content.Context;
 
  import android.graphics.Canvas;
 
  import android.graphics.Color;
 
  import android.graphics.Paint;
 
  import android.util.AttributeSet;
 
  import android.view.WindowManager;
 
  import android.widget.EditText;
 
  public class TelEdit extends EditText {
 
  Context mContext;
 
  public TelEdit(Context context) {
 
  super(context);
 
  mContext = context;
 
  }
 
  public TelEdit(Context context, AttributeSet attrs) {
 
  super(context, attrs);
 
  mContext = context;
 
  }
 
  public TelEdit(Context context, AttributeSet attrs, int defStyle) {
 
  super(context, attrs, defStyle);
 
  mContext = context;
 
  }
 
  protected void onDraw(Canvas 
canvas) {
 
  WindowManager wm = (WindowManager) mContext.getSystem
Service("window");
 
  int windowWidth = wm.get
DefaultDisplay().getWidth();
 
  int windowHeight = wm.getDefaultDisplay().getHeight();
 
  Paint paint = new Paint();
 
  paint.setStyle(Paint.Style.FILL);
 
  paint.setColor(Color.BLACK);
 
  int paddingTop = getPaddingTop();
 
  int paddingBottom = getPaddingBottom();
 
  int scrollY = getScrollY();
 
  int scrollX = getScrollX() + windowWidth;
 
  int innerHeight = scrollY + getHeight() - paddingBottom;
 
  int lineHeight = getLineHeight();
 
  int baseLine = scrollY+ (lineHeight - ((scrollY - paddingTop) % lineHeight));
 
  int x = 8;
 
  while (baseLine < innerHeight) {
 
  canvas.drawLine(x, baseLine, scrollX - x, baseLine, paint);
 
  baseLine += lineHeight;
 
  }
 
  super.onDraw(canvas);
 
  }
 
  }
 
  
 
  eBook.java文件部分代码:
 
  java代码:
 
  package eoe.book;
 
  import java.util.ArrayList;
 
  import java.util.Date;
 
  import java.util.List;
 
  import android.content.Context;
 
  import android.graphics.Bitmap;
 
  import android.graphics.Canvas;
 
  import android.graphics.Color;
 
  import android.graphics.LinearGradient;
 
  import android.graphics.Paint;
 
  import android.graphics.Path;
 
  import android.graphics.Point;
 
  import android.graphics.PorterDuffXfermode;
 
  import android.graphics.Shader;
 
  import android.graphics.PorterDuff.Mode;
 
  import android.util.AttributeSet;
 
  import android.util.Log;
 
  import android.view.GestureDetector;
 
  import android.view.
LayoutInflater;
 
  import android.view.MotionEvent;
 
  import android.view.View;
 
  import android.view.GestureDetector.OnGestureListener;
 
  import android.widget.FrameLayout;
 
  import android.widget.LinearLayout;
 
  public class eBook extends FrameLayout{
 
  public static final String LOG_TAG = "eBook";
 
  List<Integer> myRecPages;
 
  int totalPageNum;
 
  Context mContext;
 
  boolean 
hasInit = false;
 
  final int defaultWidth = 600 , defaultHeight = 400;
 
  int contentWidth = 0;
 
  int contentHeight = 0;
 
  View leftPage,rightPage,llPage,lrPage,rrPage,rlPage;
 
  LinearLayout mView;
 
  bookView mBookView;
 
  boolean closeBook = false;
 
  private enum Corner {
 
  LeftTop,RightTop,LeftBottom,RightBottom,None
 
  };
 
  private Corner mSelectCorner;
 
  final int clickCornerLen = 250*250; //50dip
 
  float scrollX = 0,scrollY = 0;
 
  int indexPage = 0;
 
  private enum State {
 
  ABOUT_TO_ANIMATE,ANIMATING,ANIMATE_END,READY,TRACKING
 
  };
 
  private State mState;
 
  private Point aniStartPos;
 
  private Point aniStopPos;
 
  private Date aniStartTime;
 
  private long aniTime = 2000;
 
  private long timeOffset = 900;
 
  Listener mListener;
 
  private GestureDetector mGestureDetector;
 
  private BookOnGestureListener mGestureListener;
 
  public eBook(Context context) {
 
  super(context);
 
  Init(context);
 
  }
 
  public eBook(Context context, AttributeSet attrs) {
 
  super(context, attrs);
 
  Init(context);
 
  }
 
  }