返回
消息列表的华丽变身:autojs轻松实现侧拉置顶删除菜单
Android
2023-11-17 15:20:25
用 autojs 为 QQ 消息列表打造华丽的侧拉置顶删除菜单
理解安卓事件分发机制
安卓的事件分发机制是一层层的,事件会从屏幕传递给不同的视图,由最合适的视图处理。如果一个视图拦截了事件,后面的视图就无法接收到该事件。
处理触摸事件冲突
QQ 消息列表侧拉菜单需要在滑动时触发,但不能影响消息列表本身的滚动。我们需要根据情况决定是否拦截触摸事件来避免冲突。
拦截触摸事件
当用户在消息列表上侧拉时,我们需要拦截触摸事件,交给侧拉菜单处理。这可以通过在侧拉菜单的 onTouchEvent 方法中拦截触摸事件来实现。
消费触摸事件
拦截触摸事件后,我们需要决定是否消费它。如果消费了触摸事件,后面的视图就无法接收和处理该事件。在我们的场景中,当用户开始侧拉操作时,我们需要消费触摸事件,以确保侧拉菜单能够正常显示。
RecyclerView 的基本使用
QQ 消息列表是基于 RecyclerView 实现的。RecyclerView 是一种高效的列表视图,可以轻松地添加、删除和更新列表项。在侧拉菜单中,我们将使用 RecyclerView 来显示消息列表,并提供置顶和删除操作。
autojs 实现侧拉菜单
// 主脚本
app = "com.tencent.mobileqq"
events.on("resume", function() {
main()
})
function main() {
var target = className("com.tencent.mobileqq.activity.SplashActivity").findOne(10000)
if (target) {
toast("脚本启动成功")
findMessageList()
}
}
function findMessageList() {
var id = "com.tencent.mobileqq:id/list_chat_lay"
var messageList = id.findOne(2000)
if (messageList) {
toast("找到消息列表")
setMessageListListener(messageList)
}
}
function setMessageListListener(messageList) {
messageList.setOnTouchListener(function(view, event) {
if (event.getAction() == event.ACTION_DOWN) {
var x = event.getRawX()
var y = event.getRawY()
var itemView = messageList.childAt(messageList.pointToPosition(x, y))
if (itemView) {
var slideMenu = itemView.findViewById(id)
if (slideMenu) {
slideMenu.performClick()
return true
}
}
}
return false
})
}
// 侧拉菜单脚本
app = "com.tencent.mobileqq"
events.on("resume", function() {
main()
})
function main() {
var target = className("com.tencent.mobileqq.activity.SplashActivity").findOne(10000)
if (target) {
toast("脚本启动成功")
findSlideMenu()
}
}
function findSlideMenu() {
var id = "com.tencent.mobileqq:id/message_slide_menu"
var slideMenu = id.findOne(2000)
if (slideMenu) {
toast("找到侧拉菜单")
setSlideMenuListener(slideMenu)
}
}
function setSlideMenuListener(slideMenu) {
slideMenu.setOnTouchListener(function(view, event) {
if (event.getAction() == event.ACTION_UP) {
var x = event.getRawX()
var y = event.getRawY()
var itemView = slideMenu.getParent()
var position = itemView.getParent().childAt(itemView.getParent().pointToPosition(x, y))
if (position) {
var messageInfo = position.getChild(2).findOne(id)
if (messageInfo) {
toast(messageInfo.getText())
}
}
}
return false
})
}
创新与实用
这个脚本为 QQ 消息列表添加了一个侧拉菜单,提高了消息管理效率,让沟通更便捷。
常见问题解答
- 如何安装 autojs?
- 访问 autojs 官网下载并安装。
- 如何运行脚本?
- 将脚本保存在 SD 卡上,在 autojs 应用程序中打开并运行它。
- 侧拉菜单无法显示怎么办?
- 检查脚本是否正确安装,确保消息列表 id 正确。
- 如何自定义侧拉菜单的内容?
- 修改侧拉菜单脚本中的 RecyclerView 适配器。
- 可以为其他应用程序添加侧拉菜单吗?
- 可以,了解该应用程序的事件分发机制并编写相应的脚本。