React Native 全栈开发实战班 - 用户界面之手势系统应用

在移动应用中,手势交互 是提升用户体验的重要手段。通过手势,用户可以更直观、自然地与应用进行交互。React Native 提供了强大的手势处理系统,允许开发者轻松实现各种手势操作,如滑动、缩放、旋转等。本章节将详细介绍 React Native 中的手势系统,包括如何使用内置的 PanResponderGesture Responder System,以及如何使用第三方库(如 react-native-gesture-handler)实现更复杂的手势交互。


2.1 手势系统概述

在 React Native 中,手势系统主要由以下两个部分组成:

  1. Gesture Responder System(手势响应系统): 负责处理触摸事件,确定哪个组件应该响应手势。
  2. PanResponder: 基于 Gesture Responder System,提供更高级的手势处理功能,支持多点触控和手势识别。

React Native 还提供了第三方库 react-native-gesture-handler,用于实现更复杂和高效的手势交互。


2.2 使用 PanResponder

PanResponder 是 React Native 提供的一个高级手势处理 API,基于 Gesture Responder System 构建。它可以处理多种手势事件,如 onMoveShouldSetPanResponder, onPanResponderMove, onPanResponderRelease 等。

2.2.1 基本用法

步骤:

  1. 创建 PanResponder:

    使用 PanResponder.create 创建一个 PanResponder 对象,并定义手势处理函数。

    const panResponder = useRef(PanResponder.create({onStartShouldSetPanResponder: (evt, gestureState) => true,onPanResponderMove: (evt, gestureState) => {// 处理手势移动},onPanResponderRelease: (evt, gestureState) => {// 处理手势释放},})
    ).current;
    
  2. 绑定 PanResponder 到组件:

    将 PanResponder 的事件处理器绑定到组件的 onStartShouldSetPanResponder, onPanResponderMove, onPanResponderRelease 等属性。

    <View {...panResponder.panHandlers} style={styles.box}>{/* 内容 */}
    </View>
    

示例:

// DraggableBox.js
import React, { useRef } from 'react';
import { View, Text, StyleSheet, PanResponder, Animated } from 'react-native';const DraggableBox = () => {const pan = useRef(new Animated.ValueXY()).current;const panResponder = useRef(PanResponder.create({onStartShouldSetPanResponder: () => true,onPanResponderMove: Animated.event([null,{dx: pan.x, // 横轴移动距离dy: pan.y, // 纵轴移动距离},],{ useNativeDriver: false }),onPanResponderRelease: () => {Animated.spring(pan, {toValue: { x: 0, y: 0 },useNativeDriver: false,}).start();},})).current;return (<View style={styles.container}><Animated.View{...panResponder.panHandlers}style={[styles.box,{transform: [{ translateX: pan.x }, { translateY: pan.y }],},]}><Text style={styles.text}>Drag Me!</Text></Animated.View></View>);
};const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',},box: {width: 200,height: 200,backgroundColor: '#f0f0f0',justifyContent: 'center',alignItems: 'center',borderRadius: 10,},text: {fontSize: 18,},
});export default DraggableBox;

解释:

  • Animated.event 将手势移动事件绑定到 pan 动画值。
  • onPanResponderRelease 使用 Animated.spring 实现回弹动画。
2.2.2 多点触控

PanResponder 支持多点触控,可以处理多个手指同时操作。

示例:

// MultiTouchBox.js
import React, { useRef } from 'react';
import { View, Text, StyleSheet, PanResponder, Animated } from 'react-native';const MultiTouchBox = () => {const scale = useRef(new Animated.Value(1)).current;const pan = useRef(new Animated.ValueXY()).current;const panResponder = useRef(PanResponder.create({onStartShouldSetPanResponder: () => true,onPanResponderMove: Animated.event([null,{dx: pan.x,dy: pan.y,scale: scale,},],{ useNativeDriver: false }),onPanResponderRelease: () => {Animated.spring(scale, {toValue: 1,useNativeDriver: false,}).start();Animated.spring(pan, {toValue: { x: 0, y: 0 },useNativeDriver: false,}).start();},})).current;return (<View style={styles.container}><Animated.View{...panResponder.panHandlers}style={[styles.box,{transform: [{ translateX: pan.x }, { translateY: pan.y }, { scale }],},]}><Text style={styles.text}>Multi-Touch!</Text></Animated.View></View>);
};const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',},box: {width: 200,height: 200,backgroundColor: '#f0f0f0',justifyContent: 'center',alignItems: 'center',borderRadius: 10,},text: {fontSize: 18,},
});export default MultiTouchBox;

解释:

  • 通过 scale 动画值实现缩放效果。
  • 支持多点触控,实现缩放和拖拽。

2.3 使用 react-native-gesture-handler

react-native-gesture-handler 是一个功能强大的手势处理库,支持更复杂的手势交互,如滑动、缩放、旋转等。

2.3.1 安装 react-native-gesture-handler
npm install react-native-gesture-handler
2.3.2 基本用法

示例:

// SwipeableCard.js
import React from 'react';
import { View, Text, StyleSheet, Animated } from 'react-native';
import { PanGestureHandler, State } from 'react-native-gesture-handler';const SwipeableCard = () => {const translateX = React.useRef(new Animated.Value(0)).current;const onGestureEvent = Animated.event([{ nativeEvent: { translationX: translateX } }],{ useNativeDriver: true });const onHandlerStateChange = (event) => {if (event.nativeEvent.state === State.END) {if (translateX._value > 100) {Animated.timing(translateX, {toValue: 300,duration: 300,useNativeDriver: true,}).start();} else {Animated.timing(translateX, {toValue: 0,duration: 300,useNativeDriver: true,}).start();}}};return (<View style={styles.container}><PanGestureHandler onGestureEvent={onGestureEvent} onHandlerStateChange={onHandlerStateChange}><Animated.View style={[styles.card, { transform: [{ translateX }] }]}><Text style={styles.text}>Swipe Me!</Text></Animated.View></PanGestureHandler></View>);
};const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',},card: {width: 200,height: 200,backgroundColor: '#f0f0f0',justifyContent: 'center',alignItems: 'center',borderRadius: 10,},text: {fontSize: 18,},
});export default SwipeableCard;

解释:

  • PanGestureHandler 处理滑动手势。
  • Animated.event 将手势事件绑定到 translateX 动画值。
  • 根据滑动距离实现卡片滑动效果。
2.3.3 高级用法

react-native-gesture-handler 支持多种手势识别器,如 PinchGestureHandler, RotationGestureHandler, TapGestureHandler 等。

作者简介

前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!

温馨提示:可搜老码小张公号联系导师

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/17527.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ES-针对某个字段去重后-获取某个字段值的所有值

针对上面表的数据&#xff0c;现在想根据age分组&#xff0c;并获取每个分组后的name有哪些(去重后)。 select age, GROUP_CONCAT(DISTINCT(name)) from testtable group by age ; 结果&#xff1a; 如果想要增加排序&#xff1a; SELECT age, GROUP_CONCAT(DISTINCT name)…

基于java+SpringBoot+Vue的在线考试系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

一文详细深入总结服务器选型

1. 题记&#xff1a; 服务器选型工作是项目规划检讨的一项非常重要的工作&#xff0c;本文详细深入总结服务器选型。 2. 服务器基础知识概览 2.1 服务器的定义与功能 2.1 .1 定义 服务器是一种高性能计算机&#xff0c;其设计目的是在网络中提供服务。它可以处理来自多个客…

Linux 入门——基本指令1

目录 一背景知识的简介 二 入门相关指令的使用 一.背景知识的简介 1.认识 Linux &#xff0c;了解Linux 的相关背景 其实Linux 是从 Unix 发展而来的。 Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0…

2024年数维杯国际赛赛题浅析-助攻快速选题

本届数维杯我们将选择 MCM的B题以及ICM的D题进行助攻&#xff0c;具体助攻时间轴如下所示 11.15 12&#xff1a;00 更新赛题翻译、相关文献资料、选题建议、赛题难度 11.15 16&#xff1a;00 更新人工精翻版本赛题、数据预处理代码 11.15 24&#xff1a;00 更新完整解题思路…

w038基于SpringBoot的网上租赁系统设计与实现

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

windows 安装Ubuntu 后如何使用

windows 安装Ubuntu 后如何使用 youtube链接 https://www.youtube.com/watch?vPaEcQmgEz78哔哩哔哩视频 https://www.bilibili.com/video/BV1tW42197za/?spm_id_from333.999.0.0两个视频是一样的安装Ubuntu 安装docker的教程&#xff0c;不执行docker的安装即可 安装完毕后…

HashMap面试知识点

一、HashMap实现原理 JDK1.7之前&#xff1a;HashMap由数组链表组成。 JDK1.8之后&#xff1a;HashMap由数组链表、红黑树组成&#xff0c;当链表长度超过8&#xff0c;且 二、HashMap中put()方法的过程 ①首先检查数组table是否为空&#xff0c; 为空的话通过resize()方法进…

OceanBase 闪回查询

前言 在OB中&#xff0c;drop表可以通过 回收站 或者 以往的备份恢复来还原单表。当delete数据时&#xff0c;由于delete操作的对象不会进入回收站&#xff0c;此时需要通过闪回查询功能查看delete的数据&#xff0c;以便后续恢复 本次实验版本为 OceanBase 4.2.1.8&#xff0…

[A-18]ARMv8/ARMv9-Memory-内存空间的属性(Attributes Properties)

ver0.1 [看前序文章有惊喜,关注“浩瀚架构师”,可以解锁全部文章] 前言 在宏伟的ARM的内存世界中VMSA中,属性这个议题算不上最亮的星,就和屏幕前的你和我一样,平凡的活在这个茫茫然的人世间。纵使“丈夫贫践应未足,今日相逢无酒钱。”,也不要灰心面对生活,因为“山重…

【Linux】--环境变量

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各…

vue3中使用 HTML5 Canvas 做一个案例总结笔记

这篇文章记录了在vue3中如何使用HTML5 Canvas做一个时钟的案例, 当然主要是HTML5 Canvas, 如何需要了解更多关于vue的知识前面也已经写过好几篇了,辛苦翻一下的... 开始写代码之前我们先来了解一下关于HTML5 Canvas 的基础知识 目录 一 .基础知识 1.了解canvas 1.1 基本用法…

基于微信小程序的开放实验室预约管理系统的设计与实现,LW+源码+讲解

摘 要 使用旧方法对开放实验室预约管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在开放实验室预约管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题…

【汇编语言】更灵活的定位内存地址的方法(二)—— 从 [bx+idata] 到 [bx+si+idata]:让你灵活的访问内存

文章目录 前言1. [bxidata]1.1 更加灵活的访问内存1.2 示例1.3 问题一1.4 问题一的分析与求解 2. 用[bxidata]的方式进行数组的处理2.1 问题引入2.2 原来的解决方案2.3 新的解决方案2.3.1 改进后的程序2.3.2 还可以写成这样2.3.3 用C语言来描述看看 2.4 比较与总结 3. SI和DI3.…

[IP组播]IGMP配置实验

华为ensp拓补图 实验步骤 1.配置IP地址 AR1配置 # interface GigabitEthernet0/0/0ip address 192.168.1.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 12.1.1.1 255.255.255.0 # interface GigabitEthernet0/0/2ip address 13.1.1.1 255.255.255.0 #AR2…

Vue的局部使用

文章目录 什么是Vue?局部使用Vue快速入门 常用指令v-forv-bindv-if & v-showv-onv-model Vue生命周期 Axios案例 什么是Vue? Vue是一款构建用户界面的渐进式的JavaScript框架. 局部使用Vue 快速入门常用指令声明周期 快速入门 准备: 准备html页面,并引入Vue模块(…

DAHL:利用由跨越 29 个类别的 8,573 个问题组成的基准数据集,评估大型语言模型在生物医学领域长篇回答的事实准确性。

2024-11-14&#xff0c;由首尔国立大学创建的DAHL数据集&#xff0c;为评估大型语言模型&#xff08;LLMs&#xff09;在生物医学领域长文本生成中的幻觉问题提供了一个重要的工具&#xff0c;这对于提高模型的准确性和可靠性具有重要意义。 数据集地址&#xff1a;DAHL|生物医…

递归算法专题

题目&#xff1a; 方法一&#xff1a;不讲武德法&#xff0c;注意&#xff1a;面试不能用&#xff01;&#xff01; 代码&#xff1a; public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {//不讲伍德方法for(int x : A) C.add(x); …

验证双随机矩阵(doubly stochastic matrix) 满足C(P)=C(P^T)

验证双随机矩阵(doubly stochastic matrix) 满足C( P P P)C(P T ^T T) 双随机矩阵&#xff1a; 在数学中&#xff0c;一个双随机矩阵&#xff08;doubly stochastic matrix&#xff09;是一个满足以下条件的矩阵&#xff1a; 非负矩阵&#xff1a;矩阵中的每个元素都是非负的…

海外媒体发稿:中东地区阿拉伯邮报Arab Post新闻媒体宣发

​今天&#xff0c;我们要特别聚焦于中东地区的知名新闻媒体——阿拉伯邮报&#xff08;Arab Post&#xff09;&#xff0c;探讨其在海内外媒体宣发领域的重要性和影响力。 阿拉伯邮报作为一家备受关注的新闻媒体&#xff0c;涵盖了新闻、政治、娱乐和观点等多个领域&#xff…