MCPcopy
hub / github.com/Tencent/weui.js / _end

Function _end

src/picker/scroll.js:194–243  ·  view source on GitHub ↗
(pageY)

Source from the content-addressed store, hash-verified

192 }
193 }
194 function _end(pageY){
195 if(!start) return;
196
197 /**
198 * 思路:
199 * 0. touchstart 记录按下的点和时间
200 * 1. touchmove 移动时记录前 40个经过的点和时间
201 * 2. touchend 松开手时, 记录该点和时间. 如果松开手时的时间, 距离上一次 move时的时间超过 100ms, 那么认为停止了, 不执行惯性滑动
202 * 如果间隔时间在 100ms 内, 查找 100ms 内最近的那个点, 和松开手时的那个点, 计算距离和时间差, 算出速度
203 * 速度乘以惯性滑动的时间, 例如 300ms, 计算出应该滑动的距离
204 */
205 const endTime = new Date().getTime();
206 const relativeY = $this[0].getBoundingClientRect().top + defaults.bodyHeight / 2;
207 end = pageY;
208
209 // 如果上次时间距离松开手的时间超过 100ms, 则停止了, 没有惯性滑动
210 if (endTime - startTime > 100) {
211 //如果end和start相差小于10,则视为
212 if (Math.abs(end - start) > 10) {
213 stop(end - start);
214 } else {
215 stop(relativeY - end);
216 }
217 } else {
218 if (Math.abs(end - start) > 10) {
219 const endPos = points.length - 1;
220 let startPos = endPos;
221 for (let i = endPos; i > 0 && startTime - points[i].time < 100; i--) {
222 startPos = i;
223 }
224
225 if (startPos !== endPos) {
226 const ep = points[endPos];
227 const sp = points[startPos];
228 const t = ep.time - sp.time;
229 const s = ep.y - sp.y;
230 const v = s / t; // 出手时的速度
231 const diff = v * 150 + (end - start); // 滑行 150ms,这里直接影响“灵敏度”
232 stop(diff);
233 }
234 else {
235 stop(0);
236 }
237 } else {
238 stop(relativeY - end);
239 }
240 }
241
242 start = null;
243 }
244
245 $this
246 .on('touchstart', function (evt) {

Callers 1

scroll.jsFile · 0.85

Calls 1

stopFunction · 0.85

Tested by

no test coverage detected