對(duì)于坐標(biāo)的操作, 在編寫腳本中, 不可避免的會(huì)遇到,甚至是取色/截圖過程中都需要用到坐標(biāo)的拾取. 那如果每次都打開指針位置,用起來并不是很方便,在沒有root的設(shè)備上獲取坐標(biāo)點(diǎn), 在APP外部是沒辦法直接來監(jiān)聽屏幕點(diǎn)擊事件,但是如果在APP內(nèi)部則可以監(jiān)聽到用戶的點(diǎn)擊,那如何既在APP內(nèi),又可以操作APP外呢?
答案就是懸浮窗...純透明,用戶不可見的一層懸浮窗,在允許點(diǎn)擊懸浮窗的狀態(tài)下,監(jiān)聽用戶的點(diǎn)擊和滑動(dòng)事件, 然后在不允許點(diǎn)擊懸浮窗的狀態(tài)下,轉(zhuǎn)發(fā)用戶的點(diǎn)擊和滑動(dòng)事件, 這樣既監(jiān)聽到了點(diǎn)擊,又不影響用戶的正常操作.
基礎(chǔ)代碼:
//auto.waitFor() 注意這個(gè),因?yàn)橐D(zhuǎn)發(fā)點(diǎn)擊事件.所以需要打開無障礙服務(wù),
//如果你是低于安卓7.0的用戶,則無法使用...
auto.waitFor();
var w = floaty.rawWindow(
"top" gravity="center" bg="#00000000"/>
);
var x_start, y_start, x_end, y_end, time, actionCounts = 1;
//懸浮窗全屏, 但不會(huì)覆蓋到任務(wù)欄和導(dǎo)航欄
w.setSize(-1, -1);
//設(shè)置懸浮窗可點(diǎn), 可點(diǎn)狀態(tài)下監(jiān)聽用戶的點(diǎn)擊
w.setTouchable(true);
//腳本結(jié)束時(shí),關(guān)閉懸浮窗
events.on("exit", ()=>{
w.close();
});
w.top.setOnTouchListener(function(view, event) {
switch (event.getAction()) {
case event.ACTION_DOWN: //按下事件
w.setTouchable(false);
time = new Date();
x_start = event.getRawX();
y_start = event.getRawY();
return true;
case event.ACTION_MOVE: //移動(dòng)事件
return true;
case event.ACTION_UP: //抬起事件
swipeTime = new Date() - time;
if (Math.abs(event.getRawY() - y_start) > 3 || Math.abs(event.getRawX() - x_start) > 3) {
x_end = event.getRawX();
y_end = event.getRawY();
log("滑動(dòng)坐標(biāo): " + x_start + "," + y_start + "---->" + x_end + "," + y_end);
threads.start(function () {
swipe(x_start, y_start, x_end, y_end, swipeTime);
sleep(swipeTime + 100);
ui.run(function () {
w.setTouchable(true);
});
});
} else {
log("點(diǎn)擊坐標(biāo): " + x_start + "," + y_start);
threads.start(function () {
click(x_start, y_start);
ui.run(function () {
w.setTouchable(true);
});
})
}
return true;
}
return true;
});
//保持懸浮窗運(yùn)行
setInterval(()=>{}, 1000)
測(cè)試截圖如下圖的GIF:
如圖, 我開啟了指針位置. 獲取到的坐標(biāo)和指針位置顯示的坐標(biāo). 完全一致. 所以這么取點(diǎn)完全沒問題.唯一的缺點(diǎn)就是. 動(dòng)作有滯后性.因?yàn)橐缺O(jiān)聽后轉(zhuǎn)發(fā).所以沒法做到實(shí)時(shí)的操作. 至于各種投屏軟件那種實(shí)時(shí)的滑動(dòng)原理.我也沒有去了解...
因?yàn)槭亲罨A(chǔ)的代碼. 在此之外我有一些想法和思路分享出來, 在此的基礎(chǔ)上,我們是不是可以再做一個(gè)懸浮窗.來實(shí)時(shí)跟蹤指針的位置,顯示出當(dāng)前的坐標(biāo),當(dāng)前坐標(biāo)點(diǎn)的色值, 另外指針滑動(dòng)抬起時(shí),還可以設(shè)置一個(gè)詢問是否要截圖,等等的想法, 如果可以做到點(diǎn)擊滑動(dòng)無延遲是最好的. 有興趣的就繼續(xù)深入的研究一下吧.
-
APP
+關(guān)注
關(guān)注
33文章
1580瀏覽量
72835 -
腳本
+關(guān)注
關(guān)注
1文章
392瀏覽量
14957 -
root
+關(guān)注
關(guān)注
1文章
86瀏覽量
21422
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
并聯(lián)機(jī)器人快速準(zhǔn)確拾取物體
labview新手,將鼠標(biāo)移動(dòng)的坐標(biāo)以點(diǎn)簇?cái)?shù)組的形式拾取。
貼片機(jī)機(jī)器拾取的兩種基本模式
拾取停止工作
CAD坐標(biāo)標(biāo)注中如何標(biāo)注普通坐標(biāo)
CAD中怎么批量標(biāo)注坐標(biāo)?CAD批量標(biāo)注坐標(biāo)?
表面肌電信號(hào)拾取的專用有源濾波器設(shè)計(jì)
![表面肌電信號(hào)<b class='flag-5'>拾取</b>的專用有源濾波器設(shè)計(jì)](https://file1.elecfans.com//web2/M00/A5/80/wKgZomUMOLeAWl4DAAAgJZUpwBs688.jpg)
基于Jni技術(shù)局部區(qū)域拾取功能的快速實(shí)現(xiàn)_吳冰冰
機(jī)器視覺讓機(jī)器人能在儲(chǔ)存箱中拾取小型零件
雙麥遠(yuǎn)距離拾取降噪模塊的簡(jiǎn)單介紹
壓電特性及能量自拾取特性的研究
使用Arduino Uno的自動(dòng)拾取繞線機(jī)
![使用Arduino Uno的自動(dòng)<b class='flag-5'>拾取</b>繞線機(jī)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
輕松拾取無需觸摸的開源項(xiàng)目
![輕松<b class='flag-5'>拾取</b>無需觸摸的開源項(xiàng)目](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論