摘要:是一个为应用添加触摸手势的非常受欢迎的库文中将看到结合一起使用是多么的简单原文示例是针对版本经过测试在目前最新的版本中此教程依然适用文章将以来统一代称版本名词滑动和类似但滑动更快速无粘滞左滑右滑上滑下滑头像轮播简介我们将构建一个头像轮播可以
HammerJS 是一个为 web 应用添加触摸手势的非常受欢迎的库,文中,将看到 Angular 结合 HammerJS 一起使用是多么的简单
原文示例是针对 Angular 2 版本,经过测试,在目前最新的 Angular 4.x 版本中此教程依然适用,文章将以 Angular 来统一代称 Angular 2.x ,Angular 4.x 版本
名词
swipe: 滑动; 和 pan 类似,但滑动更快速,无粘滞.
swipeleft,swiperight,swipeup,swipedown: 左滑,右滑,上滑,下滑
carousel of avatars: 头像轮播
简介
我们将构建一个头像轮播,可以左滑或者右滑来查看每个头像,可以使用下面的地址测试一下(最好在手机上,但也可以通过 chrome 和 firefox 桌面浏览器来模拟手机测试)
https://plnkr.co/edit/LCsiXOt...
应用配置
让我们看一下我们的目录结构是怎样的,我们有一个 app 目录文件夹,目录下包含了我们的头像切换和启动应用的 main.ts 文件
|- app/ |- app.component.html |- app.component.css |- app.component.ts |- app.module.ts |- main.ts |- index.html |- tsconfig.json
APP 组件
让我们从 app 组件开始,在这个组件里,我们将定义头像列表和处理头像显示和隐藏的 swipe 事件.
// app/app.component.ts import { Component } from "@angular/core"; @Component({ moduleId: module.id, selector: "my-app", templateUrl: "app.component.html", styleUrls: ["app.component.css"] }) export class AppComponent { // constant for swipe action: left or right SWIPE_ACTION = { LEFT: "swipeleft", RIGHT: "swiperight" }; // our list of avatars avatars = [ { name: "kristy", image: "http://semantic-ui.com/images/avatar2/large/kristy.png", visible: true }, { name: "matthew", image: "http://semantic-ui.com/images/avatar2/large/matthew.png", visible: false }, { name: "chris", image: "http://semantic-ui.com/images/avatar/large/chris.jpg", visible: false }, { name: "jenny", image: "http://semantic-ui.com/images/avatar/large/jenny.jpg", visible: false } ]; // action triggered when user swipes swipe(currentIndex: number, action = this.SWIPE_ACTION.RIGHT) { // out of range if (currentIndex > this.avatars.length || currentIndex < 0) return; let nextIndex = 0; // swipe right, next avatar if (action === this.SWIPE_ACTION.RIGHT) { const isLast = currentIndex === this.avatars.length - 1; nextIndex = isLast ? 0 : currentIndex + 1; } // swipe left, previous avatar if (action === this.SWIPE_ACTION.LEFT) { const isFirst = currentIndex === 0; nextIndex = isFirst ? this.avatars.length - 1 : currentIndex - 1; } // toggle avatar visibility this.avatars.forEach((x, i) => x.visible = (i === nextIndex)); } }
笔记:
我们处理左滑右滑事件用同样的函数 swipe
swipe 有两个参数
第一个参数是当前被选中的头像的索引
第二个参数是可选的,滑动动作,左或者右
你看到我们声明了一个常量 SWIPE_DIRCTION ,这个常量的值是左滑或者右滑
引用 HammerJS 文档,HammerJS 处理5个滑动事件,滑动,左滑,右滑,上滑,下滑,在我们的例子中,我们只用处理左滑和右滑
我们在 HTML 视图中调用 SWIPE 动作
HTML VIEW
Swipe Avatars with HammerJS
笔记:
通过 *ngFor 指令循环出每个头像,声明一个本地变量 idx 持有当前画像的索引.
然后,开始处理 swipeleft,swiperight 事件,调用之前声明的 swipe 方法
$event 是一个事件对象,我们不需要知道整个 $event 对象的信息,只需要知道 $event.type 返回的字符串是 swipeleft 还是 swiperight
根据 avatar.visible 添加或者移除两个 CSS 类 [class.visible] 或者 [class.hidden]
组件样式
可以使用 semantic-ui 轻松实现样式美化,但对于我们来讲是不必要的,跳过这个部分,下面是需要添加到组件中的自定义 CSS 类
.swipe-box { display: block; width: 100%; float: left; margin: 0; } .visible { display: block; } .hidden { display: none; }
笔记:
需要所有的画像堆在其它的最上方,因此,使用 .swipe-box 使所有画像浮动
.visible 和 .hidden 用来隐藏和显示画像卡
引入 HammerJS 脚本
现在已经完成了组件,开始设置 HammerJS , 首先,需要把 HammerJS 脚本文件引入到主视图文件 index.html 文件中
... ....
默认情况下,桌面浏览器是不支持 touch 事件,HammerJS 有一个扩展叫 touch-emulator.js,提供一个调试工具来模拟实现 touch 支持,你可以像引入 hammer.js 那样引入它
... ...
具体是如何模拟实现,可以查看 hammer.js 的官方文档
由于示例运行在 plunker ,示例中引用了 HammerJS CDN URI,如果想本地管理,可以运行下面的命令.
npm install hammerjs --save
然后,在项目中引入JS 文件
如果没有引入 HammerJS file ,会有一个错误信息抛出: "Hammer.js is not loaded,can not bind swipeleft event".
应用程序模块
默认情况,如果没有任何自定义配置,就可以直接使用 HammerJS ,Angular 支持 HammerJS 开箱即用,在应用启动时,不需要包含任何内容,您的应用程序模块看起来像下面这样
// app.module.ts import { NgModule } from "@angular/core"; import { BrowserModule } from "@angular/platform-browser"; import { AppComponent } from "./app.component"; @NgModule({ imports: [ BrowserModule ], declarations: [ AppComponent ], bootstrap: [ AppComponent ], providers: [ ] }) export class AppModule { }
定制 HammerJS
如果你想增加一些自定义设置,像速度和阀值什么的,要怎么做呢?
快速说明
threshold (阀值): 识别 swipe 手势的最小距离值,默认: 10
velocity (速度): 识别 swipe 手势的最小速度,单位是 px/ms 默认: 0.3
官方文档上有提供一些其它的自定义配置项
Angular 已经内置提供了一个叫做 HAMMER_GESTURE_CONFIG 的令牌,接受 HammerGestureConfig 类型的对象
简单的方式,可以继承 HammerGestureConfig 像下面这样
// app.module.ts import { NgModule } from "@angular/core"; import { BrowserModule } from "@angular/platform-browser"; import { HammerGestureConfig, HAMMER_GESTURE_CONFIG } from "@angular/platform-browser"; import { AppComponent } from "./app.component"; export class MyHammerConfig extends HammerGestureConfig { overrides ={ "swipe": {velocity: 0.4, threshold: 20} // override default settings } } @NgModule({ imports: [ BrowserModule ], declarations: [ AppComponent ], bootstrap: [ AppComponent ], providers: [ { provide: HAMMER_GESTURE_CONFIG, useClass: MyHammerConfig } ] // use our custom hammerjs config }) export class AppModule { }
在示例中,仅是想为 swipe 行为重写一些默认配置,如果想有更多的控制,可以像上面那样实现 HammerGestureConfig 类
查看一下 HammerGestureConfig 没那么复杂的源码或者文档,整个类仅有两个属性( events,overrides) 和一个方法( buildHammer )
总结:
Angular 与 HammerJS 集成以实现触摸手势事件检测非常容易.
原文地址: https://scotch.io/tutorials/u...
HammerJS swipe 配置文档: https://hammerjs.github.io/re...
示例运行地址: https://plnkr.co/edit/LCsiXOt...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/83616.html
摘要:目前作为腾讯手机手势解决方案,在各大项目中都发挥着作用。因此也入选了腾讯平台的精品组件除了国内外的项目团队都在使用,国内外的各大网站也进行了转载报道,作为超级小的手势库,腾讯的项目为什么不选择而选择下面从各个角度架构原理上进行一下分析。 目前AlloyFinger作为腾讯手机QQ web手势解决方案,在各大项目中都发挥着作用。感兴趣的同学可以去Github看看: https://git...
摘要:有二维码扫描功能,还做了类似消息可拖拽效果,上拉下拉刷新,轮播图组件。特别适合用于基于模式的移动应用程序开发。简介是一个用基于,和的,创建移动跨平台移动应用程序的快速开发平台。 这个项目做得比较早,当时是基于ionic1和angular1做的。做了四个tabs的app,首页模仿携程首页,第二页主要是phonegap调用手机核心功能,第三页模仿微信和qq聊天页,第四页模仿一般手机的表单设...
摘要:一个移动端的手势库。的过程最简单的使用一个手势的定义绑定事件调用初始化在中可以看到下面一段代码用于定义一个手势操作的元素定义配置参数定义如果为默认默认同步注册了同理同步注册也可以外部采用注册同步绑定事件中的实际上为调用中的 hammerjs ———— 一个移动端的手势库。 New Hammer 的过程 最简单的使用一个手势的demo // 定义 Manager var hammer...
摘要:兼容性如何支持以及的设备的浏览器便可运行不一一列举一共不到行为什么体积这么小腾讯手内大量的都会去不断地从各个维度进行性能优化。腾讯内部有哪些项目在用目前主要是兴趣部落群等业务在用,刚刚开源出来,只要有裁剪图片的地方都会用到。 传送门 Github地址:https://github.com/AlloyTeam/AlloyFinger/tree/master/alloy_crop 在线De...
阅读 1853·2021-11-25 09:43
阅读 3134·2021-11-15 11:38
阅读 2690·2019-08-30 13:04
阅读 468·2019-08-29 11:07
阅读 1468·2019-08-26 18:37
阅读 2669·2019-08-26 14:07
阅读 568·2019-08-26 13:52
阅读 2255·2019-08-26 12:09