Android双页翻书,Android翻书效果-双页模式

然后根据自己的理解实现了一下双页模式,但是在加贝塞尔曲线的时候,效果不是很理象,这里把自己的思路记录一下。 这里来讲述一下以右下角开始翻页(参见上图)当我们开始翻动的时候,与X轴有交战P,与Y轴有交战Q当X轴上的值(Px)小于View的一半的时候,我们需要重新计算这个点所带来的其他值,我们要将P点移动到M这里已知T点,M点,O点三点坐标 线段MO=MS ,做垂线TB交PO于B,垂线SA交PO于...
摘要由CSDN通过智能技术生成

然后根据自己的理解实现了一下双页模式,但是在加贝塞尔曲线的时候,效果不是很理象,这里把自己的思路记录一下。

1342878911_7015.jpg

这里来讲述一下以右下角开始翻页(参见上图)

当我们开始翻动的时候,与X轴有交战P,与Y轴有交战Q

当X轴上的值(Px)小于View的一半的时候,我们需要重新计算这个点所带来的其他值,我们要将P点移动到M

这里已知T点,M点,O点三点坐标   线段MO=MS ,做垂线TB交PO于B,垂线SA交PO于A

求出S点坐标即可

已知T、M两点,可以求出TM的长,TB的长,MB的长,

MO = SM,显然 △TMB∽△SMA ,可以求出SA的长,MA的长,可解得S点坐标

这里S点 就是我们的Touch点坐标,根据这个新的Touch点我们去重新计算与X轴,Y轴的交点坐标等等

下面给出一个模型

public class TurnPage extends View {

/**

* 页角的枚举

*/

public enum Corner {

LeftTop,

LeftBottom,

RightTop,

RightBottom,

None

}

PointF touch = new PointF();// 触摸点

PointF corner = new PointF();// 页角点

PointF middle = new PointF();// 触摸与页角的中点

PointF crossX = new PointF();// 与X轴的焦点

PointF crossY = new PointF();// 与Y轴的焦点

Corner footer = Corner.None;// 表示页脚

Path all = new Path();// 全部掀起的Path

Path part = new Path();// 掀起背面的Path

public TurnPage(Context context, AttributeSet attrs) {

super(context, attrs);

}

public TurnPage(Context context) {

super(context);

}

@Override

protected void onDraw(Canvas canvas) {

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
效果,导入源码即可运行。 package sf.hmg.turntest; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.Region; import android.graphics.drawable.GradientDrawable; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class PageWidget extends View { private static final String TAG = "hmg"; private int mWidth = 480; private int mHeight = 800; private int mCornerX = 0; // 拖拽点对应的页脚 private int mCornerY = 0; private Path mPath0; private Path mPath1; Bitmap mCurPageBitmap = null; // 当前页 Bitmap mCurPageBackBitmap = null; Bitmap mNextPageBitmap = null; PointF mTouch = new PointF(); // 拖拽点 PointF mBezierStart1 = new PointF(); // 贝塞尔曲线起始点 PointF mBezierControl1 = new PointF(); // 贝塞尔曲线控制点 PointF mBeziervertex1 = new PointF(); // 贝塞尔曲线顶点 PointF mBezierEnd1 = new PointF(); // 贝塞尔曲线结束点 PointF mBezierStart2 = new PointF(); // 另一条贝塞尔曲线 PointF mBezierControl2 = new PointF(); PointF mBeziervertex2 = new PointF(); PointF mBezierEnd2 = new PointF(); float mMiddleX; float mMiddleY; float mDegrees; float mTouchToCornerDis; ColorMatrixColorFilter mColorMatrixFilter; Matrix mMatrix; float[] mMatrixArray = { 0, 0, 0, 0, 0, 0, 0, 0, 1.0f }; boolean mIsRTandLB; // 是否属于右上左下 // for test float mMaxLength = (float) Math.hypot(480, 800); int[] mBackShadowColors; int[] mFrontShadowColors; GradientDrawable mBackShadowDrawableLR; GradientDrawable mBackShadowDrawableRL; GradientDrawable mFolderShadowDrawableLR; GradientDrawable mFolderShadowDrawableRL; GradientDrawable mFrontShadowDrawableHBT; GradientDrawable mFrontShadowDrawableHTB; GradientDrawable mFrontShadowDrawableVLR; GradientDraw

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值