ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

openFrameworks iOS 触控与屏幕旋转事件开发实战:基于 eventsExample 的完整解析

openFrameworks iOS 触控与屏幕旋转事件开发实战:基于 eventsExample 的完整解析 图形学音视频【免费下载链接】openFrameworksopenFrameworks is a community-developed cross platform toolkit for creative coding in C.项目地址https://gitcode.com/gh_mirrors/op/openFrameworks点击查看免费下载本篇文章基于 openFrameworks 仓库中 examples/ios/eventsExample 示例系统讲解 iOS 平台上多点触控事件touchDown、touchMoved、touchUp、touchDoubleTap、touchCancelled与设备方向旋转事件deviceOrientationChanged的监听、参数提取与界面反馈实现。读完本文你将掌握在 ofxiOS 应用中组织事件回调、利用ofTouchEventArgs获取坐标与触点编号、借助ofGetTimestampString()/ofGetElapsedTimeMillis()处理时间信息以及通过ofiOSWindowSettings配置窗口渲染特性的完整方案。示例概览与学习目标eventsExample是一个面向 iOS 设备的 openFrameworks 示例其核心演示目标是触控事件与方向事件。官方 README 指出学习该示例后你将理解当屏幕被一根或多根手指触摸、或用户旋转设备时如何触发事件并从事件中取回信息。示例主体结构非常典型包含三个文件src/ofApp.h应用类声明继承自ofxiOSAppsrc/ofApp.mm全部事件回调与绘制逻辑实现src/main.mmiOS 窗口设置与程序入口。整个应用运行后屏幕上会显示当前时间、自启动以来经过的毫秒数以及当前正在触发的事件名称与参数用户触摸屏幕或旋转设备即可看到对应标签实时更新。应用入口与 iOS 窗口配置在 openFrameworks 的 iOS 工程中程序入口位于main.mm。eventsExample的入口展示了ofiOSWindowSettings的典型用法src/main.mm#include ofApp.h int main() { // here are the most commonly used iOS window settings. ofiOSWindowSettings settings; settings.enableRetina false; // 若设备支持则启用 Retina 分辨率 settings.enableDepth false; // 为 3D 绘制启用深度缓冲 settings.enableAntiAliasing false; // 启用抗锯齿平滑屏幕图形边缘 settings.numOfAntiAliasingSamples 0; // 抗锯齿采样数量 settings.enableHardwareOrientation false; // 启用原生视图方向 settings.enableHardwareOrientationAnimation false; // 原生方向变化是否带动画 settings.glesVersion OFXIOS_RENDERER_ES1; // 使用的渲染器类型ES1、ES2 等 ofCreateWindow(settings); return ofRunApp(new ofApp); }各配置项含义如下配置项默认值/取值作用enableRetinafalse设备支持时是否启用 Retina 高清分辨率开启会增大实际渲染缓冲尺寸enableDepthfalse是否启用深度缓冲3D 绘制需要置为trueenableAntiAliasingfalse是否启用抗锯齿平滑图形边缘numOfAntiAliasingSamples0抗锯齿采样数需配合enableAntiAliasing使用enableHardwareOrientationfalse是否启用系统原生视图方向与软件层方向处理二选一enableHardwareOrientationAnimationfalse原生方向切换时是否播放系统动画glesVersionOFXIOS_RENDERER_ES1渲染器版本可选 ES1、ES2 等入口通过ofCreateWindow(settings)创建窗口再以ofRunApp(new ofApp)启动应用循环。glesVersion选择 ES2/ES3 后绘制代码应使用可编程管线ofGLProgrammableRenderer而示例默认使用 ES1 以保证最大兼容性。触控事件体系五个回调与事件参数事件回调的生命周期openFrameworks 将 iOS 的UITouch底层事件统一抽象为五个回调见 ofApp.hvoid touchDown(ofTouchEventArgs touch); void touchMoved(ofTouchEventArgs touch); void touchUp(ofTouchEventArgs touch); void touchDoubleTap(ofTouchEventArgs touch); void touchCancelled(ofTouchEventArgs touch);touchDown手指按下屏幕时触发touchMoved手指在屏幕上滑动时持续触发touchUp手指离开屏幕时触发touchDoubleTap检测到双击时触发touchCancelled系统中断触摸如来电、手势识别抢占时触发。由于ofTouchEventArgs每次回调都携带id字段多指触摸时可以依据id区分每一根手指实现真正的多点触控跟踪。ofTouchEventArgs 参数详解ofTouchEventArgs定义于 libs/openFrameworks/events/ofEvents.h它继承自glm::vec2坐标可直接当作二维向量使用并携带丰富的触摸信息class ofTouchEventArgs : public ofEventArgs, public glm::vec2 { public: enum Type { down, up, move, doubleTap, cancel }; Type type; // 事件类型 int id; // 触点编号用于区分多指 int time; // 事件发生时间 int numTouches; // 当前屏幕上触点总数 float width, height;// 触摸区域尺寸 float angle; // 触摸区域角度 float minoraxis, majoraxis; // 触摸区域长短轴 float pressure; // 按压压力 float xspeed, yspeed; // 触点移动速度 float xaccel, yaccel; // 触点加速度 };示例中只用到x、y继承自glm::vec2与id但在实现手势识别、压感绘图、双指缩放等高级交互时numTouches、pressure、xspeed/yspeed都是现成的数据源。对应的事件声明同样位于 ofEvents.h由ofEventofTouchEventArgs模板统一派发。触控事件的实现方式在 ofApp.mm 中每个回调把事件信息格式化为字符串存入成员变量eventString交由draw()绘制void ofApp::touchDown(ofTouchEventArgs touch){ eventString touchDown ofToString(touch.x, 2) , ofToString(touch.y, 2) - id ofToString(touch.id); } void ofApp::touchMoved(ofTouchEventArgs touch){ eventString touchMoved ofToString(touch.x, 2) , ofToString(touch.y, 2) - id ofToString(touch.id); } void ofApp::touchUp(ofTouchEventArgs touch){ eventString touchUp ofToString(touch.x, 2) , ofToString(touch.y, 2) - id ofToString(touch.id); } void ofApp::touchDoubleTap(ofTouchEventArgs touch){ eventString doubleTap at ofToString(touch.x, 2) , ofToString(touch.y, 2); }这里ofToString(touch.x, 2)将坐标保留两位小数转为字符串便于精确回显touch.id则用于识别多指场景下是第几根手指。touchCancelled在示例中保持空实现实际项目中常在此处重置拖拽状态、清理临时数据。方向旋转事件deviceOrientationChanged设置初始方向示例在setup()中强制将屏幕设为横屏右向ofApp.mmvoid ofApp::setup(){ ofSetOrientation(OF_ORIENTATION_90_RIGHT); // Set iOS to Orientation Landscape Right vagRounded.load(vag.ttf, 18); ofBackground(50,50,50); }ofSetOrientation接受ofOrientation枚举值其定义位于 libs/openFrameworks/app/ofWindowSettings.h枚举值数值含义OF_ORIENTATION_DEFAULT1默认方向手机通常竖屏OF_ORIENTATION_1802旋转 180 度倒置OF_ORIENTATION_90_LEFT3顺时针旋转 90 度OF_ORIENTATION_90_RIGHT4逆时针旋转 90 度示例所用的横屏右向OF_ORIENTATION_UNKNOWN5未知方向方向设置的底层接口定义于 libs/openFrameworks/app/ofAppBaseWindow.h窗口抽象基类提供虚函数setOrientation(ofOrientation)各平台窗口实现负责将软件层方向应用到渲染坐标系ofGetWidth()/ofGetHeight()也会根据方向自动换算宽高。监听旋转事件应用类重写deviceOrientationChanged(int newOrientation)即可捕获设备旋转ofApp.mmvoid ofApp::deviceOrientationChanged(int newOrientation){ eventString alert - orientation change to ofToString(newOrientation); }回调参数newOrientation即上文ofOrientation枚举的数值如横屏右向为 4示例将其直接拼入字符串显示。需要说明的是当main.mm中enableHardwareOrientation false时方向处理走 openFrameworks 软件层若改为true则交由 iOS 原生视图处理此时需注意软件坐标与原生坐标的对应关系。应用生命周期与系统事件除触摸与方向外ofApp还重写了三个系统事件ofApp.mmvoid ofApp::lostFocus(){ eventString alert - lost focus; } void ofApp::gotFocus(){ eventString alert - got focus; } void ofApp::gotMemoryWarning(){ eventString alert - memory warning; }lostFocus/gotFocus应用失去/获得焦点如弹出系统对话框、切到后台再返回gotMemoryWarning系统内存告警。iOS 对内存占用敏感收到该事件时应及时释放纹理、缓冲等大块资源否则应用可能被系统强制终止。时间信息获取ofGetTimestampString 与 ofGetElapsedTimeMillisREADME 特别提示关注两种时间访问方式示例在draw()中演示了其一ofApp.mmvoid ofApp::draw(){ ofTranslate(-60, -60, 0); timeString ofGetTimestampString(%H:%M:%S.%i) \n; ofSetHexColor(0xffffff); vagRounded.drawString(eventString, 98,198); ofSetColor(255,122,220); vagRounded.drawString(eventString, 100,200); ofSetHexColor(0xffffff); vagRounded.drawString(timeString, 98,98); ofSetColor(255,122,220); vagRounded.drawString(timeString, 100,100); }ofGetTimestampString(%H:%M:%S.%i)按格式化字符串返回当前时刻的时间戳%H:%M:%S为时:分:秒%i为毫秒适合显示时钟类信息ofGetElapsedTimeMillis()返回自程序启动以来经过的毫秒数适合驱动动画、计时逻辑。绘制部分使用ofTrueTypeFont示例加载字体文件vag.ttf字号 18分别以白色与粉色双份绘制文字形成轻微的 2 像素偏移阴影效果提升可读性。ofSetHexColor与ofSetColor两种颜色设置方式在示例中交替出现前者接受十六进制色值后者接受 RGB 分量或ofColor对象。其他相关类与延伸方向README 指出本示例使用的核心类是 ofxiOS负责将 openFrameworks 编译到 Apple iOS 设备应用类通过继承ofxiOSApp获得完整的生命周期与事件回调能力。在此基础上你可以进一步延伸借助numTouches与id实现双指缩放、旋转等手势利用pressure、xspeed/yspeed实现压感画笔与惯性滚动结合 events 目录下的其他示例如 allEventsExample、simpleEventsExample理解事件系统的通用机制——iOS 触控事件与桌面端键盘/鼠标事件共享同一套ofEvent派发体系在gotMemoryWarning中清理ofImage、ofVbo、ofFbo等 GPU 资源以保障 iOS 稳定性。小结eventsExample是一个麻雀虽小、五脏俱全的 iOS 交互入门示例它完整覆盖了多点触控五事件、设备方向旋转、焦点与内存告警以及时间获取与文字绘制等高频开发场景。对照 ofApp.mm 与 ofEvents.h 中的ofTouchEventArgs定义你可以快速将这套事件驱动模式迁移到自己的 iOS 创意编程项目中实现从能跑到会交互的进阶。赞分享图形学音视频【免费下载链接】openFrameworksopenFrameworks is a community-developed cross platform toolkit for creative coding in C.项目地址https://gitcode.com/gh_mirrors/op/openFrameworks点击查看免费下载相关推荐openFrameworks iOS 自定义事件实战基于 advancedEventsExample 掌握 ofEvent 的注册、绑定与触发openFrameworks iOS 自定义事件实战基于 advancedEventsExample 掌握 ofEvent 的注册、绑定与触发 导读 本文以仓图形学音视频openFrameworks 树莓派触摸屏开发入门rpiTouchExample 触摸事件与 ofAppEGLWindow 源码级解析openFrameworks 树莓派触摸屏开发入门rpiTouchExample 触摸事件与 ofAppEGLWindow 源码级解析 本篇技术指南围绕 op图形学音视频iOS屏幕旋转终极指南ZFPlayer横竖屏适配的完整解决方案iOS屏幕旋转终极指南ZFPlayer横竖屏适配的完整解决方案 在iOS应用开发中视频播放器的横竖屏旋转适配一直是开发者面临的挑战之一。ZFPlayer作为音视频移动开发上一篇英雄联盟智能助手完整指南League Akari如何提升你的游戏体验下一篇DDrawCompat终极指南5分钟解决经典游戏在现代Windows上的运行难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表