Android如何基于坐标对View进行模拟点击事件详解
作者:技术小黑屋 发布时间:2021-09-24 06:27:30
前言
大家应该都知道,在Android中,我们对于View进行模拟点击事件,很容易,比如调用View.performClick
即可。
但是有些时候,我们想要更加精细的点击,比如View的某一区域或者某一点进行点击。比如下面的例子。
上面是一个WebView加载了一个视频,我们必须手动点一下播放按钮才能让视频播放,当然我们想要的最好是如下的自动播放效果(进入界面后,自动播放视频)
当然方法有很多,比如通过javascript调用视频元素的click事件。在这里我们暂不对该方法进行细究。本文旨在提供一种解决问题的可行方法。
其实我们可以通过View.dispatchTouchEvent
就能解决,因为一个click事件可以理解成一个Action_down和一个Action_up MotionEvent的组合,所以实现起来如下即可。
private fun simulateTouchEvent(view: View, x: Float, y: Float) {
val downTime = SystemClock.uptimeMillis()
val eventTime = SystemClock.uptimeMillis() + 100
val metaState = 0
val motionEvent = MotionEvent.obtain(downTime, eventTime,
MotionEvent.ACTION_DOWN, x, y, metaState)
view.dispatchTouchEvent(motionEvent)
val upEvent = MotionEvent.obtain(downTime + 1000, eventTime + 1000,
MotionEvent.ACTION_UP, x,y, metaState)
view.dispatchTouchEvent(upEvent)
}
关于坐标位置的选择,仔细分析你会发现,上面的视频的播放按钮其实是有特点的,播放按钮始终处于WebView的中心,即模拟的点击可以是WebView.getWidth/2
和WebView.height/2
这个点。
为了便于测试和验证模拟事件的成功,我们可以增加OnTouchListener进行验证,如下代码
webview?.setOnTouchListener { v, event ->
debugMessage("onTouchListener x=${event.x};y=${event.y}")
false
}
对于例子中的何时出发模拟事件,我们可以在WebView网页加载完成的时候实现,即
webview?.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
webview?.post {
webview?.let {
simulateTouchEvent(it, it.width / 2f, it.height / 2f)
}
}
}
}
基于坐标对View进行模拟点击的代码示例完整版,请访问 https://github.com/androidyue/SimulateViewClickByXandY 或者通过本地下载。
来源:https://droidyue.com/blog/2018/03/11/simulate-view-click-by-x-and-y/


猜你喜欢
- 今天给大家提供一个由今天给大家提供一个由Java swing实现的酒店管理系统,数据库采用sqlserver,我会贴上部分代码,完整的代码请
- Java 的表格表格是一个由多行,多列组成的二维显示区。Swing的JTable以及相关类提供了对这种表格的支持,程序既可以使用简单的代码创
- 一、AQS介绍队列同步器AbstractQueuedSynchronizer(简称AQS),AQS定义了一套多线程访问共享资源的同步器框架,
- 本文实例为大家分享了SpringBoot +Mail+FreeMarker发送邮件,供大家参考,具体内容如下通过spirngboot 自带的
- 1、找准入口,使用ClassPathXmlApplicationContext的构造方法加载配置文件,用于加载classPath下的配置文件
- 背景:当我们有需求将HashMap转为Json格式的String时,切记不要使用HashMap的toString()方法,需要使用FastJ
- 本文介绍一个C#函数,可以实现计算文件的MD5值,可以用于文件传输后进行有效性校验。我们知道可以通过将一个字符串进行散列(Hash)运算得到
- 引言为了让我更快的熟悉代码,前段时间组长交代了一个小任务,大致就是让我整理一下某个模块中涉及的 sql,也是方便我有目的的看代码,也是以后方
- JAVA多线程断点下载原理如图:代码如下:import java.io.BufferedReader; import java.io.Fil
- 有些手机在电话接通后会有振动提示,这有个好处就是可以等到接通后再放到耳边接听,减少辐射。本文就讲讲如何在Android手机中实现这种接通电话
- 今天看到一个ios写的图灵机器人,直接去官网(http://www.tuling123.com/openapi/)看了下API接入,太简单了
- 一直以来不是怎么清楚自旋锁,最近有点时间,好好的学习了一下;所谓的自旋锁在我的理解就是多个线程在尝试获取锁的时候,其中一个线程获取锁之后,其
- 本文实例为大家分享了Android实现京东上滑效果的具体代码,供大家参考,具体内容如下前言:现在很多app首页的结构都有头部广告,上滑固定t
- 遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。它能解决很多问题,
- 做Android开发五年了,期间做做停停(去做后台开发,服务器管理),当回来做Android的时候,发现很生疏,好
- 什么是队列结构一种线性结构,具有特殊的运算法则【只能在一端(队头)删除,在另一端(队尾)插入】。分类:顺序队列结构链式队列结构基本操作:入队
- springboot 针对jackson是自动化配置的,如果需要修改,有两种方式:方式一:通过application.yml配置属性说明:#
- 并发与并行并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点
- 一、Lambda 表达式的基础语 * ambda 表达式的基础语法:Java8中引入了一个新的操作符 "->" 该操
- 查了下网上的一些资料,感觉比较复杂,这里,我这几使用两种很简单的办法解决了中文乱码问题。Spring版本:3.2.2.RELEASEJack