深圳微商城网站设计宣传片制作标准参数

diannao/2026/1/22 0:48:19/文章来源:
深圳微商城网站设计,宣传片制作标准参数,今天国际新闻,网上商城是什么软件rk3588s: 旋转编码器input输入事件适配 基于Android 12 kernel-5.10版本 参考文档#xff1a; https://blog.csdn.net/szembed/article/details/131551950 Linux 输入设备调试详解#xff08;零基础开发#xff09;Rotary_Encoder旋转编码器驱动 通用GPIO为例 挂载input输…rk3588s: 旋转编码器input输入事件适配 基于Android 12 kernel-5.10版本 参考文档 https://blog.csdn.net/szembed/article/details/131551950 Linux 输入设备调试详解零基础开发Rotary_Encoder旋转编码器驱动 通用GPIO为例 挂载input输入子系统 https://source.android.google.cn/docs/core/interaction/input?hlzh-cn https://developer.android.google.cn/reference/android/support/wearable/input/RotaryEncoder https://developer.android.google.cn/training/wearables/user-input/rotary-input?hlzh-cn 旋转输入 某些 Wear OS 设备包含实体侧面旋钮。当用户旋转此类旋钮时应用的当前视图会向上或向下滚动。此类输入称为“旋转输入”。 1驱动层配置 配置设备树使用已有的rotary_encoder.c驱动代码。 linux驱动设备树配置参考 https://elixir.bootlin.com/linux/latest/source/drivers/input/misc/rotary_encoder.c https://elixir.bootlin.com/linux/latest/source/arch/arm64/boot/dts/freescale/imx8mn-dimonoff-gateway-evk.dtsrotary: rotary-encoder {compatible rotary-encoder;pinctrl-names default;pinctrl-0 pinctrl_rotary;gpios gpio5 12 GPIO_ACTIVE_LOW, /* A */gpio5 13 GPIO_ACTIVE_LOW; /* B */linux,axis 0; /* REL_X */rotary-encoder,relative-axis;};pinctrl_rotary: rotarygrp {fsl,pins MX8MN_IOMUXC_ECSPI2_MISO_GPIO5_IO12 0x00000156MX8MN_IOMUXC_ECSPI2_SS0_GPIO5_IO13 0x00000156;};2framework层适配 上面驱动层配置好设备树后通过getevent能看到rotary encoder事件。 但是应用App层却收不到。 旋转编码器input输入事件和鼠标滚轮类似设备上鼠标滚轮事件是正常的。 于是先看鼠标滚轮事件。 鼠标滚轮 $ adb shell getevent -lpi add device 2: /dev/input/event2bus: 0003vendor 093aproduct 2533version 0111name: Gaming Mouselocation: usb-fc840000.usb-1/input0id: version: 1.0.1events:KEY (0001): BTN_MOUSE BTN_RIGHT BTN_MIDDLE BTN_SIDE BTN_EXTRA REL (0002): REL_X REL_Y REL_WHEEL REL_WHEEL_HI_RES MSC (0004): MSC_SCAN input props:noneadb shell dumpsys input2: Gaming MouseClasses: CURSOR | EXTERNALPath: /dev/input/event2Enabled: trueDescriptor: 922b2be403d5734c3dacd1c480566209f0f39e80Location: usb-fc840000.usb-1/input0ControllerNumber: 0UniqueId: Identifier: bus0x0003, vendor0x093a, product0x2533, version0x0111KeyLayoutFile: KeyCharacterMapFile: ConfigurationFile: VideoDevice: none01-11 03:13:33.710 569 663 I EventHub: New device: id6, fd181, path/dev/input/event2, nameGaming Mouse, classesCURSOR | EXTERNAL, configuration, keyLayout, keyCharacterMap, builtinKeyboardfalse, 01-11 03:13:33.714 569 663 I InputReader: Device added: id5, eventHubId6, nameGaming Mouse, descriptor922b2be403d5734c3dacd1c480566209f0f39e80,sources0x00002002 rotary encoder事件信息 rotary encoder事件信息 $ adb shell getevent -lpi add device 2: /dev/input/event0bus: 0019vendor 0000product 0000version 0000name: rotary // 设备名是rotarylocation: id: version: 1.0.1events:REL (0002): REL_X input props:none添加rotary.idc文件用于framework层识别rotary encoder设备 framework层代码流程分析 frameworks/native/services/inputflinger/reader/EventHub.cpp// Load the configuration file for the device.device-loadConfigurationLocked();// 要想rotary encoder旋转编码器被framework层识别到需要的条件要有configuration文件且device.type为rotaryEncoder// See if this is a rotary encoder type device.String8 deviceType String8();if (device-configuration device-configuration-tryGetProperty(String8(device.type), deviceType)) {if (!deviceType.compare(String8(rotaryEncoder))) {device-classes | InputDeviceClass::ROTARY_ENCODER;}}// 根据设备名找configuration配置文件adb shell getevent -lpi 查看到设备名是name: rotary// Try device name.return getInputDeviceConfigurationFilePathByName(deviceIdentifier.getCanonicalName(), type); 先在android源代码device目录grep -r rotaryEncoder搜索看看是否有类似配置。 搜索到virtio_input_rotary.idc所以执行如下操作验证framework层就能识别到旋转编码器设备了 cp device/generic/goldfish/input/virtio_input_rotary.idc rotary.idc adb push rotary.idc /system/usr/idc/添加rotary.idc文件虽然framework层识别到了rotary encoder设备但是事件还是报不到App层。继续分析。原因是rotary encoder报的事件是 EV_REL REL_X而RotaryEncoderInputMapper没有解析REL_X事件。因此需要适配解析REL_X事件 打开DEBUG_INBOUND_EVENT_DETAILS log开关后验证旋转编码器的input事件 能看到log时说明App层就能收到事件如果打印不出该log则App层收不到事件。 void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) { #if DEBUG_INBOUND_EVENT_DETAILSALOGD(notifyMotion - id% PRIx32 eventTime% PRId64 , deviceId%d, source0x%x, displayId% PRId32 , policyFlags0x%x, action0x%x, actionButton0x%x, flags0x%x, metaState0x%x, buttonState0x%x, edgeFlags0x%x, xPrecision%f, yPrecision%f, xCursorPosition%f, yCursorPosition%f, downTime% PRId64,args-id, args-eventTime, args-deviceId, args-source, args-displayId,args-policyFlags, args-action, args-actionButton, args-flags, args-metaState,args-buttonState, args-edgeFlags, args-xPrecision, args-yPrecision,args-xCursorPosition, args-yCursorPosition, args-downTime);for (uint32_t i 0; i args-pointerCount; i) {ALOGD( Pointer %d: id%d, toolType%d, x%f, y%f, pressure%f, size%f, touchMajor%f, touchMinor%f, toolMajor%f, toolMinor%f, orientation%f,i, args-pointerProperties[i].id, args-pointerProperties[i].toolType,args-pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X),args-pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y),args-pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE),args-pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_SIZE),args-pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR),args-pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR),args-pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR),args-pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR),args-pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));} #endifRotaryEncoderInputMapper解析旋转编码器的input事件数据 RotaryEncoderInputMapper::sync() 函数解析旋转编码器的input事件 $ adb shell getevent -l add device 1: /dev/input/event0name: rotary/dev/input/event0: EV_REL REL_X 00000001 /dev/input/event0: EV_SYN SYN_REPORT 00000000 /dev/input/event0: EV_REL REL_X ffffffff /dev/input/event0: EV_SYN SYN_REPORT 0000000086 void RotaryEncoderInputMapper::process(const RawEvent* rawEvent) { 87 mRotaryEncoderScrollAccumulator.process(rawEvent); 88 89 if (rawEvent-type EV_SYN rawEvent-code SYN_REPORT) { 90 sync(rawEvent-when, rawEvent-readTime); 91 } 92 } 93 94 void RotaryEncoderInputMapper::sync(nsecs_t when, nsecs_t readTime) { 95 PointerCoords pointerCoords; 96 pointerCoords.clear(); 97 98 PointerProperties pointerProperties; 99 pointerProperties.clear(); 100 pointerProperties.id 0; 101 pointerProperties.toolType AMOTION_EVENT_TOOL_TYPE_UNKNOWN; 102 ALOGI(RotaryEncoderInputMapper::sync);// scroll 返回的是0导致下面notifyMotion走不到。需要在getRelativeVWheel函数里适配 103 float scroll mRotaryEncoderScrollAccumulator.getRelativeVWheel(); 104 bool scrolled scroll ! 0; 105 106 // This is not a pointer, so its not associated with a display. 107 int32_t displayId ADISPLAY_ID_NONE; 108 109 // Moving the rotary encoder should wake the device (if specified). 110 uint32_t policyFlags 0; 111 if (scrolled getDeviceContext().isExternal()) { 112 policyFlags | POLICY_FLAG_WAKE; 113 } 114 115 if (mOrientation DISPLAY_ORIENTATION_180) { 116 scroll -scroll; 117 } 118 119 // Send motion event. 120 if (scrolled) { 121 int32_t metaState getContext()-getGlobalMetaState(); 122 pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_SCROLL, scroll * mScalingFactor);// 添加x的值否则无论正向旋转还是反向旋转x值都是0导致应用App无法识别方向pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, scroll); 123 124 NotifyMotionArgs scrollArgs(getContext()-getNextId(), when, readTime, getDeviceId(), 125 mSource, displayId, policyFlags, AMOTION_EVENT_ACTION_SCROLL, 0, 126 0, metaState, /* buttonState */ 0, MotionClassification::NONE, 127 AMOTION_EVENT_EDGE_FLAG_NONE, 1, pointerProperties, 128 pointerCoords, 0, 0, AMOTION_EVENT_INVALID_CURSOR_POSITION, 129 AMOTION_EVENT_INVALID_CURSOR_POSITION, 0, /* videoFrames */ {}); 130 getListener()-notifyMotion(scrollArgs);ALOGI(RotaryEncoderInputMapper::sync notifyMotion); 131 } 132 133 mRotaryEncoderScrollAccumulator.finishSync(); 134 }42 void CursorScrollAccumulator::process(const RawEvent* rawEvent) { 43 if (rawEvent-type EV_REL) { 44 switch (rawEvent-code) { 45 case REL_WHEEL: 46 mRelWheel rawEvent-value; 47 break; 48 case REL_HWHEEL: 49 mRelHWheel rawEvent-value; 50 break;case REL_X: // 由于自己的旋转编码器报的事件是REL_X所以需要添加该类型解析mRelWheel rawEvent-value;break; 51 } 52 } 53 }log: 旋转编码器正向旋转x1.000000 SOURCE_ROTARY_ENCODER 0x00400000 source0x400000 04-07 05:47:32.041 575 667 D InputDispatcher: notifyMotion - idb0eb158 eventTime1947954629000, deviceId4, source0x400000, displayId-1, policyFlags0x0, action0x8, actionButton0x0, flags0x0, metaState0x0, buttonState0x0, edgeFlags0x0, xPrecision0.000000, yPrecision0.000000, xCursorPositionnan, yCursorPositionnan, downTime0 04-07 05:47:32.041 575 667 D InputDispatcher: Pointer 0: id0, toolType0, x1.000000, y0.000000, pressure0.000000, size0.000000, touchMajor0.000000, touchMinor0.000000, toolMajor0.000000, toolMinor0.000000, orientation0.000000 04-07 05:47:32.041 575 666 D InputDispatcher: dispatchMotion - eventTime1947954629000, deviceId4, source0x400000, displayId-1, policyFlags0x62000000, action0x8, actionButton0x0, flags0x0, metaState0x0, buttonState0x0,edgeFlags0x0, xPrecision0.000000, yPrecision0.000000, downTime0 04-07 05:47:32.041 575 666 D InputDispatcher: Pointer 0: id0, toolType0, x1.000000, y0.000000, pressure0.000000, size0.000000, touchMajor0.000000, touchMinor0.000000, toolMajor0.000000, toolMinor0.000000, orientation0.000000旋转编码器反向旋转x-1.000000 SOURCE_ROTARY_ENCODER 0x00400000 source0x400000 04-07 05:47:35.923 575 667 I InputReader: lqy111 RotaryEncoderInputMapper::sync 04-07 05:47:35.923 575 667 I InputReader: lqy111 RotaryEncoderInputMapper::sync: scroll:-1.000000 04-07 05:47:35.923 575 667 I InputReader: lqy111 RotaryEncoderInputMapper::sync notifyMotion 04-07 05:47:35.923 575 667 D InputDispatcher: notifyMotion - id45c55f eventTime1951836828000, deviceId4, source0x400000, displayId-1, policyFlags0x0, action0x8, actionButton0x0, flags0x0, metaState0x0, buttonState0x0, edgeFlags0x0, xPrecision0.000000, yPrecision0.000000, xCursorPositionnan, yCursorPositionnan, downTime0 04-07 05:47:35.923 575 667 D InputDispatcher: Pointer 0: id0, toolType0, x-1.000000, y0.000000, pressure0.000000, size0.000000, touchMajor0.000000, touchMinor0.000000, toolMajor0.000000, toolMinor0.000000, orientation0.000000 04-07 05:47:35.923 575 666 D InputDispatcher: dispatchMotion - eventTime1951836828000, deviceId4, source0x400000, displayId-1, policyFlags0x62000000, action0x8, actionButton0x0, flags0x0, metaState0x0, buttonState0x0,edgeFlags0x0, xPrecision0.000000, yPrecision0.000000, downTime0 04-07 05:47:35.923 575 666 D InputDispatcher: Pointer 0: id0, toolType0, x-1.000000, y0.000000, pressure0.000000, size0.000000, touchMajor0.000000, touchMinor0.000000, toolMajor0.000000, toolMinor0.000000, orientation0.000000core/java/android/view/InputDevice.java: public static final int SOURCE_ROTARY_ENCODER 0x00400000 | SOURCE_CLASS_NONE; source0x400000App层监听旋转输入事件 App层监听旋转输入事件 developer.android.google.cn/training/wearables/user-input/rotary-input myView.setOnGenericMotionListener onGenercMotion 或者 在Activity也可以。framework层监听旋转输入事件 在NativeInputManager::interceptMotionBeforeQueueing()添加适配代码。 com_android_server_input_InputManagerService.cpp void NativeInputManager::interceptMotionBeforeQueueing(const int32_t displayId, nsecs_t when,uint32_t policyFlags) {调试总结 make libinputreader -j3 make libinputflinger -j3 make libinputflinger_base -j3while true; do echo ######$(date)######;adb logcat -b all | grep -i -E EventHub|InputDispatcher|InputReader|WindowManager; doneadb shell getevent adb shell getevent -l adb shell getevent -lip adb shell dumpsys input

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

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

相关文章

正能量网站入口免费安全产品展示的手机网站

使用Turbo C和Turbo Pascal开始学习编程貌似也是一代人的集体记忆。这方面我也没什么忌讳,毕竟Borland Turbo C在九十年代末的PC上面还是一个运行效率不错的开发工具。然而启蒙老师的水平限制,那个时候所学习的编写和调试技术都不过关,一个超…

中国最好的域名注册网站微信小程序第三方开发

Hibernate中的标识符为实体的主键属性建模。 它有助于我们唯一地标识JPA实体。 每个实体都必须定义一个标识符。 同样,它可以是简单的也可以是复合的。 我们可以通过几种方式定义一个Hibernate标识符。 在本教程中,我们将学习如何做。 简单&#xff08…

虹口专业做网站微信支付申请网站建设未完成

文章来源&#xff1a;包子博客MySql 优化的 30 条建议1、应尽量避免在 where 子句中使用!或<>操作符&#xff0c;否则将引擎放弃使用索引而进行全表扫描。2、对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引…

深圳做网站网络营销公司接推广app任务的平台

进程的调度时机与进程的切换操作系统原理中介绍了大量进程调度算法&#xff0c;这些算法从实现的角度看仅仅是从运行队列中选择一个新进程&#xff0c;选择的过程中运用了不同的策略而已。对于理解操作系统的工作机制&#xff0c;反而是进程的调度时机与进程的切换机制更为关键…

信誉好的网站开发东莞seo整站优化火速

最近项目中有一个网络判断的需求&#xff0c;因为终端只能连接wifi&#xff0c;wifi即使连接上也可能会出现不能连接网络的问题&#xff0c;所以需要进行网络连接的判断。ping的相关知识使用ping检验网络是否可以连接ping就是检测客户端是否可以上网。那么我们就上代码该段代码…

微信网站建设定制住房公积金个人提取

1 问题 glide加载图片地址的时候&#xff0c;可能这个地址没有图片&#xff0c;那么我们需要对这种异常情况进行处理&#xff0c;当然我们也需要把这个图片进行圆形化 2 代码解决 Glide.with(mContext).load(iconPath).error(new ColorDrawable()).listener(new RequestListen…

汕头拿家做网站广州软件园软件开发公司

简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 源码github地址 源码gitee地址 中文文档地址 中央仓库地址 <!-- http://repo1.maven.org/ma…

网站备案没了自己建一个简单的网站

高校心理教育辅导系统目录 目录 基于Springboot的高校心理教育辅导系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、学生功能模块的实现 &#xff08;1&#xff09;学生登录界面 &#xff08;2&#xff09;留言反馈界面 &#xff08;3&#xff09;试卷列表界…

本省网站建设建议微信营销的优势

转载自http://blog.csdn.net/lu597203933/article/details/14104505 灰度直方图 这次我从最基本的直方图讲起&#xff0c;一维直方图&#xff0c;至于二维等高维直方图&#xff0c;仅作为了解&#xff0c;后面有时间另开blog详解。 1&#xff1a;首先我们给出一幅图 其中的数据…

微信网站开发流程戚墅堰网站建设

多重纹理和纹理组合器 本文主要介绍OpenGL中两种技术的使用方法&#xff1a;多重纹理技术和纹理组合器技术&#xff0c;最终根据参考【2】中的代码&#xff0c;实现了两个简单的演示DEMO&#xff0c;其中使用到了《八叉树颜色量化、BMP、TGA文件解析》篇章中提供的图像解析类。…

找活做的网站wordpress首页白屏

1、什么是视图视图是虚拟的表&#xff0c;是一个存储的查询&#xff0c;虽然不需要实际的物理存储&#xff0c;但是也被看作是一个数据库对象&#xff1b;它与包含数据的表不一样&#xff0c;它不包含任何列或数据&#xff0c;它只是包含使用时动态检索数据的查询&#xff0c;并…

中英文网站建设企业网站未收录

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

织梦系统网站地图模板下载中国最好的外贸公司

1.最大公约数和最小公倍数的组合问题 &#xff08;1&#xff09;在调试的过程中涉及到很大的数据&#xff0c;我们我们在定义变量的时候定义为long long类型 &#xff08;2&#xff09;这个里面我们自定义了max2用来求最大公约数&#xff0c;min2用来求最小公倍数 &#xff0…

网站站做地图软件西安网站工作室

由于大量数据存储在数据库同一张表中&#xff0c;后期性能和扩展会受到影响。所以需要进行表分区&#xff0c;因为它可以将大表分成较小的表&#xff0c;从而减少内存交换问题和表扫描&#xff0c;最终提高性能。庞大的数据集被分成更小的分区&#xff0c;更易于访问和管理。 …

东莞网站设计案例阿里建站价格

目录 AQS简介AQS的设计思路AQS的核心组成部分 状态&#xff08;State&#xff09;同步队列&#xff08;Sync Queue&#xff09;条件队列&#xff08;Condition Queue&#xff09; AQS的内部实现 节点&#xff08;Node&#xff09;锁的获取与释放 独占锁共享锁 条件变量 AQS的应…

谷歌网站推广费用软装设计网站有哪些

void类型修饰符(type specifier)表示“没有值可以获得”。因此&#xff0c;不可以采用这个类型声明变量或常量。void 类型可以用于下面各小节所描述的目的。void用于函数声明没有返回值的函数&#xff0c;其类型为 void。例如&#xff0c;标准库函数 perror() 被声明为以下原型…

关于建设集团公司网站的报告众包网站建设

按显示技术尺寸来分&#xff0c;主要分为大尺寸和小尺寸&#xff08;10寸以下&#xff09;&#xff0c;TFT-LCD行业下游主要是各类型消费电子&#xff0c;包括PC显示器&#xff0c;液晶电视&#xff0c;智能手机等。 TFT&#xff0d;LCD面板产业链 资料来源&#xff1a;共研产…

做公众好号的网站吗黄冈做学生互评的网站

这开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;共1830人左右 1 2 3 4 5&#xf…

做足球推荐网站能赚钱吗1.网站建设基本流程是什么

代码框架 // 在数组nums将下标从left到right中进行从小到大排序// 原理是先将一个元素排好序&#xff0c;然后将其他的元素排好序void sort(int[] nums, int left, int right) {if (left > right) {return;}// 对数组nums[left,right]进行切分&#xff0c;使得nums[left,p-1…

台州企业网站搭建价格网站关键词代码位置

目前的技术存在的问题&#xff1f;   尽管DCOM和IIOP都是固定的协议&#xff0c;业界还没有完全转向其中任何一个协议。没有融合的部分原因是文化的问题所致。而且在当一些组织试图标准化一个或另一个协议的时候&#xff0c;两个协议的技术适用性就被提出质疑。传统上认为DC…