返回

消息列表的华丽变身:autojs轻松实现侧拉置顶删除菜单

Android

用 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 适配器。
  • 可以为其他应用程序添加侧拉菜单吗?
    • 可以,了解该应用程序的事件分发机制并编写相应的脚本。