位置: 编程技术 - 正文

Android 编程下 Touch 事件的分发和消费机制(androidstudio手机编程软件)

编辑:rootadmin

推荐整理分享Android 编程下 Touch 事件的分发和消费机制(androidstudio手机编程软件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android编程技术,android编程实例,android编程app,android编程app,android编程教程,android编程app,android编程实例,android编程app,内容如对您有帮助,希望把文章链接给更多的朋友!

本文转自: 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup、View、Activity。方法与控件的对应关系如下表所示:

Touch 事件相关方法 方法功能 ViewGroup View Activity public boolean dispatchTouchEvent(MotionEvent ev)事件分发 Yes Yes Yes public boolean onInterceptTouchEvent(MotionEvent ev) 事件拦截 Yes No No public boolean onTouchEvent(MotionEvent ev)事件响应 Yes Yes Yes从这张表中我们可以看到 ViewGroup 和 View 对与 Touch 事件相关的三个方法均能响应,而 Activity 对 onInterceptTouchEvent(MotionEvent ev) 也就是事件拦截不进行响应。另外需要注意的是 View 对 dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent ev) 的响应的前提是可以向该 View 中添加子 View,如果当前的 View 已经是一个最小的单元 View(比如 TextView),那么就无法向这个最小 View 中添加子 View,也就无法向子 View 进行事件的分发和拦截,所以它没有dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent ev),只有 onTouchEvent(MotionEvent ev)。

一、Touch 事件分析

▐ 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。dispatchTouchEvent 的事件分发逻辑如下:

如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;如果 return false,事件分发分为两种情况:如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent 进行消费。如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。▐ 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)

在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下,事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑如下:

如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认会被拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理。▐ 事件响应:public boolean onTouchEvent(MotionEvent ev)

在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。onTouchEvent 的事件响应逻辑如下:

如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。如果返回了 true 则会接收并消费该事件。如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。Android 编程下 Touch 事件的分发和消费机制(androidstudio手机编程软件)

到这里,与 Touch 事件相关的三个方法就分析完毕了。下面的内容会通过各种不同的的测试案例来验证上文中三个方法对事件的处理逻辑。

二、Touch 案例介绍同样在开始进行案例分析之前,我需要说明测试案例的结构,因为所有的测试都是针对这一个案例来进行的,测试中只是通过修改每个控件中与 Touch 事件相关的三个方法的返回&#;来体现不同的情况。先来看张图:上面的图为测试案例的布局文件 UI 显示效果,布局文件代码如下:蓝色背景为一个自定义控件 TouchEventFather,该控件为外层 View,继承自 LinearLayout,实现代码如下:红色背景为一个自定义控件 TouchEventChilds,该控件为内层 View,为 TouchEventFather 的子 View,同样继承自 LinearLayout,实现代码如下:接着实现 Activity 的代码,因为控件所有的事件都是通过 Activity 的 dispatchTouchEvent 进行分发的;除此之外还需要重写 Activity 的 onTouchEvent 方法,这是因为如果一个控件直接从 Activity 获取到事件,这个事件会首先被传递到控件的 dispatchTouchEvent 方法,如果这个方法 return false,事件会以冒泡方式返回给 Activity 的 onTouchEvent 进行消费。实现代码如下:最后再附上 TouchEventUtil 的代码,TouchEventUtil 中并没有做多少事情,只是将以上 2 个自定义控件中各个方法的 MotionEvent 集中到一个工具类中并将其对应的动作以 String 形式返回,这样处理更便于实时观察控件的事件。代码如下:三、Touch 案例分析

Case 1

拦截条件控件名称dispatchTouchEvent 返回&#;onInterceptTouchEvent 返回&#;onTouchEvent 返回&#;TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)TouchEventFatherfalsesuper.onInterceptTouchEvent(ev)super.onTouchEvent(ev)TouchEventChildssuper.dispatchTouchEvent(ev)super.onInterceptTouchEvent(ev)super.onTouchEvent(ev)运行结果LevelTimePIDApplicationTag Text W - ::. cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWN E - ::. cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWN W - ::. cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_DOWN W - ::. cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE W - ::. cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE W - ::. cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE W - ::. cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE W - ::. cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UP W - ::. cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_UP结果分析代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的dispatchTouchEvent,而该控件的 dispatchTouchEvent 返回 false,表示对获取到的事件停止向下传递,同时也不对该事件进行消费。由于 TouchEventFather 获取的事件直接来自 TouchEventActivity ,则会将事件返回给 TouchEventActivity 的 onTouchEvent 进行消费,最后直接由 TouchEventActivity 来响应手指移动和抬起事件。

Case 2

拦截条件控件名称dispatchTouchEvent 返回&#;onInterceptTouchEvent 返回&#;onTouchEvent 返回&#;TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)TouchEventFathertruesuper.onInterceptTouchEvent(ev)super.onTouchEvent(ev)TouchEventChildssuper.dispatchTouchEvent(ev)super.onInterceptTouchEvent(ev)super.onTouchEvent(ev)运行结果LevelTimePIDApplicationTag Text W - ::. cn.sunzn.tevent sunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWN E - ::. cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWN W - ::. cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE E - ::. cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_MOVE W - ::. cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE E - ::. cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_MOVE W - ::. cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE E - ::. cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_MOVE W - ::. cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UPE - ::. cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_UP结果分析代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent,而该控件的 dispatchTouchEvent 返回 true,表示分发事件到 TouchEventFather 控件并由该控件的 dispatchTouchEvent 进行消费;TouchEventActivity 不断的分发事件到 TouchEventFather 控件的dispatchTouchEvent,而 TouchEventFather 控件的 dispatchTouchEvent 也不断的将获取到的事件进行消费。

Case 3

拦截条件控件名称dispatchTouchEvent 返回&#;onInterceptTouchEvent 返回&#;onTouchEvent 返回&#;TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)TouchEventFathersuper.dispatchTouchEvent(ev)truesuper.onTouchEvent(ev)TouchEventChildssuper.dispatchTouchEvent(ev)super.onInterceptTouchEvent(ev)super.onTouchEvent(ev)运行结果LevelTimePIDApplicationTag TextW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWNE- ::.cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWNI- ::.cn.sunzn.teventsunzn TouchEventFather | onInterceptTouchEvent --> ACTION_DOWND- ::.cn.sunzn.teventsunzn TouchEventFather | onTouchEvent --> ACTION_DOWNW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_DOWNW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UPW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_UP结果分析代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent,而该控件的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),表示对事件进行分发并向下传递给 TouchEventFather 控件的 onInterceptTouchEvent 方法,该方法返回 true 表示对所获取到的事件进行拦截并将事件传递给 TouchEventFather 控件的 onTouchEvent 进行处理,TouchEventFather 控件的 onTouchEvent 返回 super.onTouchEvent(ev) 表示对事件没有做任何处理直接将事件返回给上级控件,由于 TouchEventFather 获取的事件直接来自 TouchEventActivity,所以 TouchEventFather 控件的 onTouchEvent 会将事件以冒泡方式直接返回给 TouchEventActivity 的 onTouchEvent 进行消费,后续的事件则会跳过 TouchEventFather 直接由 TouchEventActivity 的 onTouchEvent 消费来自 TouchEventActivity 自身分发的事件。

Case 4

拦截条件控件名称dispatchTouchEvent 返回&#;onInterceptTouchEvent 返回&#;onTouchEvent 返回&#;TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)TouchEventFathersuper.dispatchTouchEvent(ev)falsesuper.onTouchEvent(ev)TouchEventChildssuper.dispatchTouchEvent(ev)super.onInterceptTouchEvent(ev)super.onTouchEvent(ev)运行结果LevelTimePIDApplicationTag TextW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWNE- ::.cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWNI- ::.cn.sunzn.teventsunzn TouchEventFather | onInterceptTouchEvent --> ACTION_DOWNE- ::.cn.sunzn.teventsunzn TouchEventChilds | dispatchTouchEvent --> ACTION_DOWNI- ::.cn.sunzn.teventsunzn TouchEventChilds | onInterceptTouchEvent --> ACTION_DOWND- ::.cn.sunzn.teventsunzn TouchEventChilds | onTouchEvent --> ACTION_DOWND- ::.cn.sunzn.teventsunzn TouchEventFather | onTouchEvent --> ACTION_DOWNW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_DOWNW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVEW- ::.cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UPW- ::.cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_UP结果分析代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent,而该控件的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),表示对事件进行分发并向下传递给 TouchEventFather 控件的 onInterceptTouchEvent 方法,该方法返回 false 表示事件会被放行并传递到子控件 TouchEventChilds 的 dispatchTouchEvent 方法,同样 TouchEventChilds 的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),表示对事件进行分发并向下传递给 TouchEventChilds 控件的 onInterceptTouchEvent 方法,TouchEventChilds 的 onInterceptTouchEvent 方法返回 super.onInterceptTouchEvent(ev) 默认会将事件传递给 TouchEventChilds 的 onTouchEvent 进行处理,TouchEventChilds 的 onTouchEvent 返回 super.onTouchEvent(ev) 表示对事件没有做任何处理直接将事件返回给上级控件,由于 TouchEventChilds 获取的事件直接来自 TouchEventFather,所以 TouchEventChilds 控件的 onTouchEvent 会将事件以冒泡方式直接返回给 TouchEventFather 的 onTouchEvent 进行消费,而 TouchEventFather 的 onTouchEvent 也返回了 super.onTouchEvent(ev),同样 TouchEventFather 的 onTouchEvent 也会将事件返回给上级控件,而 TouchEventFather 获取的事件直接来自 TouchEventActivity,所以 TouchEventFather 控件的 onTouchEvent 会将事件以冒泡方式直接返回给 TouchEventActivity 的 onTouchEvent 进行消费,后续的事件则会跳过 TouchEventFather 和 TouchEventChilds 直接由 TouchEventActivity 的 onTouchEvent 消费来自 TouchEventActivity 自身分发的事件。

Case 5

拦截条件控件名称dispatchTouchEvent 返回&#;onInterceptTouchEvent 返回&#;onTouchEvent 返回&#;TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)TouchEventFathersuper.dispatchTouchEvent(ev)falsesuper.onTouchEvent(ev)TouchEventChildstruesuper.onInterceptTouchEvent(ev)super.onTouchEvent(ev)运行结果LevelTimePIDApplicationTag Text W - ::. cn.sunzn.tevent sunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWN E - ::. cn.sunzn.tevent sunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWN I - ::. cn.sunzn.tevent sunzn TouchEventFather | onInterceptTouchEvent --> ACTION_DOWN E - ::. cn.sunzn.tevent sunzn TouchEventChilds | dispatchTouchEvent --> ACTION_DOWN W - ::. cn.sunzn.tevent sunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE E - ::. cn.sunzn.tevent sunzn TouchEventFather | dispatchTouchEvent --> ACTION_MOVE I - ::. cn.sunzn.tevent sunzn TouchEventFather | onInterceptTouchEvent --> ACTION_MOVEE - ::.cn.sunzn.teventsunzn TouchEventChilds | dispatchTouchEvent --> ACTION_MOVE W - ::.cn.sunzn.tevent sunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UPE- ::.cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_UPI- ::.cn.sunzn.teventsunzn TouchEventFather | onInterceptTouchEvent --> ACTION_UP E - ::.cn.sunzn.tevent sunzn TouchEventChilds | dispatchTouchEvent --> ACTION_UP结果分析代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent,该控件的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev),事件会分发到 TouchEventFather 的 onInterceptTouchEvent,onInterceptTouchEvent 返回 false 表示放行当先事件;事件会被传递到子控件 TouchEventChilds 的 dispatchTouchEvent 方法,dispatchTouchEvent 返回 true 表示事件被分发到 TouchEventChilds 控件并由该控件的 dispatchTouchEvent 方法消费。后续的事件也会不断的重复上面的逻辑最终被 TouchEventChilds 的 dispatchTouchEvent 消费。

四、源码下载

下载地址:TouchEvent.rar

五、相关文档

文档地址:PRE_andevcon_mastering-the-android-touch-system.pdf

Android酷炫实用的开源框架(UI框架) Android酷炫实用的开源框架(UI框架)前言忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件

Android快速开发--使用ORMLite操作数据库 OrmLite是一个数据库操作辅助的开源框架,主要面向Java语言。在Android面向数据库开发中,是一个比较流行的开源框架,方便操作而且功能强大,今天来

深入源码剖析LruCache 引言:最近许多人在博客中提到自己在面试时被问LruCache的原理是?,发现自己之前完全没有接触过这个知识点,本着知其然知其所以然的态度,先搜索

标签: androidstudio手机编程软件

本文链接地址:https://www.jiuchutong.com/biancheng/382255.html 转载请保留说明!

上一篇:vs2010 编译mosquitto win32版本,开启websockets,实现消息推送(vs2010编译器在哪里?)

下一篇:Android酷炫实用的开源框架(UI框架)(安卓样式大全)

  • 城建税计税方法
  • 企业所得税税负率多少合适
  • 9月份扣什么税?
  • 对公账户汇款方式
  • 简易计税费
  • 预付加油卡发票可以报销吗
  • 直接进费用的固定资产
  • 个体户增值税按开票额来申报吗
  • 退回投资款转为借款怎么记账
  • 应发工资包含扣款吗
  • 付款方式公对公什么意思
  • 修理费没有发票怎么做账
  • 税控盘抵税账务处理
  • 小规模纳税人红字发票申报的时候怎么填
  • 固定资产本期折旧额与上期不一样
  • 车辆租赁费可以一次性计入费用吗
  • 评估入账的开发权是否可以税前扣除?
  • 会计员如何处理21种差额计税?
  • 小规模纳税人已经开了3%的票还可以享受1%的优惠吗
  • 计提工资和实际发放工资
  • 滞纳金由财务人员承担
  • 员工福利没有发票
  • 海运费付款方式
  • 怎样接收电子承兑汇票流程视频
  • 应付职工薪酬在借方是什么意思
  • 华为matex3爆料
  • 技术咨询服务费计入什么科目
  • 跟a签订合同可以撤销吗
  • 预缴税款是否计入成本
  • win7系统管理员密码忘了怎么办
  • win10任务栏快捷图标不见了
  • Win11 Build 22471 Dev版更新推送(附更新修复已知问题汇总)
  • 期票是不是承兑汇票
  • windows环境下,ping的功能和使用方法
  • 生产企业外销收入账务处理
  • 公众号 企业
  • echart设置legend
  • 环境保护税的征税范围及计税依据
  • centos-6.5-i386-bin-dvd1.iso
  • 摇树的英文是什么
  • tune a video:one-shot tuning of image diffusion models for text-to-video generation
  • lscpu命令 显示CPU架构信息
  • thinkphp教程
  • 外埠存款通过哪个会计账户核算?
  • 应纳税所得额100-300万税率
  • 工会经费的来源包括
  • 当月计提的公积金怎么取
  • 退税勾选错了怎么办
  • 如何解决在大学的压力英语作文
  • html友情链接模板
  • 土地增值税扣除项目20%
  • 扣伙食费会计分录
  • sql中多条件查询
  • 利润表和资产负债表不平的原因
  • 公司购买的公司用车
  • 公司与公司之间人与人之间最大的区别
  • 税务突然查账
  • 可供分配利润包括哪些
  • 企业购买房产怎么记账
  • 折扣销售方式销售货物只要发票中有注明的折扣额
  • 固定资产 金额
  • 差旅费属于其他费用吗
  • 离岸银行账户开户
  • 主营业务成本包括哪些费用
  • 七彩虹主板 csm
  • win7鼠标右键一闪就没了
  • macbookair网页视频看不了
  • freebsd版本选择
  • 关闭gui引导有什么用
  • 硬盘版win10
  • window10通知
  • 教你如何解决蓝光机/KODI无法打开局域网smb共享的问题
  • mac怎么共享网络给iphone
  • win7打开tftp服务器
  • 安卓笔记软件squid使用教程
  • 红宝书csv
  • android模拟器无法运行
  • 出租车发票密码区被撕掉了能报销吗?
  • 江苏税务app操作手册
  • 山西国税电子税务局电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设