当前位置:操作系统 > 安卓/Android >>

Android翻页效果—电子书

先上个效果图:


 
效果还是很不错的,不过与ibook那个效果比起来,还是有差距的。应为这个没用到openGL做3D效果,只是用的2d的canvas画布去画的 view,添加了阴影效果,还是挺有立体感的。而且比较流畅。openGL实现肯定效果会更好,不过就我目前的技术实力,实现希望还是渺茫的。
废话少说,还是上代码吧:
这里需要两个UI的view类和一个使用方法的demo 。
第一个pageTurnerView.java :

public class PageTurnerViewP1 extends RelativeLayout{
 
   private static final int CORNER_RIGHT_MASK = 1;
   private static final int CORNER_TOP_MASK = 2;
   public static final int CORNER_BOTTOM_LEFT = 0;
   public static final int CORNER_BOTTOM_RIGHT = 1;
   public static final int CORNER_TOP_LEFT = 2;
   public static final int CORNER_TOP_RIGHT = 3;
   private static final int INVALIDATE = 1;
   private static final int INITIAL_TIME_DELAY = 100;
   private static final int TIME_DELAY = 10;
//   private static final int TIME_STEPS = 30;
   private boolean mPageTurning;
   private boolean mStepping;
   public long mNextTime;
   private int mTimeStep;
   private int mDrawnTimeStep;
   private int mCorner;
   private Drawable mBackPage;
   private Drawable mPageBackground;
   private Path mForegroundPath;
   private Path mBackPagePath;
   private Path mBackgroundPath;
   private float mRotation;
   private Rect mChildRect = new Rect();
   private int mOuterOffsetX;
   private int mOuterOffsetY;
   public float mPivotX;
   private int mPageId;
   private PageViewP1 mPage;
   private PointF mPageTurnCorner = new PointF();
   private PointF mOppositeCorner = new PointF();
   private PointF mPageDim = new PointF();
   private int mStepLen = 1;
   public static final int KEEP = 0;
   public static final int NEXT = 1;
   public static final int LAST = 2;
   public int mWhere = KEEP;
   public boolean isBgInit = true;
   public boolean isBackInit = true;
   private  float ax,ay,bx,by,cx,cy,dx,dy,ex,ey,c0x,c0y;
   private int mMaxStep=30;
   public final Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
     if (msg.what != 1) { return; }
//     PageTurnerViewP1.this.invalidate();
     refreshUI();
//     PageTurnerViewP1.this.invalidate((int)bx, (int)ay, (int)dx, (int)dy);
     if (PageTurnerViewP1.this.mStepping) { return; }
     msg = obtainMessage(1);
     long current = SystemClock.uptimeMillis();
     if (PageTurnerViewP1.this.mNextTime < current) {       //PageTurnerViewP1.access$102(PageTurnerViewP1.this, current + 10L);      PageTurnerViewP1.this.mNextTime= current + 5L;      }      sendMessageAtTime(msg, PageTurnerViewP1.this.mNextTime);      //PageTurnerViewP1.access$114(PageTurnerViewP1.this, 10L);     PageTurnerViewP1.this.mNextTime+= 5L;     }    };      public PageTurnerViewP1(Context context) {     super(context);     Log.i("==================== PageTurnerViewP1(Context context) =================", "" + this);    }    public PageTurnerViewP1(Context context, AttributeSet attrs) {     super(context, attrs);         this.mPageId = -1;    this.mCorner = -1;    }    protected void onFinishInflate() {     super.onFinishInflate();     if (this.mPageId != -1) {      this.mPage = ((PageViewP1)findViewById(this.mPageId));      if (this.mPage != null)       this.mPage.setPageTurner(this);     }    }    public void setPageId(int pageId) {     this.mPageId = pageId;     this.mPage = ((PageViewP1)findViewById(this.mPageId));     if (this.mPage != null)      this.mPage.setPageTurner(this);    }    public int getPageId() {     return this.mPageId;    }    public void setPage(PageViewP1 pageViewP1) {     this.mPage = pageViewP1;    }    public PageViewP1 getPage() {     return this.mPage;    }    public void setCorner(int corner) {     this.mCorner = corner;    }    public int getCorner() {     return this.mCorner;    }    protected void dispatchDraw(Canvas canvas) {         Log.v("log dispatchDraw:", "drawing back page"+mPageTurning); //    if ((this.mPageTurning) && (this.mPage != null) && (computePageTurn())) {     if ((computePageTurn())&& (this.mPageTurning) && (this.mPage != null) ) {      this.mPage.setClipPath(this.mForegroundPath);     }     super.dispatchDraw(canvas);     if (this.mPageTurning) {      drawBackground(canvas);      drawBackPage(canvas);            if (!updateTimeStep()) {       this.mHandler.removeMessages(1);       if (this.mPage != null) {        this.mPage.onPageTurnFinished(canvas);       }       this.mPageTurning = false;       this.mStepping = false;       invalidate();      }     }    }    public void startPageTurn(int mTimeStep) {     if ((this.mPage == null) && (this.mPageId != -1)) {      this.mPage = ((PageViewP1)findViewById(this.mPageId));     }     if (this.mPage == null) {      return;     }     this.mPage.setPageTurner(this);     Drawable d = this.mPage.getPageBackground();     if (d != null) {      this.mPageBackground = d;     }     d = this.mPage.getBackPage();     if (d != null) {      this.mBackPage = d;     }     int corner = this.mPage.getCorner();     if (corner != -1) {      this.mCorner = corner;     } //    this.mStepping=false;     this.mPageTurning = true;     this.mTimeStep = mTimeStep;     this.mDrawnTimeStep = -1;     Message msg = this.mHandler.obtainMessage(1);     this.m

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,