【Delphi】一个函数实现ios,android震动功能 Vibrate(包括3D Touch 中 Peek 震动等)

一、前言

        我们在开发移动端APP的时候,有时可能需要APP能够提供震动功能,以便提醒操作者,特别是ios提供的3D Touch触感功能,操作者操作时会有触感震动,给操作者的感觉很友好。那么,在Delphi的移动端FMX开发中如何实现?

二、验证环境

以下程序代码在Delphi 的11.3上测试通过,注意在android系统中需要设置 Vibrate 权限。

测试设备:

  1. android:Redmi K30 5G android 11版本
  2. ios:iPhone 13 Pro Max 15.0.2

以上设备版本测试通过。

三、实现代码

函数说明:

//Param :
// android上:表示震动需要持续的时间,单位是毫秒
// ios上:表示震动的类型
//    $FFF 表示震动,
//    $5EF(1519)表示3D Touch 中 Peek 震动反馈
//    $5F0(1520)    3D Touch 中 Pop 震动反馈
//    $5F1(1521)表示连续三次短震
procedure Vibrate(Param : Integer = 0);

全部代码如下:使用时引用uVibrate_IOS_Android.pas单元即可使用上述函数。

{ sensor 2023-12-06 
}
unit uVibrate_IOS_Android;

interface
uses
{$IFDEF ANDROID}
  Androidapi.JNI.Os,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.Helpers,
  Androidapi.JNIBridge;
{$ENDIF}
{$IFDEF IOS}
  //IOSapi.MediaPlayer,
  //IOSapi.CoreGraphics,
  //FMX.Platform,
  //FMX.Platform.IOS,
  //IOSapi.UIKit,
  Macapi.ObjCRuntime;
  //Macapi.ObjectiveC,
  //iOSapi.Cocoatypes,
  //Macapi.CoreFoundation,
  //iOSapi.Foundation,
  //iOSapi.CoreImage,
  //iOSapi.QuartzCore,
  //iOSapi.CoreData
{$ENDIF}


{$IFDEF IOS}
Const
  libAudioToolbox        = '/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox';
  kSystemSoundID_vibrate = $FFF;    //表示震动

Procedure AudioServicesPlaySystemSound( inSystemSoundID: integer ); Cdecl; External libAudioToolbox Name _PU + 'AudioServicesPlaySystemSound';
{$ENDIF}

//Param :
// android上:表示震动需要持续的时间,单位是毫秒
// ios上:表示震动的类型
//    $FFF 表示震动,
//    $5EF(1519)表示3D Touch 中 Peek 震动反馈
//    $5F0(1520)    3D Touch 中 Pop 震动反馈
//    $5F1(1521)表示连续三次短震
procedure Vibrate(Param : Integer = 0);

implementation

procedure Vibrate(Param : Integer);
{$IFDEF ANDROID}
Var
  Vibrator:JVibrator;
{$ENDIF}
begin
  {$IFDEF ANDROID}
    if Param = 0 then Param := 300;
    
    Vibrator:=TJVibrator.Wrap((SharedActivityContext.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE) as ILocalObject).GetObjectID);
    // Vibrate for Param milliseconds
    Vibrator.vibrate(Param);
  {$ENDIF}
  {$IFDEF IOS}
    if Param = 0 then Param := kSystemSoundID_vibrate;
    AudioServicesPlaySystemSound( Param );
  {$ENDIF}
end;

end.

参考:How to vibrate iOS and Android phones using FireMonkey and XE8

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚信安慧AntDB受邀分享核心业务系统全域数据库替换实践

近日,亚信安慧AntDB数据库凭借丰富的核心业务系统升级替换能力和经验,受邀参与IT168组织的第三期“国产软硬件升级替换之路”的直播沙龙。 亚信安慧AntDB数据库相关负责人发表《基于AntDB的CRM全域数据库替换实践》的精彩演讲,通过通信行业率…

cocos creator [Window] Cannot read property ‘dump‘ of null

写脚本的时候,出现了如下的问题, [Window] Cannot read property dump of null 原因:在下图中,方式一是正常的,而方式二则会爆出此错误,所以需要初始化,给它赋值

如何提高Pycharm的使用体验?

汉化 文件---设置---插件---chinese---安装---重启ide 代码补全 tabnine 文件---设置---插件---tabnine---安装---重启ide 重启ide后生效,补全效果如下 自定义背景 文件---设置---外观---背景图像---选择图片---调整透明度保存即可 设置头部声明 英文版…

Python 网络爬虫(四):初识网络爬虫

《Python入门核心技术》专栏总目录・点这里 文章目录 什么是爬虫爬虫的工作原理应用场景反爬虫合法和道德问题Robots 协议练习爬虫的一些网站总结 大家好,我是水滴~~ 在当今数字化时代,互联网上充斥着大量的数据和信息,而我们常常需要从这个…

python笔记:dtaidistance

1 介绍 用于DTW的库纯Python实现和更快的C语言实现 2 DTW举例 2.1 绘制warping 路径 from dtaidistance import dtw from dtaidistance import dtw_visualisation as dtwvis import numpy as np import matplotlib.pyplot as plts1 np.array([0., 0, 1, 2, 1, 0, 1, 0, 0…

android如何优雅的编写OpenGl的shader代码

通常在android里编写openGl代码的方式是创建一个类,类里面用硬编码的形式引入两个shader,如下图: 这里把glsl语言通过string字符串的形式定义在类里,虽然便于管理,但是不利于阅读和编写 那么有没有比较优雅的解决方案…

详解Python 迭代器介绍及作用

文章目录 迭代器:初探什么是迭代器?通过迭代器进行迭代迭代器 for 循环的工作构建自定义迭代器Python 无限迭代器Python 迭代器的好处总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包…

Uncle Maker: (Time)Stamping Out The Competition in Ethereum

目录 笔记后续的研究方向摘要引言贡献攻击的简要概述 Uncle Maker: (Time)Stamping Out The Competition in Ethereum CCS 2023 笔记 本文对以太坊 1 的共识机制进行了攻击,该机制允许矿工获得比诚实同行更高的挖矿奖励。这种名为“Uncle Maker”的攻击操纵区块时间…

基于Java SSM框架实现实现人事工资管理系统项目【项目源码+论文说明】

基于java的SSM框架实现人事工资管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个人事管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述人事…

Vue学习计划-Vue2--Vue组件(一)认识组件

1.0 引入组件 传统方式编写应用 使用组件方式编写应用 1.1 模块 理解:向外提供特定的js程序,一般就是一个js文件为什么:js文件很多很复杂作用:复用js,简化js的编写,提高js运行效率 1.2 组件认识 理解: …

提高工作效率的JavaScript单行代码

摘要: 平时在根据ui设计图处理数据的时候,需要用到js的一些方法!所以这里总结一些提高工作效率的JavaScript单行代码! 目录概览 摘要:1.#生成随机字符串2.# 转义HTML特殊字符3.# 单词首字母大写4.# 将字符串转换为小驼…

第74讲:MySQL数据库InnoDB存储引擎事务:Redo Log与Undo Logo的核心概念

文章目录 1.InnoDB引擎中的逻辑存储结构2.事务的基本概念3.Redo log的核心概念3.1.什么是Redo log3.2.如果没有redo log面临的问题3.3.使用redo log之后是怎样的流程 4.Undo log的核心概念 1.InnoDB引擎中的逻辑存储结构 InnoDB存储引擎的逻辑结构分为以下几层: Ta…

Distilling Knowledge via Knowledge Review 中文版

Distilling Knowledge via Knowledge Review: 通过知识回顾提炼知识 摘要 知识蒸馏将知识从教师网络传输到学生网络,旨在极大提高学生网络的性能。先前的方法大多集中在提出特征转换和损失函数,用于同一级别特征之间的改进效果。我们不同地…

第二十一章 网络通信

21.1 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。 局域网与互联网 服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机,实现两者间的相互通信。 网络协议 网络协议规定了计算…

集成开发环境PyCharm的使用【侯小啾python基础领航计划 系列(三)】

集成开发环境 PyCharm 的使用【侯小啾python基础领航计划 系列(三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

企业如何结合数字化技术实现精益生产

企业要想长远良性发展,就必须不断追求生产效率的极致,才能不断对抗各方各面带来的压力。结合国家大环境趋势,绿色生产已然成为了国家关注的重点,所以老旧耗能的企业生产模式注定会被时代所淘汰。企业只有紧跟国家的发展步伐&#…

QScrollArea的使用

参考&#xff1a; QT的自动滚动区QScrollArea的用法&#xff0c;图文详解-CSDN博客 demo: QScrollArea *scrollArea new QScrollArea;QWidget *pWgt new QWidget();QHBoxLayout *pLayout new QHBoxLayout();for(int i 0; i < 100; i){QPushButton *pBtn new QPushB…

【hacker送书第9期】算法训练营(入门篇)

第9期图书推荐 内容简介作者简介精彩书评图书目录概述参与方式 内容简介 本书以海量图解的形式&#xff0c;详细讲解常用的数据结构与算法&#xff0c;又融入大量的竞赛实例和解题技巧。通过对本书的学习&#xff0c;读者可掌握12种初级数据结构、15种常用STL函数、10种二叉树和…

java基础之循环

Java中有三种主要的循环结构&#xff1a; while 循环do…while 循环for 循环 1、while循环 1.1、结构 while( 布尔表达式 ) { //循环内容 } 1.2、实例 public class TestWhile {public static void main(String[] args) {int x 1;while (x<10){System.out.println("…

面试官:说说webpack的构建流程?

面试官&#xff1a;说说webpack的构建流程? 一、运行流程 webpack 的运行流程是一个串行的过程&#xff0c;它的工作流程就是将各个插件串联起来 在运行过程中会广播事件&#xff0c;插件只需要监听它所关心的事件&#xff0c;就能加入到这条webpack机制中&#xff0c;去改变…