开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 28060|回复: 2
收起左侧

[android源码] E4A魔改版V1.3+忧愁_超级事件监听器 监听任意事件

[复制链接]
发表于 2021-1-1 20:01:17 | 显示全部楼层 |阅读模式   重庆市重庆市
本帖最后由 宇智波·佐助 于 2021-1-9 19:54 编辑

E4A魔改版V1.3+忧愁_超级事件监听器 监听任意事件




E4A的事件监听器相信大家应该都用过只是有一个很致命的问题,只能监听固定的那几个e4a官方自己带的组件的事件,其他第三方的一些类库都不能成功监听到。这样的话就很大的制约了e4a开发的自由度,经过对 e4a事件管理者EventDispatcher 的分析,对齐进行了修改后做出此魔改版+类库,经过仔细测试不会对原本e4a的事件派发产生影响。

肝了几天的成果免费给大家,接类库定制,APP定制,e4a冲突解决,网页开发,php后端开发,联系QQ:2557594045



下面分享一下我对e4a EventDispatcher 流程和实现原理的分析
EventDispatcher 一共有两个方法一个内部类,在可视页面添加一个控件或者写一个全局变量,那么e4a会自动生成代码对这个组件进行注册 调用这个方法registerEvent 它一共有三个参数Object object, String dataMemberName, String eventName 注册方法中 使用传入的这三个参数创建EventDispatcher.EventHandlerClosure 并添加到  private static Map<String, List<EventDispatcher.EventHandlerClosure>> registry = new HashMap();中在调用dispatchEvent派发事件方法后根据添加的eventName从  private static Map<String, List<EventDispatcher.EventHandlerClosure>> registry = new HashMap();查询事件名对应的List<EventDispatcher.EventHandlerClosure>
遍历List数据使用EventHandlerClosure的getDataMemberObject()通过反射获取到注册位置的变量,进行判断如果相等那么就调用相等对象invokeEvent对事件进行派发,EventHandlerClosure的构造方法中会先通过注册时传入的对象使用反射获取到class,判断该类中是否有对应的方法,如果有才会去给getDataMemberObject()中用到的对象赋值,否则也不会使用反射进行派发。



版本V1.3
重写了e4a的事件管理者EventDispatcher在不影响原本事件正常流程的情况下配合超级事件监听器可以实现监听任意组件的任意事件,而不是像官方自带那样只能监听固定的几个

历史版本V1.2
将e4a sdk中的attr资源从23更新到了24使得部分属性可用,如无障碍的手势操作可以无需2次编译

历史版本V1.1
1.增加可视组件公共方法   置显示位置(位置 为 单精度小数型) 为 空  ,可以设置可视组件的Z轴显示位置,此方法可以控制显示位置到底层,顶层,中间任意位置都可控制使用示例 标签1.置显示位置(100)  按钮1.置显示位置(0) 此方法参数为单精度小数型(float)任意可视组件都可调用。
注意此方法仅在Android SDK大于或者等于21(android5.0)使用才会生效
公共方法所有可视组件均可直接调用,不管是否在类库中写出声明注释

2.增加可视组件公共方法设  取显示位置() 为 单精度小数型  ,获取可视组件显示位置()返回单精度小数型(float)
此方法仅在Android SDK大于或者等于21(android5.0)使用才会生效
公共方法所有可视组件均可直接调用,不管是否在类库中写出声明注释

3.增加可视组件公共方法 到底层() 和到顶层一样使用将组件移动到底层,此方法和置显示位置并不冲突,到的是当前显示位置的最底层,并不会跨越 置显示位置设置的位置,简单来说如果没有调用 置显示位置 那么所有的组件都是在一个平面的到底层和顶层只是在这个平面中活动,而调用了置显示位置那么就会移动到指定的平面,哪怕你调用到顶层也只是到了当前平面的顶层,并不能直接覆盖更高平面的组件,未调用置显示位置的组件均为0.0,最低层。

4.增加可视组件公共方法 到底层1() 和到底层方法效果几乎一致,优化了性能,可能导致可视和不可视状态出现问题,是否使用自行衡量,部分场景仅可使用此方法所以添加。
公共方法所有可视组件均可直接调用,不管是否在类库中写出声明注释

5..增加可视组件公共方法 到顶层1() 和到顶层方法效果几乎一致,优化了性能,可能导致可视和不可视状态出现问题,是否使用自行衡量,部分场景仅可使用此方法所以添加。
公共方法所有可视组件均可直接调用,不管是否在类库中写出声明注释

/*
关于如何将view移动到底层这里开源一个很简单的方法顺便说一下遇到的坑关于移动到顶层直接调用View的bringToFront()方法即可,但是官方并没有提供与之相反的方法,这就很坑了,查了很久资料有人说可以使用View.setZ方法改变Z轴,但是此方法在Android5.0以后加入的,此前的Android版本都用不了,经过分析Android的源码发现最终调用了 ViewGroup的bringChildToFront方法,其中大致逻辑为removeFromArray方法先移除addInArray添加到最上方,然后调用 requestLayout(); invalidate();刷新,removeFromArray,和addInArray都是private不能直接调用我尝试过反射不过Android10测试无法反射,找不到方法java.lang.NoSuchMethodException,最后突然灵光一闪,想到了这个方法,经过测试可用,获取 ViewGroup,removeView(child)移除view然后  viewGroup.addView(child,0);第二个参数index 设置为0就是最底层。

public void sendToBack(View child) {
        ViewGroup viewGroup=  ((ViewGroup)child.getParent());
        viewGroup.removeView(child);
        viewGroup.addView(child,0);

}




*/


历史版本:
版本V1.0


1.增加 窗口.窗口焦点改变 事件,更方便的控制焦点,设置沉浸等用途。

事件 主窗口.窗口焦点改变(是否获得焦点 为 逻辑型 )
忧愁_沉浸工具1.一键沉浸4()
弹出提示(是否获得焦点)
结束 事件

2.增加 打开窗口方法 更简洁的切换窗口窗口

现在可以使用 打开窗口("容器窗口")这一行简单的代码
替换下面的代码了效果完全一致               
如果 读取窗口("容器窗口")=空 则
保存窗口("容器窗口",创建 容器窗口)
结束 如果
切换窗口(读取窗口("容器窗口"))

3.增加常用方法取SDK版本

4.增加方法获取设备物理标识()



此版本增加3个可视组件的公共方法主要为了方便控制组件显示层次。
忧愁的qq:2557594045
欢迎加入安卓开发交流群 970905285
欢迎加入忧愁类库开发交流群 1038857728

安装方法
基于6.8E4A修改以前版本安装可能出现不兼容情况推荐使用6.8
将此压缩包里的E4A目录粘贴到E4A安装目录中全部替换即可。






下载地址:https://share.weiyun.com/kua3j2AR





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

  • · 鱼木|主题: 1558, 订阅: 152
结帖率:94% (181/193)

签到天数: 20 天

发表于 2021-1-1 23:41:52 | 显示全部楼层   安徽省芜湖市
总有一些大神无私奉献 让编程环境更加美好 希望小刀也可以重视
回复 支持 反对

使用道具 举报

结帖率:82% (45/55)

签到天数: 20 天

发表于 2021-1-1 23:24:44 | 显示全部楼层   江苏省无锡市
666666666666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表