React Native实现震动反馈效果

news2024/12/23 13:57:41

React Native实现理想的震动效果

在这里插入图片描述

一、背景说明

业务开发中,总会用到一些和用户反馈的效果,用来提升用户对于某个事件或者操作的重要程度,比如常见的就是 长按复制、滑动或点击图表、点击底部TabBar时的反馈等操作。

二、构思实现及过程
2.1 方案一

当开始这个需求时,我们能够看到官方提供了震动效果的API 实现 Vibration,提供了震动反馈的方法

Vibration.vibrate(?pattern: number | Array<number>, ?repeat: boolean)

但从文档中我们发现,在Android系统中,我们能够通过参数进行修改震动反馈模式,我们能够调整到我们想要的效果,但是对于IOS系统,则是参数固定为400ms,这400ms这个效果对我们需求来说,算是比较长的一个反馈时常,触摸反馈是不符合我们的要求的。

因此,排除改方案,我们得继续寻求其他的方案。

2.2 方案二

继续寻找反馈相关类库,无意间发现【react-native-haptic-feedback】,发现有比较多的一些反馈效果

在这里插入图片描述
稍微翻下源码,能够发现比较符合预期的一些效果
总体看源码来说,还是一贯的做法,将原生底层一些方法封装出来,提供给RN端使用。
看下Android的核心实现 VibrateFactory.java

在这里插入图片描述

看下IOS的核心实现 RNHapticFeedback.mm

在这里插入图片描述

最终确定使用【react-native-haptic-feedback】来实现触摸反馈效果。

三、实际应用

接下来,我们添加到我们的项目中体验下实际的效果,如果目前手上没有实际的项目,我们快速通过模版创建一个全新的项目验证。

npx react-native@latest init AwesomeProjectTest

项目创建结束后,按照react-native-haptic-feedback指导添加到项目中,执行

cd AwesomeProjectTest
npm install react-native-haptic-feedback --save

然后添加trigger事件到演示代码中,运行项目,点击按钮就能得到对应的反馈。

import ReactNativeHapticFeedback from "react-native-haptic-feedback";
const options = {
  enableVibrateFallback: true,
  ignoreAndroidSystemSettings: false,
};
ReactNativeHapticFeedback.trigger("impactLight", options);

or

import { trigger } from "react-native-haptic-feedback";
const options = {
  enableVibrateFallback: true,
  ignoreAndroidSystemSettings: false,
};
trigger("impactLight", options);

引入实际项目中使用:

import React from 'react';
import { trigger } from "react-native-haptic-feedback";
import {
  SafeAreaView,
  ScrollView,
  Text,
  TouchableOpacity,
  View,
} from 'react-native';

const options = {
  enableVibrateFallback: true,
  ignoreAndroidSystemSettings: true,
};
function App(): JSX.Element {
  return (
    <SafeAreaView>
      <ScrollView>
        <View>
          <TouchableOpacity onPress={() => {
            trigger("impactHeavy", options);
          }}>
            <View style={{
              backgroundColor: '#fafafa',
              width: 300,
              height: 200,
              justifyContent: 'center',
              alignItems: 'center'
            }}>
              <Text>触发震动反馈</Text>
            </View>
          </TouchableOpacity>
        </View>
      </ScrollView>
    </SafeAreaView>
  );
}
export default App;

trigger 包含两个参数。分别是反馈类型和该次反馈的配置项。

反馈类型包含:
impactLight、impactMedium 、impactHeavy、rigid 、soft、notificationSuccess、notificationWarning 、notificationError、selection、clockTick、contextClick 、keyboardPress、keyboardRelease、keyboardTap、longPress、textHandleMove、virtualKey、virtualKeyRelease、effectClick、effectDoubleClick、effectHeavyClick、effectTick。可分别配置尝试效果。
反馈配置项包含:

  • enableVibrateFallback 仅限 iOS。如果触觉反馈不可用(iOS < 10 或设备 < iPhone6s),则使用默认方法振动(重 1 秒)(默认值: false)
  • ignoreAndroidSystemSettings 仅限安卓。如果 Android 系统设置中禁用了触觉,这将允许忽略该设置并触发触觉反馈。

使用效果还是符合我们产品需求的,最终使用了impactHeavy类型。


在这里插入图片描述

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

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

相关文章

【Yolov8自动标注数据集教程】

Yolov8自动标注数据集教程 1 前言2 先手动标注数据集&#xff0c;训练出初步的检测模型2.1 手动标注数据集2.2 Yolov8环境配置2.2.1 Yolov8下载2.2.2 Yolov8环境配置 2.3 Yolov8模型训练&#xff0c;得到初步的检测模型2.3.1 训练方式 3 使用初步的检测模型实现自动数据集标注3…

vue3中 状态管理pinia得使用

在做项目中 vue2改造vue3项目时的vuex 发生得一些变化 vue3项目中 先看下 stores.jsimport { defineStore } from pinia 引入方法注册方法 import { getListFieldLevel } from ..api/index.jsexport const useScreenStore defineStore(screen, {state: () > ({fieldList:…

MySQL:MHA高可用

目录 1&#xff0e;什么是 MHA 2&#xff0e;MHA 的组成 3&#xff0e;MHA 的特点 4、MHA工作原理 5、搭建 MySQL MHA 5.1 实验思路 5.1.1 MHA架构 5.1.2 故障模拟 5.2 实验环境 5.3 准备工作 5.4 安装MHA所有组件与测试 5.4.1 安装 MHA 软件 5.4.2 manager与node工…

动态内存管理之柔性数组

柔性数组&#xff1a; 只存在于结构体中&#xff0c;而且还要是结构体的最后一个成员&#xff0c;并且在他的前面必须要有其他成员&#xff0c; 大小是未知的&#xff0c;所以在用sizeof计算出的结构体大小是出柔性数组外的&#xff0c; 柔性数组的大小是可以变化的&#xff0…

Staples Drop Ship EDI 需求分析

Staples 是一家美国零售公司&#xff0c;总部位于马萨诸塞州弗拉明汉&#xff0c;主要提供支持工作和学习的产品和服务。该公司于 1986 年在马萨诸塞州布莱顿开设了第一家门店。到 1996 年&#xff0c;该公司已跻身《财富》世界 500 强&#xff0c;后来又收购了办公用品公司 Qu…

小学期笔记——天天酷跑7

玩家吃金币的动作是加分的事件源 吃到炸弹更改游戏角色的生命状态 if (person.x person.width > bomb2.x&& person.x < bomb2.width bomb2.x&& person.y person.height > bomb2.y&& person.y < bomb2.y bomb2.height) 效果&#xff1…

OpenShift 4 - 可观测性之用 OpenTelemetry+Jaeger 实现 Distributed Tracing

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.13 的环境中验证 文章目录 技术架构部署 Distributed Tracing 运行环境安装测试应用并进行观测跟踪参考 说明&#xff1a; 本文使用的测试应用采用的是 “手动 Instrumentation” 方式在…

【雕爷学编程】Arduino动手做(85)---LCD1602液晶屏模块6

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

02 linux 基础(2)

shell 基本维护命令 获取联机帮助 使用 man 命令可以找到特定的联机帮助页&#xff0c;并提供简短的命令说明。一般语法格式为&#xff1a; 联机帮助页提供了指定命令 commandname 的相关信息&#xff0c;包括&#xff1a;名称、函数、语法以及可选参数描述等。无论帮助有多长…

PyAutoGUI

概述 PyAutoGUI是一个纯Python开发的跨平台GUI自动化工具&#xff0c;它是通过程序来控制计算机的键盘和鼠标的操作&#xff0c;从而实现自动化功能。所谓的GUI是指图形用户界面&#xff0c;即通过图形方式来显示计算机的界面&#xff0c;早期的计算机是以命令行界面来操作&am…

Vector3.Cross

上期介绍了Vector.Dot可以用来判断敌人处于自身的前方or后方&#xff0c;那么这期就是通过叉乘来判断敌人处于自身的左方or右方 public class CrossTest : MonoBehaviour {public GameObject sphere;public GameObject cube;// Start is called before the first frame updatev…

性能测试工具 Locust + Boomer In Docker

目录 前言&#xff1a; 背景 启动 Locust-master Boomer 调试模式启动 boomer locust worker 模式启动 get 请求 post 请求 指定请求头 直接使用 curl 命令 动态读取 csv --json-value-type 说明 前言&#xff1a; Locust 是一种开源的性能测试工具&#xff0c;可…

【js小游戏案例】纯前端实现飞机大战,附带源码

技能&#xff1a; 使用html js css实现飞机大战小游戏 需求&#xff1a; 我军飞机左右移动&#xff0c;并且按空格 可以发射炮弹&#xff0c;敌方飞机从上往下飞&#xff0c;接触到我方炮弹 飞机被歼灭&#xff0c;我军接触到敌军飞机也将会被歼灭&#xff0c;我方飞机吃到道…

【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝)

文章目录 前言一、 整体1.命名空间:2构造函数&#xff1a;1普通构造2迭代器构造3初始化字符构造4拷贝构造&#xff1a; 3析构函数 二、成员函数实现1.大小1当前大小(size())2总体容量(capacity()) 2.返回头尾迭代器1begin&#xff08;&#xff09;2end&#xff08;&#xff09;…

改进的北方苍鹰算法优化BP神经网络---回归+分类两种案例

今天采用前作者自行改进的一个算法---融合正余弦和折射反向学习的北方苍鹰(SCNGO)优化算法优化BP神经网络。 文章一次性讲解两种案例&#xff0c;回归与分类。回归案例中&#xff0c;作者选用了一个经典的股票数据。分类案例中&#xff0c;选用的是公用的UCI数据集。 BP神经网络…

达芬奇密码

《达芬奇密码》是一款由德国人发明的桌游&#xff0c;游戏由2-4个人组成。每个玩家执有一定的数字牌&#xff0c;玩家需隐藏你的数字密码&#xff0c;猜透对手的密码&#xff0c;推测可能的答案&#xff0c;打败对手。 24 块塑料立牌&#xff0c;12 个黑色和12个白色。每块上数…

7-25作业

思维导图 QT窗口代码 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug()<< this->size();this->resize(1000,800);//设置宽高this->setFixedSize(1000,800);//固定宽高//窗口标题this->setWindowTitle("跟党走…

全志F1C200S嵌入式驱动开发(lcd屏幕驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数据信…

LED芯片 VAS1260IB05E 带内部开关LED驱动器 汽车硬灯带灯条解决方案

VAS1260IB05E深力科LED芯片是一种连续模式电感降压转换器&#xff0c;设计用于从高于LED电压的电压源高效驱动单个或多个串联连接的LED。该设备在5V至60V之间的输入电源下工作&#xff0c;并提供高达1.2A的外部可调输出电流。包括输出开关和高侧输出电流感测电路&#xff0c;该…

【Linux】进程通信 — 管道

文章目录 &#x1f4d6; 前言1. 通信背景1.1 进程通信的目的&#xff1a;1.2 管道的引入&#xff1a; 2. 匿名管道2.1 匿名管道的原理&#xff1a;2.2 匿名管道的创建&#xff1a;2.3 父子进程通信&#xff1a;2.3.1 read()阻塞等待 2.4 父进程给子进程派发任务&#xff1a;2.5…