Android如何基于坐標(biāo)對(duì)View進(jìn)行模擬點(diǎn)擊事件詳解
前言
大家應(yīng)該都知道,在Android中,我們對(duì)于View進(jìn)行模擬點(diǎn)擊事件,很容易,比如調(diào)用View.performClick即可。
但是有些時(shí)候,我們想要更加精細(xì)的點(diǎn)擊,比如View的某一區(qū)域或者某一點(diǎn)進(jìn)行點(diǎn)擊。比如下面的例子。

上面是一個(gè)WebView加載了一個(gè)視頻,我們必須手動(dòng)點(diǎn)一下播放按鈕才能讓視頻播放,當(dāng)然我們想要的最好是如下的自動(dòng)播放效果(進(jìn)入界面后,自動(dòng)播放視頻)

當(dāng)然方法有很多,比如通過(guò)javascript調(diào)用視頻元素的click事件。在這里我們暫不對(duì)該方法進(jìn)行細(xì)究。本文旨在提供一種解決問(wèn)題的可行方法。
其實(shí)我們可以通過(guò)View.dispatchTouchEvent就能解決,因?yàn)橐粋€(gè)click事件可以理解成一個(gè)Action_down和一個(gè)Action_up MotionEvent的組合,所以實(shí)現(xiàn)起來(lái)如下即可。
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)
}
關(guān)于坐標(biāo)位置的選擇,仔細(xì)分析你會(huì)發(fā)現(xiàn),上面的視頻的播放按鈕其實(shí)是有特點(diǎn)的,播放按鈕始終處于WebView的中心,即模擬的點(diǎn)擊可以是WebView.getWidth/2和WebView.height/2這個(gè)點(diǎn)。
為了便于測(cè)試和驗(yàn)證模擬事件的成功,我們可以增加OnTouchListener進(jìn)行驗(yàn)證,如下代碼
webview?.setOnTouchListener { v, event ->
debugMessage("onTouchListener x=${event.x};y=${event.y}")
false
}
對(duì)于例子中的何時(shí)出發(fā)模擬事件,我們可以在WebView網(wǎng)頁(yè)加載完成的時(shí)候?qū)崿F(xiàn),即
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)
}
}
}
}
基于坐標(biāo)對(duì)View進(jìn)行模擬點(diǎn)擊的代碼示例完整版,請(qǐng)?jiān)L問(wèn) https://github.com/androidyue/SimulateViewClickByXandY 或者通過(guò)本地下載。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
詳解Android的內(nèi)存優(yōu)化--LruCache
LruCache是基于Lru算法實(shí)現(xiàn)的一種緩存機(jī)制。本文對(duì)LruCache的概念和實(shí)現(xiàn)原理進(jìn)行介紹,通過(guò)實(shí)例分析和使用介紹,讓大家更好的了解LruCache,下面跟著小編一起來(lái)看下吧2016-12-12
完美解決客戶端webview持有的頁(yè)面緩存,不會(huì)立即釋放的問(wèn)題
下面小編就為大家?guī)?lái)一篇完美解決客戶端webview持有的頁(yè)面緩存,不會(huì)立即釋放的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
Android性能優(yōu)化之利用Rxlifecycle解決RxJava內(nèi)存泄漏詳解
RxJava作為一種響應(yīng)式編程框架,是目前編程界網(wǎng)紅,可謂是家喻戶曉,其簡(jiǎn)潔的編碼風(fēng)格、易用易讀的鏈?zhǔn)椒椒ㄕ{(diào)用、強(qiáng)大的異步支持等使得RxJava被廣泛使用。2017-01-01
Android 使用Vitamio打造自己的萬(wàn)能播放器(5)——在線播放(播放優(yōu)酷視頻)
本文主要介紹Android Vitamio的使用,這里給大家提供效果圖和代碼實(shí)例,來(lái)說(shuō)明Vitamio組件播放網(wǎng)絡(luò)視頻,有需要的小伙伴可以參考下2016-07-07
Android啟動(dòng)頁(yè)設(shè)置及動(dòng)態(tài)權(quán)限跳轉(zhuǎn)問(wèn)題解決
在我遇到這個(gè)實(shí)際問(wèn)題之前,我一直認(rèn)為啟動(dòng)頁(yè)的作用是美化產(chǎn)品,提升軟件逼格。但實(shí)際上,它更重要的是起到了一個(gè)攔截器的作用,這篇文章主要介紹了Android啟動(dòng)頁(yè)設(shè)置以及動(dòng)態(tài)權(quán)限跳轉(zhuǎn),需要的朋友可以參考下2022-04-04
Android 模擬器(JAVA)與C++ socket 通訊 分享
Android 模擬器(JAVA)與C++ socket 通訊 分享,需要的朋友可以參考一下2013-05-05
Android自定義控件制作顯示進(jìn)度的Button
這篇文章主要為大家詳細(xì)介紹了Android自定義控件制作顯示進(jìn)度的Button,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
如何通過(guò)Android Logcat插件分析firebase崩潰問(wèn)題
android crash Crash(應(yīng)用崩潰)是由于代碼異常而導(dǎo)致App非正常退出,導(dǎo)致應(yīng)用程序無(wú)法繼續(xù)使用,所有工作都停止的現(xiàn)象,本文重點(diǎn)介紹如何通過(guò)Android Logcat插件分析firebase崩潰問(wèn)題,感興趣的朋友一起看看吧2024-01-01

