提交 13c6cf7b authored 作者: 搞事情's avatar 搞事情

1、完善任意翻页

上级 6f4d84a5
......@@ -423,6 +423,7 @@
css({ width: (single) ? this.width() : this.width() / 2, height: this.height() }).
flip({
page: page,
display: data.opts.display,
next: (single && page === data.totalPages) ? page - 1 : ((even || single) ? page + 1 : page - 1),
turn: this,
duration: data.opts.duration,
......@@ -1251,6 +1252,11 @@
var data = this.data().f;
// 检查数据是否已初始化
if (!data || !data.opts) {
return false;
}
// 检查是否启用非corner翻页
if (!data.opts.enableNonCorner) {
return false;
......@@ -1280,51 +1286,35 @@
return virtualCorner;
},
// 改进的虚拟corner计算逻辑
// 改进的虚拟corner计算逻辑 - 实现新的翻页逻辑
_calculateVirtualCorner: function (point, allowedCorners, turnData) {
var width = this.width(),
height = this.height(),
data = this.data().f,
virtualCorner = null;
// 双页模式的改进逻辑
// 双页模式逻辑
if (turnData && turnData.display === 'double') {
// 获取当前页面在双页视图中的位置
var currentView = turnData.view || [data.opts.page];
var isLeftPage = data.opts.page % 2 === 0;
// 改进的双页拖动检测:支持跨页拖动,扩大拖动区域到50%
var dragThreshold = width * 0.5; // 50%的区域作为拖动触发区
if (isLeftPage) {
// 左页:右侧50%区域可以向右翻页,左侧50%区域可以向左翻页
if (point.x > width - dragThreshold) {
// 右侧拖动区域,向右翻页
virtualCorner = (point.y < height / 2) ? 'tr' : 'br';
} else if (point.x < dragThreshold) {
// 左侧拖动区域,向左翻页
virtualCorner = (point.y < height / 2) ? 'tl' : 'bl';
}
// 左页:只能向右滑动
virtualCorner = (point.y < height / 2) ? 'tr' : 'br';
} else {
// 右页:左侧50%区域可以向左翻页,右侧50%区域可以向右翻页
if (point.x < dragThreshold) {
// 左侧拖动区域,向左翻页
virtualCorner = (point.y < height / 2) ? 'tl' : 'bl';
} else if (point.x > width - dragThreshold) {
// 右侧拖动区域,向右翻页
virtualCorner = (point.y < height / 2) ? 'tr' : 'br';
}
// 右页:只能向左滑动
virtualCorner = (point.y < height / 2) ? 'tl' : 'bl';
}
} else {
// 单页模式:整个页面都可以拖动,根据点击位置智能选择方向
// 单页模式:左半区只能左滑,右半区只能右滑
var centerX = width / 2;
var centerY = height / 2;
if (point.x < centerX) {
// 左侧点击,向左翻页
// 左半区:只能向左翻页
virtualCorner = (point.y < centerY) ? 'tl' : 'bl';
} else {
// 右侧点击,向右翻页
// 右半区:只能向右翻页
virtualCorner = (point.y < centerY) ? 'tr' : 'br';
}
}
......@@ -1339,7 +1329,11 @@
isVirtual: true,
// 添加拖动起始信息,用于改进拖动体验
dragStartX: point.x,
dragStartY: point.y
dragStartY: point.y,
// 添加区域信息,用于判断是否应该显示折叠页动画
dragArea: turnData && turnData.display === 'double' ?
(data.opts.page % 2 === 0 ? 'leftPage' : 'rightPage') :
(point.x < width / 2 ? 'leftHalf' : 'rightHalf')
};
}
......@@ -1738,6 +1732,7 @@
_moveFoldingPage: function (bool) {
console.log('_moveFoldingPage', bool);
var data = this.data().f,
folding = flipMethods._foldingPage.call(this);
......@@ -1758,6 +1753,7 @@
_showFoldedPage: function (c, animate) {
console.log('_showFoldedPage', c);
var folding = flipMethods._foldingPage.call(this),
dd = this.data(),
data = dd.f;
......@@ -1952,12 +1948,28 @@
// 最小拖动距离阈值
var minDragDistance = data.opts.minDragDistance || 30;
if (dragDistance < minDragDistance) {
// 拖动距离太小,不执行翻页效果
return;
}
// todo解决单页翻页的问题
// else {
// // 单页特殊处理
// if (data.opts.display === 'single') {
// // 判断滑动方向,判断在左右半区,同向滑动直接翻页不播放翻页特效。
// if (currentMouseX - data.corner.dragStartX > 0) {
// // 向右滑动
// turnMethods.next();
// } else {
// // 向左滑动
// turnMethods.previous();
// }
// }
// return;
// }
// 根据拖动轨迹计算真实的折叠点
var foldPoint = flipMethods._calculateNonCornerFoldPoint.call(this,
data.corner.corner, currentMouseX - data.corner.dragStartX, currentMouseY - data.corner.dragStartY,
......
......@@ -398,7 +398,7 @@ const initBook = async () => {
// 启用非corner区域翻页
enableNonCorner: true,
// 最大折叠距离比例 (0.1 - 1.0)
maxFoldingDistance: 0.6,
maxFoldingDistance: 2,
// 最小拖拽距离触发翻页
minDragDistance: 30,
gradients: true,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论