Pointer tracking指针跟踪

指针跟踪是用户界面的一个重要组成部分
Drag & drop, scrolling galleries, measuring touch scroll speed是一些显而易见的实例

在本篇中,将看到如何监听action转换成DOM事件流
然后,我们将看看如何用指针动作跟踪鼠标和触摸动作,然后使用该指针的移动来拖动DOM元素

listen

popmotion提供llisten action来监听DOM事件

import { listen } from 'popmotion';

它将接受事件名称作为空格分隔的字符串,这意味着您可以使用单个listen侦听多个事件

listen(document, 'mousedown touchstart').start((e) => console.log(e));

由于listen是一个action,同样的也同样拥有一些链式方法

例如,下面是如何制作一个只有在有两个以上的触摸时才会触发的TouchMove监听器

listen(document, 'touchmove').filter(({ touches }) => touches.length >= 2).start((e) => /* This event has more than 2 touches! */);

Pointer

Pointer操作提供了一个通用接口,用于与单点鼠标和触摸输入交互(对于多点触摸,multitouch提供多点操作)

import { pointer } from 'popmotion';

默认情况下,指针将指针的clientX和clientY属性输出为x和y

let pointerTracker;listen(document, 'mousedown touchstart').start(() => {pointerTracker = pointer().start(({ x, y }) => console.log(x, y));
});listen(document, 'mouseup touchend').start(() => {if (pointerTracker) pointerTracker.stop();
})

Dragging(拖拽)

在大多数情况下,我们实际上希望使用这些移动数据来拖动或滚动

让我们再次使用styler函数来创建DOM元素接口,以便提供位置数据
关注startTracking方法,并尝试写一个demo并拖动球<指#a .ball元素>

const ball = document.querySelector('#a .ball');
const ballStyler = styler(ball);
let pointerTracker;const startTracking = () => {pointerTracker = pointer().start(ballStyler.set);
};const stopTracking = () => {if (pointerTracker) pointerTracker.stop();
};listen(ball, 'mousedown touchstart').start(startTracking);
listen(document, 'mouseup touchend').start(stopTracking);

OK,球可以进行拖动了,但是好像,球移动到了一个奇怪的地方
原因很简单,pinter输出一个{x,y}坐标是相对于视窗

球的{x,y}从0,0开始变换。所以,如果我们把指针的绝对位置直接应用到球上,它就不会移动到我们想要的位置

const ball = document.querySelector('#b .ball');
const ballStyler = styler(ball);
let pointerTracker;const startTracking = () => {pointerTracker = pointer({x: ballStyler.get('x'), // +++++y: ballStyler.get('y') // ++++}).start(ballStyler.set);
};const stopTracking = () => {if (pointerTracker) pointerTracker.stop();
};

单轴拖动 Single-axis dragging

可以直接这样:

pointer().start(({ x }) => ballStyler.set('x', x));

但是,更可重用的方法是使用指针的管道(pipe)方法组成一个新的动作。我们可以提供一个简单的选择器函数,从指针的输出中选择x并返回它

const xPointer = (initialX) => pointer({ x: initialX }).pipe(({ x }) => x);

现在我们可以使用xPointer方法了

xPointer(ballStyler.get('x')).start(ballStyler.set('x'));

demo:

const ball = document.querySelector('#c .ball');
const ballStyler = styler(ball);
const xPointer = (initialX) => pointer({ x: initialX }).pipe(({ x }) => x);let pointerTracker;const startTracking = () => {pointerTracker = xPointer(ballStyler.get('x')).start(ballStyler.set('x'));
};const stopTracking = () => {if (pointerTracker) pointerTracker.stop();
};listen(ball, 'mousedown touchstart').start(startTracking);
listen(document, 'mouseup touchend').start(stopTracking);

结论

  • listen可以将DOM事件转换为值的反应流。对于利用管道和其他可链接的方法,以及使用其他操作进行组合侦听都很有用

  • pointer可以绝对输出值,或者,如果我们提供初始坐标,则可以相对地应用它的增量来输出值

  • 最后,我们可以组合新的操作来生成具有新行为( action )的可重用代码,比如单轴拖动

下一篇预告

现在我们已经开始拖动工作,在下一篇教程中,我们将学习如何检查被拖动物体的速度,并将其应用于衰变、物理和弹簧动作,以创建自然感觉的相互作用

Popmotion动画(二) Pointer tracking 指针跟踪相关推荐

  1. 【C++探索之旅】第一部分第十二课:指针一出,谁与争锋

    内容简介 1.第一部分第十二课:指针一出,谁与争锋 2.第一部分第十三课预告:第一部分小测验 指针一出,谁与争锋 上一课<[C++探索之旅]第一部分第十一课:小练习,猜单词>中,我们用一个 ...

  2. XamarinAndroid组件教程设置自定义子元素动画(二)

    XamarinAndroid组件教程设置自定义子元素动画(二) (9)打开MainActivity.cs文件,为RecylerView的子元素设置添加和删除时的透明动画效果.代码如下: --using ...

  3. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  4. c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc

    C语言的二数组的指针访问 二维数组的指针访问 --王炳华 指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点.如果真正弄懂了这个问题,就可以说你学会了使用指针. 二维数组的指针 指针就是地址 ...

  5. ##二维数组指针的解引用

    ##二维数组指针的解引用 方法: int (*p)[5]; //定义一个二维数组指针,它的元素是一个包含5个int类型的一维数组 int array[3][5]; p = array; //指针指向二 ...

  6. SRPG游戏开发(十)第五章 颜色映射与职业动画 - 二 颜色组(Color Chart)

    返回目录 第五章 颜色映射与职业动画 二       颜色组(Color Chart) 颜色组是保存许多颜色的一个容器,可以在Swapper中直接创建List<Color>或Color[] ...

  7. 简介 Tagged Pointer (标记指针)

    在计算机科学中,Tagged Pointer 是一个指针(内存地址),它具有与其关联的附加数据,例如,indirection bit 或 引用计数. 这些附加数据通常是"折叠"在指 ...

  8. 一起研究ORB-SLAM(二)---Tracking线程

    转载自 一起研究ORB-SLAM(二) 上一篇文章我讲述就ORB-SLAM的基本流程,还记得ORB-SLAM分为哪三个主要的线程吗?在脑子里头大声的所出来吧,Tracking.LOCAL MAPPIN ...

  9. WPF中的动画——(二)From/To/By 动画(二)

    WPF中的动画--(二)From/To/By 动画 我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画: var widthAnimation ...

最新文章

  1. 微软职位内部推荐-SDEII for Windows Phone Apps
  2. 不想学python-学Python好久都学不会?然后选择放弃,总结出这几个原因
  3. python 类-如何理解python的类与对象?
  4. [学习笔记] Cordova+AmazeUI+React 做个通讯录 - 单页应用 (With Router)
  5. 如何利用NLog输出结构化日志,并在Kibana优雅分析日志?
  6. JAX-RS 2.0中的透明PATCH支持
  7. nginx和tomcat搭配使用,让nginx可以访问tomcat下面的静态资源
  8. 时间选择插件Foundation datepicker
  9. python怎么读程序-python怎么读sql数据?
  10. 一文看尽2019年NLP前沿突破
  11. 【经典算法】第一回:快速排序
  12. SQL Server BI Step by Step SSIS 5 --- 通过Email发送查询结果
  13. matlab 包落,怎样在MATLAB中划出一个函数的包络线?
  14. 必看CSDN积分获取方法
  15. 药店零售管理php系统,医药POS零售管理系统
  16. 强大好看的dz论坛社区源码手机端
  17. 【Minecraft】建立Bukkit/Spigot插件实时调试环境,并避免断点调试时客户端断开连接
  18. 打开chm文件提示“已取消到该网页的导航”
  19. iMac 2019一体机开箱体验,其内存是什么牌子,怎样换iMac内存?
  20. 双下巴的瘦脸运动方法 - 健康程序员,至尚生活!

热门文章

  1. Vue动画没效果问题
  2. MindMaster-脑图与其他架构图和流程图在线编辑器
  3. 校企联合学院告诉你:ERP软件排行榜
  4. UltraEdit安装方法
  5. [js运动动画]运动之匀速运动框架
  6. 阿里云轻量应用服务器环境搭建-Docker删除镜像
  7. Win8常用快捷键总结
  8. 巴斯夫Basonat_HI100ap固化剂TDS产品说明书
  9. 如何缓解安防PPP模式的忧愁
  10. python资本市场财务数据分析统计服_python股票财务数据分析统计服|蓝田制作项目并购估值...