转载请注明来自: 5进制空间-android区

相信做电子书的同学,都遇到过翻页动画的需求吧,如果你不满足与点击滑动翻页的话,这边文章应该能够帮助到你。

先上个效果图:

[img]http://www.91dota.com/wp-content/uploads/2011/07/46868_1305273411StiA.png[/img]

[img]http://www.91dota.com/wp-content/uploads/2011/07/46868_1305273434VKb0.png[/img]

效果还是很不错的,不过与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);   

//        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:

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翻页效果原理实现之引入折线

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

  3. Android翻页效果

    先上个效果图: 效果还是很不错的,不过与ibook那个效果比起来,还是有差距的.应为这个没用到openGL做3D效果,只是用的2d的canvas画布去画的view,添加了阴影效果,还是挺有立体感的.而 ...

  4. android 电子书源码,翻页效果

    这两天模仿着做了一个apk电子书的应用,有翻页效果,本来是想学一下自己写的,无奈,最后偷懒使用了别人写的 翻页类 PageWidget.java 下面是工程文件的结构 这个是写的类的包结构,PageV ...

  5. Delphi 10.4.2 轻松实现Android/IOS txt小说电子书阅读器应用APP翻页效果

    Delphi 10.4.2是最新版本的跨平台本机应用开发工具,一套代码可编译到五个操作系统上:iOS.Android.Windows.macOS 和 Linux: 本代码仅仅数十行即可轻松实现Andr ...

  6. Android 实现书籍翻页效果----升级篇

    自从之前发布了<Android 实现书籍翻页效果----完结篇 >之后,收到了很多朋友给我留言,前段时间由于事情较多,博客写得太匆忙很多细节地方没有描述清楚.所以不少人对其中的地方有不少不 ...

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

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

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

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

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

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

最新文章

  1. PHP带重试功能的curl
  2. python的可变长参数
  3. EasyUI datagrid : 启用行号、固定列及多级表头后,头部行号位置单元格错位的问题...
  4. LiveVideoStack线上交流分享 ( 三 ) —— 实时视频通信质量评价及寻找视频质量甜点的方法...
  5. MongoDB监控及报警
  6. 面试官不讲武德,竟然问了我18个JVM问题!
  7. ES6基础之——对象表达式
  8. hdfs 多租户_Hadoop多租户架构配置
  9. kmeans算法和kmeans++
  10. java 微信 百度地图,android 百度地图gps转百度地图坐标java.lang.UnsatisfiedLinkError: CoordinateEncryptEx...
  11. 软件工程师面试7大技巧
  12. 分享10个可免费使用的网站CDN加速服务
  13. NOI2015 小园丁和老司机
  14. 服务器显示raid报警,Raid为什么会出现故障?RAID/服务器恢复
  15. 【书影观后感 五】你的名字
  16. 关于Window10系统无法打开Microsoft Store(应用商店)解决方案
  17. html跑车模板,html5代码画兰博基尼跑车,6不6?
  18. .NET的前景如何?你的问题答案都在这里-2017
  19. 亚马逊国际站通过ASIN获取商品信息
  20. Django MVT简单实例

热门文章

  1. Unity3D中使用easyroad3d插件 删除道路
  2. 计算机英语口语面试自我介绍,2018考研复试面试英语口语自我介绍范文6
  3. 此电脑下的默认7个文件夹路径修改
  4. 复杂网络分析软件小结
  5. SaaS、CRM、OA、ERP、HR、进销存究竟是什么?
  6. 在网页中插入一个透明背景的PNG图片
  7. JSP类计算机专业毕业设计题目课题选题
  8. Apache hop web构建及部署
  9. 为程序员精心定制的对联,有没有感觉中招
  10. oracle建库sid大写,oracle解除账号锁定ORA-01078错误举例:SID的大小写错误