安卓基礎(無障礙點擊)

無障礙點擊核心代碼

// 自定義無障礙服務類,繼承自Android系統的AccessibilityService
public class MyAccessibilityService extends AccessibilityService {// 當系統產生無障礙事件時的回調方法(如界面變化、焦點切換等)@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 這里可以監聽屏幕內容變化(默認空實現)}// 當系統需要中斷服務時的回調方法(如用戶關閉服務)@Overridepublic void onInterrupt() {// 服務中斷處理邏輯(默認空實現)}// 核心方法:通過坐標執行點擊操作public void clickAtPoint(int x, int y) {// 構建手勢描述對象GestureDescription.Builder builder = new GestureDescription.Builder();// 創建路徑對象(用于定義手勢軌跡)Path path = new Path();// 將路徑起點移動到目標坐標path.moveTo(x, y);// 在同一個坐標點畫線(形成點擊手勢)path.lineTo(x, y); // 單點點擊的核心邏輯// 構建手勢描述:// 添加手勢筆畫(Stroke),參數說明:// path - 手勢路徑// 0    - 開始時間(單位:毫秒,0表示立即開始)// 50   - 持續時間(單位:毫秒,50ms足夠完成點擊)GestureDescription gesture = builder.addStroke(new GestureDescription.StrokeDescription(path, 0, 50)).build();// 執行手勢操作dispatchGesture(gesture, new GestureResultCallback() {// 手勢成功完成的回調@Overridepublic void onCompleted(GestureDescription gestureDescription) {super.onCompleted(gestureDescription);Log.d("TAG", "點擊完成"); // 日志記錄點擊成功}// 手勢被取消的回調@Overridepublic void onCancelled(GestureDescription gestureDescription) {super.onCancelled(gestureDescription);Log.e("TAG", "點擊取消"); // 日志記錄點擊失敗}}, null); // 第三個參數Handler可設置為null(使用默認線程)}
}

無障礙滑動核心代碼

public class MyAccessibilityService extends AccessibilityService {// 核心方法:通過坐標執行滑動操作public void swipe(int startX, int startY, int endX, int endY, int durationMs) {GestureDescription.Builder builder = new GestureDescription.Builder();Path path = new Path();// 定義滑動路徑path.moveTo(startX, startY);     // 起點path.lineTo(endX, endY);          // 終點// 構建手勢描述:// 參數說明:// path - 滑動路徑// 0    - 開始時間(0表示立即開始)// durationMs - 滑動持續時間(毫秒)GestureDescription gesture = builder.addStroke(new GestureDescription.StrokeDescription(path, 0, durationMs)).build();// 執行滑動操作dispatchGesture(gesture, new GestureResultCallback() {@Overridepublic void onCompleted(GestureDescription gestureDescription) {super.onCompleted(gestureDescription);Log.d("TAG", "滑動完成");}@Overridepublic void onCancelled(GestureDescription gestureDescription) {super.onCancelled(gestureDescription);Log.e("TAG", "滑動取消");}}, null);}
}

通過無障礙服務在指定坐標 (100,100) 處粘貼剪貼板內容 "你好"?

public class MyAccessibilityService extends AccessibilityService {// 核心方法:在指定坐標粘貼文本public void pasteTextAtPoint(int x, int y, String text) {// 1. 模擬點擊坐標以聚焦輸入框clickAtPoint(x, y);// 2. 等待輸入框獲得焦點(建議300-500ms延遲)new Handler(Looper.getMainLooper()).postDelayed(() -> {// 3. 獲取當前窗口根節點AccessibilityNodeInfo rootNode = getRootInActiveWindow();if (rootNode == null) return;// 4. 查找焦點所在的輸入控件AccessibilityNodeInfo focusedNode = rootNode.findFocus(AccessibilityNodeInfo.FOCUS_INPUT);if (focusedNode != null) {// 5. 設置剪貼板內容setClipboardText(text);// 6. 執行粘貼操作Bundle args = new Bundle();args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT, AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER);focusedNode.performAction(AccessibilityNodeInfo.ACTION_PASTE, args);// 或者直接設置文本(API 21+)// Bundle setTextArgs = new Bundle();// setTextArgs.putCharSequence(//     AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, //     text// );// focusedNode.performAction(//     AccessibilityNodeInfo.ACTION_SET_TEXT, //     setTextArgs// );}rootNode.recycle();}, 500); // 延遲500ms確保焦點穩定}// 點擊坐標方法private void clickAtPoint(int x, int y) {Path path = new Path();path.moveTo(x, y);GestureDescription gesture = new GestureDescription.Builder().addStroke(new StrokeDescription(path, 0, 50)).build();dispatchGesture(gesture, null, null);}// 設置剪貼板內容private void setClipboardText(String text) {ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);ClipData clip = ClipData.newPlainText("label", text);clipboard.setPrimaryClip(clip);}
}

無障礙返回

public class MyAccessibilityService extends AccessibilityService {// 核心方法:模擬返回鍵public void performBack() {// 調用系統級返回操作boolean isSuccess = performGlobalAction(GLOBAL_ACTION_BACK);Log.d("TAG", "返回操作結果: " + (isSuccess ? "成功" : "失敗"));}@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 可監聽返回操作后的界面變化(可選)}@Overridepublic void onInterrupt() {// 中斷處理}
}

無障礙回到主頁

public class MyAccessibilityService extends AccessibilityService {// 核心方法:模擬Home鍵public void pressHomeButton() {boolean isSuccess = performGlobalAction(GLOBAL_ACTION_HOME);Log.d("TAG", "Home鍵操作結果: " + (isSuccess ? "成功" : "失敗"));}@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 可監聽界面變化(可選)}@Overridepublic void onInterrupt() {// 中斷處理}
}

長按點擊

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.GestureDescription;
import android.graphics.Path;
import android.view.accessibility.AccessibilityEvent;public class MyAccessibilityService extends AccessibilityService {@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 處理無障礙事件,這里可以根據事件類型進行相應的操作}@Overridepublic void onInterrupt() {// 當服務被中斷時調用}// 實現長按點擊的方法public void performLongClick(int x, int y) {// 創建一個路徑,指定長按的位置Path clickPath = new Path();clickPath.moveTo(x, y);// 創建一個手勢描述,設置長按的持續時間GestureDescription.StrokeDescription clickStroke = new GestureDescription.StrokeDescription(clickPath, 0, 1000);GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();gestureBuilder.addStroke(clickStroke);GestureDescription gesture = gestureBuilder.build();// 執行手勢dispatchGesture(gesture, null, null);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79725.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79725.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79725.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阿里云服務遷移實戰: 05-OSS遷移

概述 Bucket 復制分為兩種,同區域復制和跨區域復制 同賬號復制比較簡單,根據提示填寫信息即可,本文主要介紹跨賬號復制。 同區域復制 授權角色選擇 “AliyunOSSRole”, 創建方法見 “跨區域復制”。然后點擊確定即可。 跨區域復制 假設我…

Qt 的信號與槽機制依賴元對象系統(Meta-Object System)實現

內部數據結構 在 Qt 中,信號和槽之間的連接主要通過 QObject 類及其相關的私有類進行管理。每個 QObject 實例都維護著一個指向其 QMetaObject 的指針,該對象包含了有關類的所有元信息,包括信號、槽等。此外,還有一個關鍵的數據結構用于存儲信號與槽之間的連接信息,即 Co…

前端面試寶典---性能優化

一、加載優化 1. 第三方模塊放在CDN 例如 leaflet通過cdn引入,這樣就不會占用打包體積了 2. prefetch 預加載 例如,之后馬上有個場景需要一個圖片,我們就可以通過link 的 prefetch 對資源進行預先加載 再例如,我們公司是無網絡開…

從零開始:Android Studio開發購物車(第二個實戰項目)

一年經驗的全棧程序員,目前頭發健在,但不知道能撐多久。 文章目錄 前言 一、頁面編寫 1. 頂部標簽欄title_shopping.xml 2. 商品展現列表activity_shopping_channel.xml 3. 商品詳情頁面activity_shopping_detail.xml 4. 購物車頁面activity_shopping…

PostgteSQL for Everybody基礎部分筆記

筆記分享內容參考密歇根大學 Charles Russell Severance 開設的PostgreSQL課程:postgresql-for-everybody,網址為:https://www.coursera.org/specializations/postgresql-for-everybody#courses,在B站等也有相關視頻分享。 我分享…

Python項目源碼63:病歷管理系統1.0(tkinter+sqlite3+matplotlib)

1.病歷管理系統包含以下主要功能: 核心功能:病歷信息錄入(患者姓名、年齡、性別、診斷結果、主治醫生),自動記錄就診時間,病歷信息展示(使用Treeview表格),病歷信息查詢…

MCP底層協議完整通信過程

2025 年是智能體的元年, 也注定是智能體集中爆發的一年! 兩個互聯領域的重大挑戰: 第一、 Agent 與 Tools (工具)的交互 Agent 需要調用外部工具和 API

docker:制作鏡像+上傳鏡像+拉取鏡像

1.dockerfile制作鏡像 示例內容: 1.創建一個index.js的文件 console.log("hello world")2.在相同目錄下創建名為dockerfile的文件 FROM node:alpine COPY index.js /index.js CMD node /index.js3.構建鏡像 docker build -t minterra/hello-docker . …

docker制作python大模型鏡像(miniconda環境),工程改造記錄

**環境說明:**從系統鏡像開始打造python大模型鏡像,之前是人工手動裝的方式,并且模型和依賴在公網中,對于離線交付環境不太友好,所以打造的離線化交付版本 Dockerfile: FROM centos:7.9 ENV PYTHONIOENCODINGutf-8 E…

Rust中避免過度使用鎖導致性能問題的策略

一、引言 在 Rust 多線程編程中,鎖是實現線程同步的重要工具,它可以防止多個線程同時訪問和修改共享數據,從而避免數據競爭和不一致的問題。然而,過度使用鎖會帶來嚴重的性能問題,如鎖競爭導致的線程阻塞、上下文切換…

數據結構每日一題day15(鏈表)★★★★★

題目描述:將一個帶頭結點的單鏈表A分解為兩個帶頭結點的單鏈表A和 B,使得A表中含有原表中序號為奇數的元素,而B表中含有原表中序號為偶數的元素,且保持相對順不變,最后返回 B 表。 算法思想: 1.初始化: 創建新鏈表 B 的頭結點。…

【雜談】-探索 NVIDIA Dynamo 的高性能架構

探索 NVIDIA Dynamo 的高性能架構 文章目錄 探索 NVIDIA Dynamo 的高性能架構1. 大規模人工智能推理的日益嚴峻的挑戰2. 使用 NVIDIA Dynamo 優化 AI 推理3. 實際應用和行業影響4. 競爭優勢:Dynamo 與其他方案對比5. 總結 隨著人工智能(AI)技…

postgresql數據庫基本操作

1. 連接 PostgreSQL 數據庫 首先&#xff0c;使用 psql 命令行工具連接到數據庫。如果是本地連接&#xff0c;命令格式如下&#xff1a; psql -U postgres -d <數據庫名稱> -h <主機地址>其中&#xff1a; -U postgres&#xff1a;表示以 postgres 用戶身份登錄…

工業大模型:從設備診斷到工藝重構

引言 工業大模型正在引發制造業認知革命。據埃森哲研究,到2026年全球工業大模型市場規模將突破280億美元,其中工藝優化應用占比達42%。本文將系統解析工業大模型的"預訓練-領域適配-應用落地"技術路徑,并通過設備健康診斷與工藝參數生成的實踐案例,展示如何構建…

PyQt5基本介紹

PyQt5是基于Digia公司強大圖形框架Qt5的python接口&#xff0c;由一組python模塊構成。是一個用于創建桌面應用程序的Python庫&#xff0c;它是Qt圖形用戶界面工具包的Python綁定。 Qt是一個跨平臺的C庫&#xff0c;提供了一套豐富的工具和功能&#xff0c;用于開發圖形用戶界…

Tire 樹(字典樹/前綴樹)

一、定義與結構 用來快速存儲查找字符串集合的一種數據結構 將字符串按順序連接根節點上&#xff0c;并在字符串結束的地方打上標記并計數。 二、模板題 acwing 835 Trie 樹的字符串統計 題目&#xff1a; 維護一個字符串集合&#xff0c;支持兩種操作&#xff1a; I x 向…

【時時三省】(C語言基礎)怎樣定義和引用一維數組

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 一維數組是數組中最簡單的&#xff0c;它的元素只需要用數組名加一個下標&#xff0c;就能唯一地確定。如上面介紹的學生成績數組s就是一維數組。有的數組&#xff0c;其元素要指定兩個下標才…

編譯faiss

編譯faiss-1.10.0 首先確保自己cmake的版本&#xff1a; cmake --version 確保其版本至少為CMake 3.24.0 or higher is required。 其次安裝OpenBLAS&#xff1a; https://github.com/OpenMathLib/OpenBLAS 去這里去安轉Openblas內容&#xff0c;然后確保自己的CPU的指令集是存…

Linux 入門:操作系統進程詳解

目錄 一.馮諾依曼體系結構 一&#xff09;. 軟件運行前為什么要先加載&#xff1f;程序運行之前在哪里&#xff1f; 二&#xff09;.理解數據流動 二.操作系統OS(Operator System) 一&#xff09;.概念 二&#xff09;.設計OS的目的 三&#xff09;.如何理解操作系統…

word交叉引用圖片、表格——只引用編號的處理方法

交叉引用圖片/表格 在“引用”選項卡上的“題注”組中&#xff0c;單擊“插入題注”。勾選【從題注中排除標簽】。在文中插入題注。 【注 意】 這時候插入的題注只有編號項了。然后手動打上標簽【TABLE】&#xff0c;并在標簽和編號項之間加上【樣式分隔符&#xff0c;AltCt…