[译] 在 Angular 中使用 HammerJS (触摸手势)

前端之家收集整理的这篇文章主要介绍了[译] 在 Angular 中使用 HammerJS (触摸手势)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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 文件

  1. |- app/
  2. |- app.component.html
  3. |- app.component.css
  4. |- app.component.ts
  5. |- app.module.ts
  6. |- main.ts
  7. |- index.html
  8. |- tsconfig.json

APP 组件

让我们从 app 组件开始,在这个组件里,我们将定义头像列表和处理头像显示和隐藏的 swipe 事件.

  1. // app/app.component.ts
  2. import { Component } from '@angular/core';
  3.  
  4. @Component({
  5. moduleId: module.id,selector: 'my-app',templateUrl: 'app.component.html',styleUrls: ['app.component.css']
  6. })
  7.  
  8. export class AppComponent {
  9. // constant for swipe action: left or right
  10. SWIPE_ACTION = { LEFT: 'swipeleft',RIGHT: 'swiperight' };
  11. // our list of avatars
  12. avatars = [
  13. {
  14. name: 'kristy',image: 'http://semantic-ui.com/images/avatar2/large/kristy.png',visible: true
  15. },{
  16. name: 'matthew',image: 'http://semantic-ui.com/images/avatar2/large/matthew.png',visible: false
  17. },{
  18. name: 'chris',image: 'http://semantic-ui.com/images/avatar/large/chris.jpg',{
  19. name: 'jenny',image: 'http://semantic-ui.com/images/avatar/large/jenny.jpg',visible: false
  20. }
  21. ];
  22. // action triggered when user swipes
  23. swipe(currentIndex: number,action = this.SWIPE_ACTION.RIGHT) {
  24. // out of range
  25. if (currentIndex > this.avatars.length || currentIndex < 0) return;
  26. let nextIndex = 0;
  27. // swipe right,next avatar
  28. if (action === this.SWIPE_ACTION.RIGHT) {
  29. const isLast = currentIndex === this.avatars.length - 1;
  30. nextIndex = isLast ? 0 : currentIndex + 1;
  31. }
  32. // swipe left,prevIoUs avatar
  33. if (action === this.SWIPE_ACTION.LEFT) {
  34. const isFirst = currentIndex === 0;
  35. nextIndex = isFirst ? this.avatars.length - 1 : currentIndex - 1;
  36. }
  37. // toggle avatar visibility
  38. this.avatars.forEach((x,i) => x.visible = (i === nextIndex));
  39. }
  40. }

笔记:

    @H_403_47@

    我们处理左滑右滑事件用同样的函数 swipe

    @H_403_47@

    swipe 有两个参数

      @H_403_47@

      第一个参数是当前被选中的头像的索引

      @H_403_47@

      第二个参数是可选的,滑动动作,左或者右

    @H_403_47@

    你看到我们声明了一个常量 SWIPE_DIRCTION,这个常量的值是左滑或者右滑

    @H_403_47@

    引用 HammerJS 文档,HammerJS 处理5个滑动事件,滑动,左滑,下滑,在我们的例子中,我们只用处理左滑和右滑

    @H_403_47@

    我们在 HTML 视图中调用 SWIPE 动作

HTML VIEW

  1. <!-- app/app.component.html -->
  2. <div>
  3. <h4>Swipe Avatars with HammerJS</h4>
  4. <!-- loop each avatar in our avatar list -->
  5. <div class="swipe-Box" *ngFor="let avatar of avatars; let idx=index"
  6. (swipeleft)="swipe(idx,$event.type)"
  7. (swiperight)="swipe(idx,$event.type)"
  8. [class.visible]="avatar.visible"
  9. [class.hidden]="!avatar.visible">
  10. <div>
  11. <img [src]="avatar.image" [alt]="avatar.name">
  12. </div>
  13. <div>
  14. <a class="header">{{avatar.name}}</a>
  15. </div>
  16. </div>
  17. </div>

笔记:

    @H_403_47@

    通过 *ngFor 指令循环出每个头像,声明一个本地变量 idx 持有当前画像的索引.

    @H_403_47@

    然后,开始处理 swipeleft,swiperight 事件,调用之前声明的 swipe 方法

    @H_403_47@

    $event 是一个事件对象,我们不需要知道整个 $event 对象的信息,只需要知道 $event.type 返回的字符串是 swipeleft 还是 swiperight

    @H_403_47@

    根据 avatar.visible 添加或者移除两个 CSS 类 [class.visible] 或者 [class.hidden]

组件样式

可以使用 semantic-ui 轻松实现样式美化,但对于我们来讲是不必要的,跳过这个部分,下面是需要添加到组件中的自定义 CSS 类

  1. .swipe-Box {
  2. display: block;
  3. width: 100%;
  4. float: left;
  5. margin: 0;
  6. }
  7.  
  8. .visible {
  9. display: block;
  10. }
  11.  
  12. .hidden {
  13. display: none;
  14. }

笔记:

    @H_403_47@

    需要所有的画像堆在其它的最上方,因此,使用 .swipe-Box 使所有画像浮动

    @H_403_47@

    .visible 和 .hidden 用来隐藏和显示画像卡

引入 HammerJS 脚本

现在已经完成了组件,开始设置 HammerJS,首先,需要把 HammerJS 脚本文件引入到主视图文件 index.html 文件

  1. <!-- index.html -->
  2. <head>
  3. ...
  4. <!-- Hammer JS -->
  5. <script src="https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.js"></script>
  6. ....
  7. </head>

默认情况下,桌面浏览器是不支持 touch 事件,HammerJS 有一个扩展叫 touch-emulator.js,提供一个调试工具来模拟实现 touch 支持,你可以像引入 hammer.js 那样引入它

  1. <!-- index.html -->
  2. <head>
  3. ...
  4. <!-- Hammer JS Touch Emulator: Uncomment if for desktop -->
  5. <script src="http://cdn.rawgit.com/hammerjs/touchemulator/master/touch-emulator.js"></script>
  6. <script>
  7. TouchEmulator();
  8. </script>
  9. ...
  10. </head>

具体是如何模拟实现,可以查看 hammer.js 的官方文档

由于示例运行在 plunker,示例中引用了 HammerJS CDN URI,如果想本地管理,可以运行下面的命令.

  1. npm install hammerjs --save

然后,在项目中引入JS 文件

如果没有引入 HammerJS file,会有一个错误信息抛出: 'Hammer.js is not loaded,can not bind swipeleft event'.

应用程序模块

默认情况,如果没有任何自定义配置,就可以直接使用 HammerJS,Angular 支持 HammerJS 开箱即用,在应用启动时,不需要包含任何内容,您的应用程序模块看起来像下面这样

  1. // app.module.ts
  2.  
  3. import { NgModule } from '@angular/core';
  4. import { BrowserModule } from '@angular/platform-browser';
  5.  
  6. import { AppComponent } from './app.component';
  7.  
  8. @NgModule({
  9. imports: [ BrowserModule ],declarations: [ AppComponent ],bootstrap: [ AppComponent ],providers: [ ]
  10. })
  11.  
  12. export class AppModule { }

定制 HammerJS

如果你想增加一些自定义设置,像速度和阀值什么的,要怎么做呢?

快速说明

    @H_403_47@

    threshold (阀值): 识别 swipe 手势的最小距离值,默认: 10

    @H_403_47@

    velocity (速度): 识别 swipe 手势的最小速度,单位是 px/ms 默认: 0.3

官方文档上有提供一些其它的自定义配置项

Angular 已经内置提供了一个叫做 HAMMER_GESTURE_CONFIG 的令牌,接受 HammerGestureConfig 类型的对象

简单的方式,可以继承 HammerGestureConfig 像下面这样

  1. // app.module.ts
  2.  
  3. import { NgModule } from '@angular/core';
  4. import { BrowserModule } from '@angular/platform-browser';
  5. import { HammerGestureConfig,HAMMER_GESTURE_CONFIG } from '@angular/platform-browser';
  6.  
  7. import { AppComponent } from './app.component';
  8.  
  9. export class MyHammerConfig extends HammerGestureConfig {
  10. overrides = <any>{
  11. 'swipe': {velocity: 0.4,threshold: 20} // override default settings
  12. }
  13. }
  14.  
  15. @NgModule({
  16. imports: [ BrowserModule ],providers: [ {
  17. provide: HAMMER_GESTURE_CONFIG,useClass: MyHammerConfig
  18. } ] // use our custom hammerjs config
  19. })
  20.  
  21. 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...

猜你在找的Angularjs相关文章