[技术博客]使用PanResponder实现响应左右滑动手势
在实现用户左右滑动完成不同操作时,使用react-native的官方API——PanResponder响应用户手势操作。
PanResponder介绍
PanResponder类可以将多点触摸操作协调成一个手势。它使得一个单点触摸可以接受更多的触摸操作,也可以用于识别简单的多点触摸手势。
默认情况下PanResponder会通过InteractionManager来阻止长时间运行的 JS 事件打断当前的手势活动。
它提供了一个对触摸响应系统响应器的可预测的包装。对于每一个处理函数,它在原生事件之外提供了一个新的gestureState对象:
onPanResponderMove: (event, gestureState) => {}
基本用法
  componentWillMount: function() {
    this._panResponder = PanResponder.create({
      // 要求成为响应者:
      onStartShouldSetPanResponder: (evt, gestureState) => true,
      onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
      onMoveShouldSetPanResponder: (evt, gestureState) => true,
      onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
      onPanResponderGrant: (evt, gestureState) => {
        // 开始手势操作。给用户一些视觉反馈,让他们知道发生了什么事情!
        // gestureState.{x,y} 现在会被设置为0
      },
      onPanResponderMove: (evt, gestureState) => {
        // 最近一次的移动距离为gestureState.move{X,Y}
        // 从成为响应者开始时的累计手势移动距离为gestureState.d{x,y}
      },
      onPanResponderTerminationRequest: (evt, gestureState) => true,
      onPanResponderRelease: (evt, gestureState) => {
        // 用户放开了所有的触摸点,且此时视图已经成为了响应者。
        // 一般来说这意味着一个手势操作已经成功完成。
      },
      onPanResponderTerminate: (evt, gestureState) => {
        // 另一个组件已经成为了新的响应者,所以当前手势将被取消。
      },
      onShouldBlockNativeResponder: (evt, gestureState) => {
        // 返回一个布尔值,决定当前组件是否应该阻止原生组件成为JS响应者
        // 默认返回true。目前暂时只支持android。
        return true;
      },
    });
  },
  render: function() {
    return (
      <View {...this._panResponder.panHandlers} />
    );
  },
这里仅介绍项目中使用到的两个属性,onMoveShouldSetPanResponder、onPanResponderRelease。
- onMoveShouldSetPanResponder:移动时根据此属性冒泡询问本元素是否获得手势权
- onPanResponderRelease:用户放开所有触摸点且本元素已成为响应者时将执行的函数
一个gestureState对象有如下的字段:
- stateID- 触摸状态的 ID。在屏幕上有至少一个触摸点的情况下,这个 ID 会一直有效。
- moveX- 最近一次移动时的屏幕横坐标
- moveY- 最近一次移动时的屏幕纵坐标
- x0- 当响应器产生时的屏幕坐标
- y0- 当响应器产生时的屏幕坐标
- dx- 从触摸操作开始时的累计横向路程
- dy- 从触摸操作开始时的累计纵向路程
- vx- 当前的横向移动速度
- vy- 当前的纵向移动速度
- numberActiveTouches- 当前在屏幕上的有效触摸点的数量
在项目中的使用
/* 渲染一个收藏项数据 */
_renderItem = (item) => {
	let item1 = item;
	var Id = item1.item.key;
	let _panResponder = PanResponder.create({
		onMoveShouldSetPanResponder: (evt, gestureState) => {
            /* 这里仅当用户滑动的距离较长才响应用户操作,考虑实际用户点击是手指的一片区域,而不是测试时的鼠标单击,实际使用时即使是单击也可能有一定的位移 */
			if(gestureState.dx < -screenWidth*0.1 || gestureState.dx > screenWidth*0.1){
				return true;
			}
			else{
				return false;
			}
		},
		onPanResponderRelease: (evt, gestureState)=>{
			if(gestureState.dx < 0) {
                /* 左滑删除该项收藏 */
				this._onPressDelBookmarks(WzLinkId);
			}
			else{
                /* 右滑编辑收藏 */
                this._onPressEditBookmarks(WzLinkId);
			}
		},
	});
	return(
		<View style={flatStylesWithAvatar.cell} {..._panResponder.panHandlers}>
			<TouchableOpacity style = {flatStylesWithAvatar.listcontainer}
			 onPress={()=>console.log('单击了该项')}
			>
			具体内容
			</TouchableOpacity>
		</View>
	)
};
这里对列表中的每一项都创建一个PanResponder对象,绑定不同的操作。
[技术博客]使用PanResponder实现响应左右滑动手势的更多相关文章
- [置顶] 创建GitHub技术博客全攻略
		[置顶] 创建GitHub技术博客全攻略 分类: GitHub2014-07-12 13:10 19710人阅读 评论(21) 收藏 举报 githubio技术博客网站生成 说明: 首先,你需要注册一 ... 
- 【新版】Android技术博客精华汇总
		[新版]Android技术博客精华汇总(原文链接内持续更新) http://www.apkbus.com/thread-313856-1-1.html Kotlin Kotlin学习资料汇总 http ... 
- 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等
		本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ... 
- 创建GitHub技术博客全攻略【转】
		本文转载自:http://blog.csdn.net/renfufei/article/details/37725057/ 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比 ... 
- 【技术博客】Django中文件下载的实现
		开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Django中文件下载的实现 1.背景 在VisualPy ... 
- [技术博客]使用CDN加快网站访问速度
		[技术博客]使用CDN加快网站访问速度 2s : most users are willing to wait 10s : the limit for keeping the user's atten ... 
- [技术博客]采用Bootstrap框架进行排版布局
		[技术博客]采用Bootstrap框架进行排版布局 网页的前端框架有很多很多种,比如Bootstrap.Vue.Angular等等,在最开始其实并没有考虑到框架这回事,开始阅读往届代码时发现其部分采用 ... 
- 技术博客——微信小程序的架构与原理
		技术博客--微信小程序的架构与原理 在两个月的微信小程序开发过程中,我曾走了不少弯路,也曾被很多现在看来十分可笑的问题所困扰.这些弯路与困扰,基本上都是由于当时对小程序的架构理解不够充分,对小程序的原 ... 
- [技术博客] 软工-Ruby on Rails 后端开发总结分享
		[技术博客] 软工-Ruby on Rails 后端开发总结分享 在这次软件编写中,我们的后端使用了Ruby on Rails (RoR)框架. Rails框架是用Ruby编写的.这意味着当我们为Ru ... 
随机推荐
- Js数组语法
			js数组整理导向图 ---欢迎收藏^ - ^ 
- vim巧妙用法
			1. 块复制 按ctrl+v键,编辑框最下方将出现"可视 块"字样 使用方向键移动光标,选择矩形区域内的文字 y 键复制文本: d 键剪切文本:p 键粘贴文本 按shift+v键, ... 
- byte[],File和InputStream的相互转换
			File.FileInputStream 转换为byte[] File file = new File("test.txt"); InputStream input = new F ... 
- 为 Linux 应用程序编写 DLL
			插件和 DLL 通常是用来无须编写整个新应用程序而添加功能的极好方法. 在 Linux 中,插件和 DLL 是以动态库形式实现的. 电子商务顾问兼设计师 Allen Wilson 介绍了动态库,并且向 ... 
- Product settype acts as a very important role in CRM WebClient UI architecture
			Product settype acts as a very important role in CRM WebClient UI architecture. The GenIL layer know ... 
- git https解决免ssL和保存密码
			1.打开windows的git bash set GIT_SSL_NO_VERIFY=true git clonegit config --global http.sslVerify false 2 ... 
- Es查询工具使用
			Kibana按照索引过滤数据 1.创建索引模式 2.查询索引中的数据 Es查询不返回数据 创建索引的时候指定mapping mappings={ "mappings": { &qu ... 
- 访问Stack Overflow速度超慢的原因
			很多网站,尤其是国外网站,为了加快网站的速度,都是用了 Google 的 CDN. 但是在天朝,由于某些原因,导致全球最快的 CDN 变成了全球最慢的. 解决方法步骤如下: 下载ReplaceGoog ... 
- NumPy 之 案例(随机漫步)
			import numpy as np The numpy.random module supplements(补充) the built-in Python random with functions ... 
- Kombu源码分析(一)概述
			Celery是Python中最流行的异步消息队列框架,支持RabbitMQ.Redis.ZoopKeeper等作为Broker,而对这些消息队列的抽象,都是通过Kombu实现的.Kombu实现了对AM ... 
