两个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:

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");         }     } } 

电子书翻页效果(转)相关推荐

  1. HTML5电子书翻页效果 代码特效+鼠标点击拖拽滑动翻页+点击书页内容放大+不支持中文

    介绍 源码名称:[HTML5电子书翻页效果]代码特效+鼠标点击拖拽滑动翻页+点击书页内容放大+不支持中文 源码大小:237KB 开发语言:PHP+Mysql 操作系统:Windows,Linux 源码 ...

  2. 获得一个不错的电子书翻页效果,和大家分享

    前些天在网上搜到一个不错的电子书的翻页效果的源码,也做了个Dome,感觉很好玩,这里来和大家一起分享下. 效果已经被写成了一个ViewController,我们只要让自己的显示界面继承这个ViewCo ...

  3. javascript移动端 电子书 翻页效果

    1.后端给一长串的纯文本 2.前端根据屏幕的高度,将文本切割为 n 页 3.使用插件 turn.js 将切割好的每页,加上翻书效果 <!DOCTYPE html> <html lan ...

  4. Next FlipBook Maker Pro(h5电子书翻页效果制作软件)官方正式版V2.7.20 | h5翻页杂志制作软件下载

    ​            Next FlipBook Maker Pro 是一款优秀实用且酷炫逼真的交互式H5翻页电子杂志制作软件,为广大用户提供了一种将静态PDF文档或图片转换为带有H5翻页效果的数 ...

  5. Android电子书翻页效果实现

    http://blog.csdn.net/johnsonblog/article/details/7974312 效果 其中使用了贝赛尔曲线原理,关于贝赛尔曲线的知识,推荐大家看下http://blo ...

  6. 在线电子书翻页效果 Turn.js

    1 html中引入 <script type="text/javascript" src="js/turn.js"></script> ...

  7. Android电子书翻页效果

    效果如图: 思路:计算出出各个顶点作为path路径连接 如图 设屏幕右下角为原点O (view宽,view高),e为手指触摸屏幕的坐标,我们先算出点f1与f2的坐标 此处em代表两个点的线段距离,下文 ...

  8. OpenCV+Mediapipe+UDP+Unity挥手电子书翻页

    OpenCV+Mediapipe+UDP+Unity挥手电子书翻页 效果视频如下 OpenCV+Mediapipe+UDP+Unity挥手翻页 Python端 其实很简单,基本都是现成的东西. 主要做 ...

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

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

最新文章

  1. 常用计算机主要硬件设备,个人计算机常用的输出设备41.计算机硬件的组成部分主要包括:...
  2. linux驱动常用函数
  3. nutch2.1+mysql报错及解决
  4. java学习笔记(12) —— Struts2 通过 xml /json 实现简单的业务处理
  5. 【阿里云课程】1小时快速掌握Tensorflow核心功能,完成完整的项目实践
  6. 阿里云ECS服务器搭建wordpress个人博客网站【详细图文教程】
  7. Python爬虫开发:requests库的使用--发送带参数get请求
  8. python代码规范工具_Python代码规范Flake8的简单示例
  9. gcc malloc/free的质疑
  10. 2021年中国一次性弹性泵市场趋势报告、技术动态创新及2027年市场预测
  11. oracle常见sql积累
  12. 编译OpenJDK8:configure: Could not compile and link with freetype. This might be a 32/64-bit mismatch.
  13. 【实用插件】精心挑选6款优秀的 jQuery Tooltip 插件
  14. 分布式存储 HDFS原理
  15. RTI -- 实时中断
  16. 2020 年你读了哪些觉得比较好的计算机书籍?
  17. 按降序显示奇数python_程序在Python中分别以升序和降序对所有偶数和奇数进行排序...
  18. VGA接口和HDMI接口有什么区别 哪个好
  19. JAVA 调用地图API
  20. PHPStudy环境下phpmyadmin卡顿延迟不流畅解决办法

热门文章

  1. 自动取款机(ATM)系统。
  2. [bzoj5314][Jsoi2018]潜入行动_树形背包dp
  3. 2017百度实习生招聘算法题
  4. 教你安装各种应用环境-Nodejs
  5. Praat脚本-001 | 音频文件重新采样
  6. logstash之grok过滤
  7. Proxy error: Could not proxy request /students from localhost:8080 to http://localhost:5000/.See ht
  8. 在Twitch,YouTube和其他地方流式传输游戏的最佳方法
  9. c语言别踩白块小游戏代码,自学easeljs 根据别踩白块游戏规则自己写的代码
  10. JVM老生代增长过快问题排查