前言

大家应该都知道,在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,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)

}

}

}

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

webview 模拟点击_Android如何基于坐标对View进行模拟点击事件详解相关推荐

  1. 基于百度地图实现Android定位功能实现(详解+教程)

    基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...

  2. 基于密度的聚类算法(3)——DPC详解

    基于密度的聚类算法(1)--DBSCAN详解 基于密度的聚类算法(2)--OPTICS详解 基于密度的聚类算法(3)--DPC详解 1. DPC简介 2014年,一种新的基于密度的聚类算法被提出,且其 ...

  3. android 拖动 点击事件,Android事件详解——拖放事件DragEvent

    1.Android拖放框架的作用? 利用Android的拖放框架,可以让用户用拖放手势把一个View中的数据移到当前layout内的另一个View中去. 2.拖放框架的内容? 1)拖放事件类 2)拖放 ...

  4. vuecli 编译后部署_基于vue-cli 打包时抽离项目相关配置文件详解

    前言:当使用vue-cli进行开发时时常需要动态配置一些设置,比如接口的请求地址(axios.defaults.baseURL),这些设置可能需要在项目编译后再进行设置的,所以在vue-cli里我们需 ...

  5. python画二维散点图-基于python 二维数组及画图的实例详解

    1.二维数组取值 注:不管是二维数组,还是一维数组,数组里的数据类型要一模一样,即若是数值型,全为数值型 #二维数组 import numpy as np list1=[[1.73,1.68,1.71 ...

  6. php jquery点击事件,jQuery操作html元素点击事件详解

    这次给大家带来jQuery操作html元素点击事件详解,jQuery操作html元素点击事件的注意事项有哪些,下面就是实战案例,一起来看一下. 移除或禁用html元素的点击事件可以通过css实现也可以 ...

  7. python读取遥感 dat_基于python批量处理dat文件及科学计算方法详解

    摘要:主要介绍一些python的文件读取功能,文件内容修改,文件名后缀更改等操作. 批处理文件功能 import os path1 = 'C:\\Users\\awake_ljw\\Documents ...

  8. python cut函数_基于python cut和qcut的用法及区别详解

    我就废话不多说了,直接上代码吧: from pandas import Series,DataFrame import pandas as pd import numpy as np from num ...

  9. 基于DNS的全局负载均衡(GSLB)详解(上篇)

    基于DNS的全局负载均衡(GSLB)详解(上篇) 前言 DNS流量负载和容灾切换功能的意义 单数据中心 双数据中心/两地三中心 云扩展 前言 DNS解析现在已经成为互联网访问的第一步,访问网络资源必然 ...

最新文章

  1. 实验干货分享:用Go语言实现分布式缓存开发之map
  2. java date 过时_过时date.toLocaleString()的解决方法
  3. 前端学习(1704):前端系列javascript之问题解答2和总结
  4. 361766103.jpg
  5. SQL Server之备份和还原系统数据库
  6. NYOJ 46 最少乘法次数
  7. python怎么过滤停用词_第6天:文本处理流程——停用词的过滤、正则化操作
  8. Java原生图片Base64转码与Base64解码
  9. iOS开发之—— XCODE真机调试设备连接一直忙碌如何处理!(真机调试各种错误提示解决)...
  10. LCD LED TN IPS等常见的显示器技术名称
  11. Android如何避免抓包
  12. 量子计算机怎么控制量子状态,量子计算机是什么 它为何如此强大
  13. C++入门经典-例6.23-字符串数组赋值与string
  14. java中的finalize
  15. 中枢神经的运动控制理论,神经网络运动控制方式
  16. 亚马逊苹果手机数据爬取
  17. 从程序员到架构师都需要经历什么?
  18. 久等了,改造版阿里 sentinel 控制台终于开源了
  19. 2021年 我的java面试题
  20. 魔兽世界怀旧服服务器显示离线上不去,魔兽世界怀旧服服务器断开连接怎么办-魔兽世界怀旧服怎么进不去_6137游戏网...

热门文章

  1. Selenium基础篇之5-第一个完整的自动化测试脚本
  2. 读《图解HTTP》有感-(HTTP报文内的HTTP消息)
  3. T1155 金明的预算方案 codevs
  4. js 斐波那契数列(兔子问题)
  5. this 自引用指针
  6. CSS背景图像的简单响应
  7. Customer Group Checkout----------Red2Black_RealTidbits
  8. 系统也需和谐共存——Win7与XP安装同一盘符方法解析
  9. [转载] Python程序将十进制转换为二进制,八进制和十六进制
  10. [转载] Python 完整实现的简单遗传算法(SGA)