webview 模拟点击_Android如何基于坐标对View进行模拟点击事件详解
前言
大家应该都知道,在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进行模拟点击事件详解相关推荐
- 基于百度地图实现Android定位功能实现(详解+教程)
基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...
- 基于密度的聚类算法(3)——DPC详解
基于密度的聚类算法(1)--DBSCAN详解 基于密度的聚类算法(2)--OPTICS详解 基于密度的聚类算法(3)--DPC详解 1. DPC简介 2014年,一种新的基于密度的聚类算法被提出,且其 ...
- android 拖动 点击事件,Android事件详解——拖放事件DragEvent
1.Android拖放框架的作用? 利用Android的拖放框架,可以让用户用拖放手势把一个View中的数据移到当前layout内的另一个View中去. 2.拖放框架的内容? 1)拖放事件类 2)拖放 ...
- vuecli 编译后部署_基于vue-cli 打包时抽离项目相关配置文件详解
前言:当使用vue-cli进行开发时时常需要动态配置一些设置,比如接口的请求地址(axios.defaults.baseURL),这些设置可能需要在项目编译后再进行设置的,所以在vue-cli里我们需 ...
- python画二维散点图-基于python 二维数组及画图的实例详解
1.二维数组取值 注:不管是二维数组,还是一维数组,数组里的数据类型要一模一样,即若是数值型,全为数值型 #二维数组 import numpy as np list1=[[1.73,1.68,1.71 ...
- php jquery点击事件,jQuery操作html元素点击事件详解
这次给大家带来jQuery操作html元素点击事件详解,jQuery操作html元素点击事件的注意事项有哪些,下面就是实战案例,一起来看一下. 移除或禁用html元素的点击事件可以通过css实现也可以 ...
- python读取遥感 dat_基于python批量处理dat文件及科学计算方法详解
摘要:主要介绍一些python的文件读取功能,文件内容修改,文件名后缀更改等操作. 批处理文件功能 import os path1 = 'C:\\Users\\awake_ljw\\Documents ...
- python cut函数_基于python cut和qcut的用法及区别详解
我就废话不多说了,直接上代码吧: from pandas import Series,DataFrame import pandas as pd import numpy as np from num ...
- 基于DNS的全局负载均衡(GSLB)详解(上篇)
基于DNS的全局负载均衡(GSLB)详解(上篇) 前言 DNS流量负载和容灾切换功能的意义 单数据中心 双数据中心/两地三中心 云扩展 前言 DNS解析现在已经成为互联网访问的第一步,访问网络资源必然 ...
最新文章
- 实验干货分享:用Go语言实现分布式缓存开发之map
- java date 过时_过时date.toLocaleString()的解决方法
- 前端学习(1704):前端系列javascript之问题解答2和总结
- 361766103.jpg
- SQL Server之备份和还原系统数据库
- NYOJ 46 最少乘法次数
- python怎么过滤停用词_第6天:文本处理流程——停用词的过滤、正则化操作
- Java原生图片Base64转码与Base64解码
- iOS开发之—— XCODE真机调试设备连接一直忙碌如何处理!(真机调试各种错误提示解决)...
- LCD LED TN IPS等常见的显示器技术名称
- Android如何避免抓包
- 量子计算机怎么控制量子状态,量子计算机是什么 它为何如此强大
- C++入门经典-例6.23-字符串数组赋值与string
- java中的finalize
- 中枢神经的运动控制理论,神经网络运动控制方式
- 亚马逊苹果手机数据爬取
- 从程序员到架构师都需要经历什么?
- 久等了,改造版阿里 sentinel 控制台终于开源了
- 2021年 我的java面试题
- 魔兽世界怀旧服服务器显示离线上不去,魔兽世界怀旧服服务器断开连接怎么办-魔兽世界怀旧服怎么进不去_6137游戏网...
热门文章
- Selenium基础篇之5-第一个完整的自动化测试脚本
- 读《图解HTTP》有感-(HTTP报文内的HTTP消息)
- T1155 金明的预算方案 codevs
- js 斐波那契数列(兔子问题)
- this 自引用指针
- CSS背景图像的简单响应
- Customer Group Checkout----------Red2Black_RealTidbits
- 系统也需和谐共存——Win7与XP安装同一盘符方法解析
- [转载] Python程序将十进制转换为二进制,八进制和十六进制
- [转载] Python 完整实现的简单遗传算法(SGA)