先上个效果图:

效果还是很不错的,不过与ibook那个效果比起来,还是有差距的。应为这个没用到openGL做3D效果,只是用的2d的canvas画布去画的view,添加了阴影效果,还是挺有立体感的。而且比较流畅。openGL实现肯定效果会更好,不过就我目前的技术实力,实现希望还是渺茫的。

废话少说,还是上代码吧:

这里需要两个UI的view类和一个使用方法的demo。
第一个pageTurnerView.java:
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);    
   
//        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PageTurner);    
   
//        this.mBackPage = a.getDrawable(1);    
//        this.mPageBackground = a.getDrawable(0);    
//    
//        this.mPageId = a.getResourceId(3, -1);    
//    
//        this.mCorner = a.getInt(2, 0);    
//          this.mBackPage = this.getResources().getDrawable(com.tom.clip.R.drawable.a5);    
//          this.mPageBackground =this.getResources().getDrawable(com.tom.clip.R.drawable.a6);    
                
          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.mNextTime = (SystemClock.uptimeMillis() + 5L);    
          this.mHandler.sendMessageAtTime(msg, this.mNextTime);    
      }    
   
      public void stepPageTurn() {    
          if (!this.mStepping) {    
              this.mStepping = true;    
              startPageTurn(this.mTimeStep);    
          } else {    
//          te((int)bx, 0, (int)mPageTurnCorner.x, (int)mPageTurnCorner.y);    
//            sendUIhandler();    
              refreshUI();    
          }    
      }    
      public void refreshUI(){    
          computePageTurn();    
//      
          this.invalidate();    
      }    
      private void sendUIhandler(){    
          Message msg = this.mHandler.obtainMessage(1);    
          this.mNextTime = (SystemClock.uptimeMillis() + 30L);    
          this.mHandler.sendMessageAtTime(msg, this.mNextTime);    
      }    
      private boolean updateTimeStep() {    
          if (this.mTimeStep >mMaxStep || this.mTimeStep<0) {    
              return false;    
          }    
          this.mTimeStep +=mStepLen;    
          return true;    
      }    
          
      private boolean computePageTurn() {    
//        if ((this.mDrawnTimeStep == this.mTimeStep) ||(this.mTimeStep <0)||(this.mTimeStep >this.mMaxStep)) {    
          if ( (this.mTimeStep <0)||(this.mTimeStep >this.mMaxStep)) {    
              return false;    
          }    
          if (this.mPage == null) {    
              return false;    
          }    
          this.mDrawnTimeStep = this.mTimeStep;    
          View child = this.mPage.getChildAt(0);    
          child.getDrawingRect(this.mChildRect);    
//        this.mOuterOffsetX = (child.getLeft() - getLeft());    
//        this.mOuterOffsetY = (child.getTop() - getTop());    
          this.mOuterOffsetX = 0;    
          this.mOuterOffsetY = 0;    
   
          float width = this.mChildRect.right;    
          float height = this.mChildRect.bottom;    
          if(!mStepping){    
              this.mPivotX = (this.mTimeStep / 30.0f * width);    
          }    
          this.mForegroundPath = new Path();    
          this.mBackPagePath = new Path();    
          this.mBackgroundPath = new Path();    
          float slope = width / (this.mPivotX - width);    
          float y = this.mPivotX * slope;    
   
          this.mPageTurnCorner.x = 0.0F;    
          this.mPageTurnCorner.y = height;    
          this.mOppositeCorner.x = width;    
          this.mOppositeCorner.y = 0.0F;    
          float x0 = this.mPivotX;    
          float cornerIntersect = height * width / (height + width);    
          if ((this.mCorner & 0x1) != 0) {    
              this.mPageTurnCorner.x = width;    
              this.mOppositeCorner.x = 0.0F;    
              x0 = width - x0;    
          }    
   
          if ((this.mCorner & 0x2) != 0) {    
              this.mPageTurnCorner.y = 0.0F;    
              this.mOppositeCorner.y = height;    
          }    
   
          this.mPageDim.x = width;    
          this.mPageDim.y = height;    
          float page_slope;    
   
          if (this.mPivotX <= cornerIntersect) {    
              page_slope = firstHalfPageTurn(this.mPageDim, this.mPageTurnCorner, this.mOppositeCorner, x0, slope, y);    
          } else {    
              page_slope = secondHalfPageTurn(this.mPageDim, this.mPageTurnCorner, this.mOppositeCorner, x0, slope, y);    
          }    
   
          this.mRotation = (float)Math.atan(page_slope);    
   
          this.mRotation = (float)(-this.mRotation * 180.0D / 3.141592653589793D);    
   
          return true;    
      }    
   
      private float firstHalfPageTurn(PointF pageDim, PointF pageTurnCorner, PointF oppositeCorner, float xPivot, float slope, float y) {    
          float width = pageDim.x;    
          float height = pageDim.y;    
          View child = this.mPage.getChildAt(0);    
          int innerOffsetX = child.getLeft() - this.mPage.getLeft();    
          int innerOffsetY = child.getTop() - this.mPage.getTop();    
   
          float y1 = height + y;    
   
          float x2 = (float)(2.0D * y / (slope + 1.0D / slope));    
          float y2 = height + x2 / slope;    
          float page_slope = (height - y2) / (x2 - this.mPivotX);    
          if ((this.mCorner & 0x1) != 0) {    
              x2 = width - x2;    
              page_slope = -page_slope;    
          }    
          if ((this.mCorner & 0x2) != 0) {    
              y1 = height - y1;    
              y2 = height - y2;    
              page_slope = -page_slope;    
          }    
   
          float x0 = xPivot;    
          float x1 = pageTurnCorner.x;    
   
              
          //a点是右上角,b点位左下角,c点为右下角,d点为固定的右下角    
          ax=this.mOuterOffsetX + x1;    
          ay=this.mOuterOffsetY + y1;    
              
          bx=this.mOuterOffsetX + x2;    
          by=this.mOuterOffsetY + y2;    
              
          cx=this.mOuterOffsetX + x0;    
          cy=this.mOuterOffsetY + pageTurnCorner.y;    
              
          dx=this.mOuterOffsetX + pageTurnCorner.x;    
          dy=this.mOuterOffsetY + pageTurnCorner.y;    
              
          ex=(dx+bx)/2;    
          ey=(dy+by)/2;    
              
          this.mForegroundPath.moveTo(innerOffsetX + x1, innerOffsetY + y1);    
          this.mForegroundPath.lineTo(innerOffsetX + pageTurnCorner.x, innerOffsetY + oppositeCorner.y);    
          this.mForegroundPath.lineTo(innerOffsetX + oppositeCorner.x, innerOffsetY + oppositeCorner.y);    
          this.mForegroundPath.lineTo(innerOffsetX + oppositeCorner.x, innerOffsetY + pageTurnCorner.y);    
          this.mForegroundPath.lineTo(innerOffsetX + x0, innerOffsetY + pageTurnCorner.y);    
          this.mForegroundPath.lineTo(innerOffsetX + x2, innerOffsetY + y2);    
//        this.mForegroundPath.quadTo(ex, ey, bx, by);    
          this.mForegroundPath.lineTo(innerOffsetX + x1, innerOffsetY + y1);    
   
          this.mBackPagePath.moveTo(this.mOuterOffsetX + x1, this.mOuterOffsetY + y1);    
          this.mBackPagePath.lineTo(this.mOuterOffsetX + x2, this.mOuterOffsetY + y2);    
          //b到c的那条线,可以考虑画个弧线    
          this.mBackPagePath.lineTo(this.mOuterOffsetX + x0, this.mOuterOffsetY + pageTurnCorner.y);    
//        this.mBackPagePath.arcTo(new RectF(bx,by,cx,cy), 220, 180,false);    
//        this.mBackPagePath.quadTo(ex, ey, cx, cy);    
//        this.mBackPagePath.cubicTo(100, -50, 200, 50, cx, cy);//贝赛尔曲线    
          this.mBackPagePath.lineTo(this.mOuterOffsetX + x1, this.mOuterOffsetY + y1);    
   
              
          this.mBackgroundPath.moveTo(this.mOuterOffsetX + x1, this.mOuterOffsetY + y1);    
          this.mBackgroundPath.lineTo(this.mOuterOffsetX + x0, this.mOuterOffsetY + pageTurnCorner.y);    
          this.mBackgroundPath.lineTo(this.mOuterOffsetX + pageTurnCorner.x, this.mOuterOffsetY + pageTurnCorner.y);    
          this.mBackgroundPath.lineTo(this.mOuterOffsetX + x1, this.mOuterOffsetY + y1);    
   
          return page_slope;    
      }    
          
   
      private float secondHalfPageTurn(PointF pageDim, PointF pageTurnCorner, PointF oppositeCorner, float xPivot, float slope, float y) {    
          float width = pageDim.x;    
          float height = pageDim.y;    
          View child = this.mPage.getChildAt(0);    
          int xOffset = child.getLeft() - this.mPage.getLeft();    
          int yOffset = child.getTop() - this.mPage.getTop();    
   
          float y1 = 0.0F;    
          float x1 = width - (height + width) * (width - this.mPivotX) / width;    
   
          float x3 = (float)(2.0D * y / (slope + 1.0D / slope));    
          float y3 = height + x3 / slope;    
          float page_slope = (height - y3) / (x3 - this.mPivotX);    
          float b = height - x1 * page_slope;    
          float x2 = (float)((-y - b) / (page_slope + 1.0D / page_slope));    
          float y2 = (x1 - x2) * page_slope;    
   
          if ((this.mCorner & 0x1) != 0) {    
              x1 = width - x1;    
              x2 = width - x2;    
              x3 = width - x3;    
              page_slope = -page_slope;    
          }    
          if ((this.mCorner & 0x2) != 0) {    
              y1 = height - y1;    
              y2 = height - y2;    
              y3 = height - y3;    
              page_slope = -page_slope;    
          }    
   
          float x0 = xPivot;    
   
          this.mForegroundPath.moveTo(xOffset + x1, yOffset + y1);    
          this.mForegroundPath.lineTo(xOffset + oppositeCorner.x, yOffset + oppositeCorner.y);    
          this.mForegroundPath.lineTo(xOffset + oppositeCorner.x, yOffset + pageTurnCorner.y);    
          this.mForegroundPath.lineTo(xOffset + x0, yOffset + pageTurnCorner.y);    
          this.mForegroundPath.lineTo(xOffset + x1, yOffset + y1);    
   
        //a点是右上角,c0点位左上角,b点为左下角,d点为固定的右下角    
          ax=this.mOuterOffsetX + x1;    
          ay=this.mOuterOffsetY + y1;    
              
          c0x=this.mOuterOffsetX + x2;    
          c0y=this.mOuterOffsetY + y2;    
              
          bx=this.mOuterOffsetX + x3;    
          by=this.mOuterOffsetY + y3;    
          cx=this.mOuterOffsetX + x0;    
          cy=this.mOuterOffsetY + pageTurnCorner.y;    
              
          dx=this.mOuterOffsetX + pageTurnCorner.x;    
          dy=this.mOuterOffsetY + pageTurnCorner.y;    
              
          ex=(dx+bx)/2;    
          ey=(dy+by)/2;    
              
          this.mBackPagePath.moveTo(this.mOuterOffsetX + x1, this.mOuterOffsetY + y1);    
          this.mBackPagePath.lineTo(this.mOuterOffsetX + x2, this.mOuterOffsetY + y2);    
          this.mBackPagePath.lineTo(this.mOuterOffsetX + x3, this.mOuterOffsetY + y3);    
          this.mBackPagePath.lineTo(this.mOuterOffsetX + x0, this.mOuterOffsetY + pageTurnCorner.y);    
//        this.mBackPagePath.quadTo(ex, ey, cx, cy);    
          this.mBackPagePath.lineTo(this.mOuterOffsetX + x1, this.mOuterOffsetY + y1);    
            
              
              
          this.mBackgroundPath.moveTo(this.mOuterOffsetX + x1, this.mOuterOffsetY + y1);    
          this.mBackgroundPath.lineTo(this.mOuterOffsetX + x0, this.mOuterOffsetY + pageTurnCorner.y);    
          this.mBackgroundPath.lineTo(this.mOuterOffsetX + pageTurnCorner.x, this.mOuterOffsetY + pageTurnCorner.y);    
          this.mBackgroundPath.lineTo(this.mOuterOffsetX + pageTurnCorner.x, this.mOuterOffsetY + oppositeCorner.y);    
          this.mBackgroundPath.lineTo(this.mOuterOffsetX + x1, this.mOuterOffsetY + y1);    
   
          return page_slope;    
      }    
   
      private void drawBackground(Canvas canvas) {    
          canvas.save();    
//        canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));    
          canvas.clipPath(this.mBackgroundPath, Region.Op.INTERSECT);    
          canvas.translate(this.mOuterOffsetX, this.mOuterOffsetY);    
              
          if (this.mPageBackground != null) {    
              this.mPageBackground.setBounds(0, 0, this.mChildRect.right, this.mChildRect.bottom);    
   
              this.mPageBackground.draw(canvas);    
          }    
          if (this.mPage != null) {    
              this.mPage.drawBackground(canvas);    
          }    
              
        // add drop shadow start test    
            if(mTimeStep<=29&&ex>2){    
            LinearGradient grad = new LinearGradient(    
                    ex,ey,ex+(dx-ex)/4,ey+(dy-ey)/4,R.color.gray3,Color.TRANSPARENT,Shader.TileMode.CLAMP);    
            Paint p=new Paint();    
            p.setShader(grad);    
//          p.setAlpha(120);    
            canvas.drawPath(this.mBackgroundPath,p);    
            //end test    
            }    
          canvas.restore();    
              
            
      }    
   
      private void drawBackPage(Canvas canvas) {    
          float width = this.mChildRect.right;    
          float height = this.mChildRect.bottom;    
          canvas.save();    
//        canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));    
          canvas.clipPath(this.mBackPagePath, Region.Op.INTERSECT);    
          float xShift = 2.0F * this.mPivotX - width;    
          float xRotate = width - this.mPivotX;    
          float yRotate = height;    
          if ((this.mCorner & 0x1) != 0) {    
              xShift = width - 2.0F * this.mPivotX;    
              xRotate = this.mPivotX;    
          }    
          if ((this.mCorner & 0x2) != 0) {    
              yRotate = 0.0F;    
          }    
          canvas.translate(this.mOuterOffsetX + xShift, this.mOuterOffsetY);    
          canvas.rotate(this.mRotation, xRotate, yRotate);    
              
          //画原本的背面    
          if (this.mBackPage != null) {    
              this.mBackPage.setBounds(0, 0, this.mChildRect.right, this.mChildRect.bottom);    
              this.mBackPage.draw(canvas);    
          }    
          //画回调函数中的画背面    
          if (this.mPage != null) {    
                Log.v("log2 drawBackPage2:", "drawing back page");    
              this.mPage.drawBackPage(canvas);    
          }    
              
          canvas.restore();    
          canvas.save();    
//        canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));    
//        int[] colors={Color.BLACK,Color.GRAY,Color.BLACK};    
//          LinearGradient grad = new LinearGradient(    
//                  ex,ey,bx,by,colors,null,Shader.TileMode.CLAMP);    
//          Paint p=new Paint();    
//          p.setShader(grad);    
//          p.setAlpha(120);    
//          canvas.drawPath(this.mBackPagePath,p);    
            LinearGradient grad = new LinearGradient(    
                    ex,ey,ex-(ex-bx)/4,ey-(ey-by)/4,R.color.gray3,0xC9C9C9,Shader.TileMode.CLAMP);    
            Paint p=new Paint();    
            p.setShader(grad);    
//          p.setAlpha(120);    
            canvas.drawPath(this.mBackPagePath,p);    
            canvas.restore();    
            //中间阴影问题,起点蓝色-》 白色-》 蓝色终点,这样起点前和终点后的区域也为蓝色了。    
            canvas.save();    
//          canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));    
            LinearGradient grad1 = new LinearGradient(    
                    ex-(ex-bx)/4,ey-(ey-by)/4,bx,by,0xC9C9C9,R.color.gray3,Shader.TileMode.CLAMP);    
            Paint p1=new Paint();    
            p1.setShader(grad1);    
//          p1.setAlpha(120);    
            canvas.drawPath(this.mBackPagePath,p1);    
            canvas.restore();    
//    
                
      }    
          
      public int getmTimeStep(){    
              
          return mTimeStep;    
      }    
      public void setmTimeStep(int mTimeStep ){    
              
          this.mTimeStep= mTimeStep;    
      }    
      public boolean getmStepping(){    
              
          return mStepping;    
      }    
      public void setmStepping(boolean mStepping ){    
              
          this.mStepping= mStepping;    
      }    
          
      public void setmStepLen(int mStepLen){    
          this.mStepLen=mStepLen;    
      }    
      public int getmStepLen(){    
          return this.mStepLen;    
      }    
          
      public void setmMaxStep(int mMaxStep){    
          this.mMaxStep=mMaxStep;    
      }    
      public int getmMaxStep(){    
          return this.mMaxStep;    
      }    
   
    public void setPreStart(int where)    
    {    
        switch (where)     
        {    
            case NEXT:    
            case LAST:    
                mWhere = where;    
                break;    
                    
            default:    
                mWhere = KEEP;    
                break;    
        }    
            
        isBgInit = true;    
        isBackInit = true;    
            
    }    
        
        
}

第二个view类pageView.java:

Java代码 
public class PageViewP1 extends RelativeLayout { 
    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 Path mClipPath; 
    private PageTurnerViewP1 mPageTurner; 
    private Callback mCallback; 
    private int mCorner; 
    private Drawable mBackPage; 
    private Drawable mPageBackground; 
  
    public PageViewP1(Context context) { 
        super(context); 
    } 
  
    public PageViewP1(Context context, AttributeSet attrs ) { 
        super(context, attrs ); 
  
        this.mBackPage =this.getBackground(); 
        this.mCorner = -1; 
    } 
  
    void setPageTurner(PageTurnerViewP1 pageTurnerViewP1) { 
        this.mPageTurner = pageTurnerViewP1; 
    } 
  
    void setClipPath(Path clipPath) { 
        this.mClipPath = clipPath; 
    } 
  
    public void setCallback(Callback callback)  { 
        this.mCallback = callback; 
    } 
  
    void drawBackPage(Canvas canvas) { 
       if (this.mCallback != null) 
           this.mCallback.onDrawBackPage(canvas); 
    } 
  
    void drawBackground(Canvas canvas) { 
        if (this.mCallback != null) 
            this.mCallback.onDrawBackground(canvas); 
    } 
  
    public void startPageTurn() { 
        if (this.mPageTurner != null) 
            this.mPageTurner.startPageTurn(0); 
    } 
  
    void onPageTurnFinished(Canvas canvas) { 
        this.mCallback.onPageTurnFinished(canvas); 
        this.mClipPath = null; 
    } 
  
    protected void dispatchDraw(Canvas canvas) { 
        if (this.mClipPath != null) { 
            canvas.save(); 
            canvas.clipPath(this.mClipPath, Region.Op.INTERSECT); 
        } 
        super.dispatchDraw(canvas); 
        if (this.mClipPath != null) 
            canvas.restore(); 
    } 
  
    public void setCorner(int corner) { 
        this.mCorner = corner; 
    } 
  
    public int getCorner() { 
        return this.mCorner; 
    } 
  
    public void setBackPage(Drawable backPage) { 
        this.mBackPage = backPage; 
    } 
  
    public Drawable getBackPage() { 
        return this.mBackPage; 
    } 
  
    public void setPageBackground(Drawable background) { 
        this.mPageBackground = background; 
    } 
  
    public Drawable getPageBackground() { 
        return this.mPageBackground; 
    } 
  
    public static abstract class Callback { 
        public void onDrawBackPage(Canvas canvas) { 
            Log.v("Callback", "drawing back page"); 
        } 
        public void onDrawBackground(Canvas canvas) { 
            Log.v("Callback2", "drawing back page"); 
        } 
        public void onPageTurnFinished(Canvas canvas) { 
            Log.v("Callback3", "drawing back page"); 
        } 
    } 
}

Android翻页效果相关推荐

  1. Android翻页效果原理实现之翻页的尝试

    炮兵镇楼 在<自定义控件其实很简单>系列的前半部分中我们用了整整六节近两万字两百多张配图讲了Android图形的绘制,虽然篇幅很巨大但仍然只是图形绘制的冰山一角,旨在领大家入门,至于修行成 ...

  2. Android 翻页效果 电子书 (转)

    转载请注明来自: 5进制空间-android区 相信做电子书的同学,都遇到过翻页动画的需求吧,如果你不满足与点击滑动翻页的话,这边文章应该能够帮助到你. 先上个效果图: [img]http://www ...

  3. Android翻页效果原理实现之引入折线

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 尊重原创 ...

  4. Android之实现上下左右翻页效果

    如果实现上下或者左右翻页效果,我们借助下这个开源项目:https://github.com/openaphid/android-flip Aphid FlipView是一个能够实现Flipboard翻 ...

  5. android 仿真翻页动画,Android 两Activity之间动画效果(1)---------翻页效果

    用Android rotate动画实现翻页效果,效果如图: 要实现上面动画,首先搞明白rotate动画原理: (1)Degrees坐标: 0度(360度) 270度 90度  顺时针旋转 180 (2 ...

  6. android做题imageview缩放,巧用ViewPager实现驾考宝典做题翻页效果

    效果如下所示: 思路: a.利用ViewPager自带的动画效果,略作修改,实现滑动覆盖翻页效果. b.移动时加入阴影效果. 1.关键代码如下所示: public class ReaderViewPa ...

  7. linux+手机+翻页,在Android手机上实现阅读器的翻页效果

    本篇文章来谈谈怎么使用java实现翻页效果,就像电子阅读器那样. 现在先来看看翻页的原理图: 先了解各个字母表示的含义: A-把书页翻起来后看到的背面区域 B-把书页翻起来后看到的下一页的一角 C-当 ...

  8. android 右侧点击翻页,巧用ViewPager实现驾考宝典做题翻页效果

    效果如下所示: 思路: a.利用ViewPager自带的动画效果,略作修改,实现滑动覆盖翻页效果. b.移动时加入阴影效果. 1.关键代码如下所示: public class ReaderViewPa ...

  9. android 阅读器自动滚动,在Android手机上实现阅读器翻页效果.doc

    在Android手机上实现阅读器翻页效果 先了解各个字母表示的含义:A-把书页翻起来后看到的背面区域B-把书页翻起来后看到的下一页的一角C-当前页的可见部分.a-手指滑动页角到达的位置b-当前页翻起来 ...

最新文章

  1. Hiredis库的简单使用
  2. 毫米波雷达数据处理_毫米波雷达开启4D时代,助力几何伙伴抢滩自动驾驶量产...
  3. 解决加载静态文件无法被浏览器缓存问题
  4. HTML搜索框中加入提示文字,HTML 5 input placeholder 属性 实现搜索框提示文字点击输入后消失 - 尚码园...
  5. realme GT2 Pro抢先开启盲售:史上屏幕最好高端旗舰
  6. 【nexus】nexus : mac 安装 nexus
  7. html5 心,HTML5你必须知道的28个新特性
  8. [Silverlight 4 RC]WebBrowserBrush概览
  9. Java方法的局限,Java接口有的局限性,它良好而解决了这个问题
  10. java学习--基础知识阶段性总结--多线程
  11. apache设置域名绑定 以及绑定不起作用的排查.
  12. 惠普打印机驱动安装找不到打印机
  13. .Net 中使用 iTextSharp 组件生成 PDF
  14. 在计算机中怎么找到打字的文件,想在电脑上打字,然后把电脑上写的字,弄到纸上怎么做...
  15. 数据结构之线性表,这一篇就够了,吐血总结,建议收藏~~
  16. 问题:_ZN6caffe28TypeMeta21_typeMetaDataInstanceIN3c107complexINS2_4HalfEEEEEPKNS_
  17. 【毕业设计】基于单片机的智能饮水控制系统 - 物联网 嵌入式 stm32 c51
  18. 游戏策划:为什么我的儿子不沉迷游戏
  19. 链接形式的客服代码 QQ客服代码
  20. 真人踩过的坑,告诉你避免自动化测试常犯的10个错误

热门文章

  1. mysql 全局权限_mysql的大局权限GLOBAL PRIVILEGES
  2. 【行业动态】特斯拉线圈如何撼动一个行业:秒开智能锁
  3. 2017.05.19随笔
  4. Android 自定义DatePick 只显示年月,日期选择年月
  5. 关于flickr的数据集笔记
  6. MCS-51 单片机的结构和工作原理
  7. javaone_Java SE 9在JavaOne 2017上达到了Atari般的性能
  8. 养QQ宠物不花Q币?完全可以!(转)
  9. 谷牛期权告诉您什么是个股期权
  10. 群体智能——激发更多潜能