對于坐標的操作, 在編寫腳本中, 不可避免的會遇到,甚至是取色/截圖過程中都需要用到坐標的拾取. 那如果每次都打開指針位置,用起來并不是很方便,在沒有root的設備上獲取坐標點, 在APP外部是沒辦法直接來監聽屏幕點擊事件,但是如果在APP內部則可以監聽到用戶的點擊,那如何既在APP內,又可以操作APP外呢?
答案就是懸浮窗...純透明,用戶不可見的一層懸浮窗,在允許點擊懸浮窗的狀態下,監聽用戶的點擊和滑動事件, 然后在不允許點擊懸浮窗的狀態下,轉發用戶的點擊和滑動事件, 這樣既監聽到了點擊,又不影響用戶的正常操作.
基礎代碼:
//auto.waitFor() 注意這個,因為要轉發點擊事件.所以需要打開無障礙服務,
//如果你是低于安卓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;
//懸浮窗全屏, 但不會覆蓋到任務欄和導航欄
w.setSize(-1, -1);
//設置懸浮窗可點, 可點狀態下監聽用戶的點擊
w.setTouchable(true);
//腳本結束時,關閉懸浮窗
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: //移動事件
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("滑動坐標: " + 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("點擊坐標: " + x_start + "," + y_start);
threads.start(function () {
click(x_start, y_start);
ui.run(function () {
w.setTouchable(true);
});
})
}
return true;
}
return true;
});
//保持懸浮窗運行
setInterval(()=>{}, 1000)
測試截圖如下圖的GIF:
如圖, 我開啟了指針位置. 獲取到的坐標和指針位置顯示的坐標. 完全一致. 所以這么取點完全沒問題.唯一的缺點就是. 動作有滯后性.因為要先監聽后轉發.所以沒法做到實時的操作. 至于各種投屏軟件那種實時的滑動原理.我也沒有去了解...
因為是最基礎的代碼. 在此之外我有一些想法和思路分享出來, 在此的基礎上,我們是不是可以再做一個懸浮窗.來實時跟蹤指針的位置,顯示出當前的坐標,當前坐標點的色值, 另外指針滑動抬起時,還可以設置一個詢問是否要截圖,等等的想法, 如果可以做到點擊滑動無延遲是最好的. 有興趣的就繼續深入的研究一下吧.
-
APP
+關注
關注
33文章
1577瀏覽量
72665 -
腳本
+關注
關注
1文章
391瀏覽量
14917 -
root
+關注
關注
1文章
86瀏覽量
21409
發布評論請先 登錄
相關推薦
評論