安卓 Input Events(輸入事件)

在安卓中,有不止一種方法從你的應用截取用戶交互事件。在你的用戶界面中考慮事件,途徑就是從用戶界面中的一個指定的view對象中捕獲事件。該view提供了這樣做的方法。

在你用來組成你布局的不同的view類中,你或許注意到了一些公共的回調方法似乎看起來對UI事件有用。這些方法由安卓的框架調用,當各自的操作在對象中發生時。例如,當一個view (一個按鈕)被觸摸,在這個對象中的onTouchEvent() 方法就會被調用。然而,為了攔截這個事件,你必須繼承該類(button )并且重寫該方法(onTouchEvent)。然而,為了處理這樣的一個事件而繼承每一個view對象或許不實際。這就是為什么View 類經常包含一組嵌套的調用接口讓你可以跟方便的定義(事件處理方法)。這些接口,叫做事件監聽者(?event listeners),用來捕獲用戶與UI的交互。
當你更加平常的為你的用戶交互使用事件監聽者,當你想繼承一個view類,為了創建一個自定義組件,或許可以使用一次。或許你想要繼承Button類來讓一些東西更加精美。在這樣的情況下,你或許需要為你的類定義一個默認事件行為,使用該類的事件處理者(event handlers.).

?事件監聽者(Event Listeners)

一個事件監聽者是在view類中的一個接口,它包含了一個簡單的回調函數。這些方法將會被安卓框架調用,當該view的監聽者已經被注冊并且通過用戶ui 項被觸發。
包含了事件監聽者接口的都有如下回調方法:
onClick()來自View.OnClickListener.。當用戶觸摸該item(觸摸模式下),或者使用導航鍵或軌跡球使焦點聚集在該項上并且按下了適當的"enter"(進入)按鍵或者在軌跡球上執行了按下操作。
onLongClick()來自?View.OnLongClickListener.。當用戶持續觸摸item時(觸摸模式下),或者使用導航鍵或軌跡球使焦點聚集在該項上并且持續按著適當的"enter"(進入)按鍵或者在軌跡球上執行持續按下操作(持續一秒)。
onFocusChange()來自?View.OnFocusChangeListener?當用戶使用導航鍵或者軌跡球導航到或者離開該item 時。
onKey()來自View.OnKeyListener.?當用戶聚焦在了項目上并且按下或松開設備上的按鍵時
onTouch()來自View.OnTouchListener.當用戶執行一個合格的觸摸操作,包括按下,釋放或者任何屏幕上的手勢動作(在項目的邊界內)
onCreateContextMenu()來自View.OnCreateContextMenuListener. 當上下文菜單開始構建時調用(如持續“長按”的結果)。查看在?Menus開發向導中關于上下文菜單的討論。
這些方法是它們各自接口的唯一方法。為定義其中的一個方法并且處理你的事件,在你的activity中實現嵌套的接口,或者作為一個匿名類定義它。然后,傳遞一個你的實例引用給各自的View.set...Listener()方法。?method (例如,調用setOnClickListener()并且傳遞一個你實例化的OnClickListener)
下面一個案例展示了如何為一個按鈕注冊一個on-click監聽者。
// 為OnClickListener創建一個匿名實例
private OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
// do something when the button is clicked
}
};
?
protected void onCreate(Bundle savedValues) {
...
// Capture our button from layout
Button button = (Button)findViewById(R.id.corky);
// Register the onClick listener with the implementation above
button.setOnClickListener(mCorkyListener);
...
}
你可以更加方便的找到實現OnClickListener?,作為activity的一部分。這將會避免額外的類加載和對象分配。如下:
public class ExampleActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedValues) {
...
Button button = (Button)findViewById(R.id.corky);
button.setOnClickListener(this);
}
?
// Implement the OnClickListener callback
public void onClick(View v) {
// do something when the button is clicked
}
...
}
注意上文示例中的onClick()?回調并沒有返回值,但是一些其它的事件處理方法必須返回一個布爾類型。原因取決于事件。這里有少數的一些原因:
  • onLongClick()?- 該方法返回一個布爾類型來指明你是否消耗了該事件,并且它不應該進一步傳遞下去。也就是說,返回true表明你處理了該事件并且它應該在這停下來;返回false,如果你沒有處理它或者該事件應該繼續傳遞給其它on-click監聽者。
  • onKey()?- 該方法返回一個布爾類型來表明你是否消耗了該事件并且不應該進一步傳遞下去。也就是說,返回true表明你處理了該事件并且它應該在這停下來;返回false,如果你沒有處理它或者該事件應該繼續傳遞給其它on-click監聽者。
  • onTouch()?-?該方法返回一個布爾類型來表明你是否消耗了該事件。重要的是該事件可以有多個符合觸發條件的操作。因此,當按下事件被接受到,如果你返回了false,表明你沒有處理該事件并且對這個事件的后續行動不感興趣。因此,你不會為每一個操作都調用該事件,如手勢動作,或者最后的抬手動作(up action event)。
請記住,硬件按鈕事件總是傳遞給當前焦點視圖。從view的頂層開始向下分發,直到到達適當的地方。如果你的view(或者在view中的子view)獲得了焦點,之后你可以通過dispatchKeyEvent()方法查看到事件的移動。作為一個備選方法來從你的view中捕獲按鍵事件,你還可以在你activity中的onKeyDown()?和onKeyUp().內收到各種事件。
并且,當你的應用輸入文本時,需要注意的是許多設備只有軟件的輸入方法。這些方法不需要按鍵支持,或使用聲音輸入,手寫,等等。即使一個輸入方法呈現了一個類似鍵盤的界面,它通常也不會觸發onKeyDown()這類的事件。你永遠不應該創建UI來約束指定按鍵的按壓,除非你想要限制你應用使用設備的硬件盤。特別的,當用戶按下返回按鈕時,不要依賴于這些方法來確認輸入;改為使用像IME_ACTION_DONE一樣的操作來表明該輸入方法并且讓你的應用程序做出怎樣的反應。這可能會以一種有意義的方式來改變它的UI。避免設想一個軟件輸入方法應該是如何工作的,并且只需要信任它來為你的應用支持已經格式化的文本。
注意:安卓將會首先調用事件處理者,之后調用類中定義的適當的默認處理者。同樣的,從這些事件監聽者中返回true將會停止事件傳播給其它事件監聽者,并且阻塞view中的默認事件處理的回調。因此,當你返回true時,確定你想要終止該事件。

?事件處理者(Event Handlers)

如果你想自定義一個view組件,那么你可能會定義一些回調方法作為默認的事件處理者來使用。在Custom Components, 這篇文章中,你將會看到一些被用作事件處理的公共回調函數,包括:
  • onKeyDown(int, KeyEvent)?- 當一個新的按鍵事件發生時調用
  • onKeyUp(int, KeyEvent)?- 當一個按鍵松開(key up )事件發生時調用
  • onTrackballEvent(MotionEvent)?- 當一個軌跡球運動事件發生時
  • onTouchEvent(MotionEvent)?- 當一個屏幕觸摸事件發生時
  • onFocusChanged(boolean, int, Rect)?- 當該view獲得或失去焦點時
這還有其他的一些你需要注意的方法,它們不是view類的一部分,但是可以直接影響你能處理事件的方式。因此,當在你的布局中管理更多復合事件時,考慮這些方法:
  • Activity.dispatchTouchEvent(MotionEvent)?-允許你的activity攔截所有的觸摸事件,在他們分發給window之前。
  • ViewGroup.onInterceptTouchEvent(MotionEvent)?- 允許一個viewgroup 來觀察事件是否派遣給了子view。
  • ViewParent.requestDisallowInterceptTouchEvent(boolean)?-調用該方法取決于父視圖,表明它不應該通過onInterceptTouchEvent(MotionEvent).攔截觸摸事件。

?觸摸模式(Touch Mode)

當用戶使用方向鍵或軌跡球在用戶界面上移動時,給予活動項(如按鈕)焦點是必須的,這樣用戶可以看見什么輸入將會被接受。如果該設備有觸摸能力,并且用戶開始通過觸摸來與界面交互,那么并不需要高亮顯示項目,或者給指定view 一個焦點。因此,有一個交互模式叫做“觸摸模式”(當今的安卓手機主要是該模式,因它沒有硬件輸入設備)
對于一個可觸摸的設備,移動用戶觸摸了屏幕,設備將會進入觸摸模式。從此刻開始,只有當view因為isFocusableInTouchMode()為true時才可被聚焦,如文本編輯組件。其它view都是可觸摸的,如按鈕,在觸摸時將不會獲得焦點;當按下時,他們僅僅的激活他們的on-click 監聽者。
任何時候,用戶點擊一個方向鍵或滑動軌跡球,設備將會退出觸摸模式并且找到一個view使其獲得焦點。現在,用戶可以繼續與用戶界面交互,不使用觸摸屏幕這種方式。
觸摸模式狀態一直維持在整個系統中(所有Windows和activitys ).為查詢當前狀態,你可以調用isInTouchMode()?來查看設備當前是否處于觸摸模式。

處理焦點(Handling Focus?)

框架將會處理常規響應用戶輸入時的的焦點移動。這包括當view移除或隱藏時改變焦點,或一個新的view變為可用。view通過isFocusable()方法來表明他們獲得焦點的意愿。改變view是否能獲得焦點,調用setFocusable()。當處于觸摸模式,你或許需要通過isFocusableInTouchMode()查詢一個view是否允許聚焦。通過使用setFocusableInTouchMode()你可以改變它。
焦點的移動是基于一個算法的,它順著一個給定的方向尋找最近的(view)。少數情況下,默認算法或許不符合開發者的要求。在這種情況下,你可以提供詳細的覆蓋,通過在布局文件中使用如下xml 屬性:nextFocusDown,nextFocusLeft,?nextFocusRight, 和?nextFocusUp。將其中的一個屬性添加到view上。該屬性的值是下一個需要獲取焦點的view的id。如下:
<LinearLayout
android:orientation="vertical"
... >
<Button android:id="@+id/top"
android:nextFocusUp="@+id/bottom"
... />
<Button android:id="@+id/bottom"
android:nextFocusDown="@+id/top"
... />
</LinearLayout>
通常,在該垂直布局中,從第一個按鈕開始操縱(焦點)將不會跑去任何地方,如果從第二個按鈕開始操作,(焦點)也不會跑到它的下面去。現在頂部按鈕在底部定義了一個(按鈕)同nextFocusUp設置一樣(反之亦然),focus? 焦點將會上-下 下-上的循環移動。
如果你想要在你UI中什么一個view是可聚焦的(當它一般情況下不是時),為view添加android:focusable?xml屬性,在你的布局文件中聲明。設置該值為true。你也可以聲明該view的可聚焦性,當在觸摸模式時通過android:focusableInTouchMode.
為請求一個特別的view獲得焦點,調用requestFocus()
為監聽焦點事件(當一個view獲得或失去焦點時通知),使用onFocusChange(),在上文#事件監聽者(Event Listeners)中討論的。

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

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

相關文章

【GlobalMapper精品教程】029:柵格重分類案例詳解

重分類就是對原有柵格像元值重新分類從而得到一組新值并輸出。重分類工具有多種方法將像元值重新分類或更改為替代值,Globalmapper提供了柵格重分類的功能。 文章目錄 一、柵格重分類簡介二、柵格重分類案例【參考閱讀】:ArcGIS實驗教程——實驗四十三:ArcGIS柵格重分類(Re…

Mybatis 和 JPA 用哪個好? 優缺點 ?

本文不會下關于 Mybatis 和 JPA 兩個持久層框架哪個更好這樣的結論。只是擺事實&#xff0c;講道理&#xff0c;所以&#xff0c;請各位看官勿噴。 一、事件起因 關于 Mybatis 和 JPA 孰優孰劣的問題&#xff0c;爭論已經很多年了。一直也沒有結論&#xff0c;畢竟每個人的喜…

SkiaSharp 之 WPF 自繪 五環彈動球(案例版)

此案例基于拖曳和彈動球兩個技術功能實現&#xff0c;如有不懂的可以參考之前的相關文章&#xff0c;屬于遞進式教程。五環彈動球好吧&#xff0c;名字是我起的&#xff0c;其實&#xff0c;你可以任意個球進行聯動彈動&#xff0c;效果還是很不錯的&#xff0c;有很多前端都是…

【GlobalMapper精品教程】032:瀏覽地理照片及航線信息(航測應用)

本文講述globalmapper軟件在無人機航測了內業處理中的應用之:瀏覽地理照片及航線信息、相機參數、元數據編輯器。 文章目錄 1. 航線信息瀏覽2. 地理圖像瀏覽2.1 數字化工具2.2 要素信息工具2.3 屬性表3. 照片原數據編輯1. 航線信息瀏覽 打開globalmapper軟件,加載無人機航測…

Spring Boot 2.7.0發布,2.5停止維護

這幾天是Spring版本日&#xff0c;很多Spring工件都發布了新版本&#xff0c; Spring Framework 6.0.0 發布了第 4 個里程碑版本&#xff0c;此版本包含所有針對 5.3.20 的修復補丁&#xff0c;以及特定于 6.0 分支的 39 項修復和改進。而今天Spring Boot 2.7.0和Spring Securi…

【GlobalMapper精品教程】031:Globalmapper在航測內業數據處理中的應用舉例

Globalmapper在航測內業數據處理中的應用舉例索引。 文章目錄 1. 圖像及航線瀏覽2. 3D重建3. 點云分類4. 創建地形5. 地形分析1. 圖像及航線瀏覽 擴展閱讀:【GlobalMapper精品教程】032:瀏覽地理照片及航線信息(航測應用) 2. 3D重建 從Global Mapper的19版本開始,Pixels-…

移動工具V和選區工具M

移動工具快捷鍵&#xff1a;V 屬性&#xff1a; 自動選擇 在默認情況下&#xff0c;移動工具的“自動選擇”一項是沒有勾選的。表示只能選中圖層窗口中選定的固定圖層&#xff0c;不能隨意的點擊選擇別的圖層。在這里&#xff0c;我們也勾選“自動選擇”&#xff0c;可任意選擇…

SeleniumWebDriver擴展插件開發

Selenium WebDriver 是一組開源 API&#xff0c;用于自動測試 Web 應用程序&#xff0c;利用它可以通過代碼來控制chrome edge等瀏覽器&#xff01;有時候我們需要mock接口的返回&#xff0c;或者攔截和轉發請求&#xff0c;今天就來實現這個功能本插件代碼已開源&#xff1a;h…

ZooKeeper的工作原理

ZooKeeper是一個分布式的應用程序協調服務。 2 ZooKeeper的工作原理 Zookeeper 的核心是原子廣播&#xff0c;這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab(Zookeeper Atomic Broadcast)協議。Zab協議有兩種模式&#xff0c;它們分別是恢復模式&#xff08;…

memcache的學習路線圖

memcache學習材料//memcache自帶的github 上的 wiki//席劍飛 Memcache&#xff08;MC&#xff09;系列 1~8系列評注&#xff1a; memcache系統寫的最深的一博客&#xff0c;建議一讀。http://blog.csdn.net/xifeijian/article/details/21994941//mysql與memcache的使用https://…

[轉]錢嶺:別擔心“35歲危機”,要成為“老專家”

從清華大學到貝爾實驗室&#xff0c;再到中國移動&#xff0c;作為“IT老人”&#xff0c;錢嶺的技術人生幾乎覆蓋了20世紀90年代至今的信息產業革命。2007年開始&#xff0c;錢嶺在中國移動經歷了基礎科研到產品落地&#xff0c;再到團隊孵化&#xff1b;也經歷了云計算從無到…

【GIS前沿】周成虎院士:GIS的大數據時代展望(PPT分享)

本文源自微信公眾號&#xff1a;宋關福GIS筆記。版權歸原作者及刊載媒體所有&#xff0c;如有侵權請立即與我們聯系,我們將及時處理。更多GIS前言技術&#xff0c;請關注《GIS前言》專欄。 GIS的大數據時代展望

DataV:可視化大屏展示神器實戰分享

由于公司年即將發布新的產品&#xff0c;傳統意義上的PPT顯得不太生動化&#xff0c;所以想采用具體化&#xff0c;可視化的數據大屏進行業務數據的事實展示&#xff0c;第一時間想到了來自于阿里云旗下的DataV&#xff0c;廢話不多說&#xff0c;老司機開始發牌照&#xff01;…

數據庫性能系列之索引(中)

GOOD NIGHT前言上一篇中&#xff0c;我們已經了解到了索引的基本概念和一些用法。那索引為什么會提升查詢的速度&#xff0c;以及索引究竟是怎么工作的呢&#xff1f;也許大家心里還是有一些迷茫&#xff0c;這一切&#xff0c;還要從索引背后的算法說起。GOOD NIGHT概述大家知…

微服務架構的設計原則和核心話題

目錄 一、前言 二、微服務架構的設計原則 1.拆分足夠微 2.輕量級通信 3.單一職責原則 4.領域驅動原則 三、微服務架構的核心話題 1.服務拆分 2.服務注冊與發現 3.負載均衡 4.API網關 5.服務部署與發布 四、總結 一、前言 毫無疑問&#xff0c;微服務架構的設計原…

4.3.2 基于集合的操作

在SQL Server處理select命令時&#xff0c;會在內存中建立一個結構&#xff0c;以返回結果集。這個結構實質上是一個有行和列的二維數組&#xff0c;稱為“游標&#xff08;cursor&#xff09;”。“游標”這個詞是“CURrent set of Records(當前記錄集)”的縮寫。它表示從表或…

Golang GOPATH 包

2019獨角獸企業重金招聘Python工程師標準>>> Golang GOPATH & 包的定義 & 包的導入 GOPATH 設置 go 命令依賴一個重要的環境變量&#xff1a;$GOPATH 可以在 .zshrc 配置文件中加上一行這樣的配置&#xff0c; export GOPATH/Users/flyme/mygo Go從1.1版本到…

PPK大疆無人機應用教程

文章目錄 一、新建項目二、導入數據三、解算過程四、結果導出一、新建項目 新建工程,設置項目名稱,保存位置,控制等級,坐標系統(坐標系統選擇高斯克呂格,中央子午線根據實際數據所在位置進行選擇) 二、導入數據 選擇大疆數據,找到對應的文件夾 數據有:圖片,EVENT.b…

Eclipse Add generated serial version ID報錯解決方案

為什么80%的碼農都做不了架構師&#xff1f;>>> 問題&#xff1a; The following problem occurred:Could not find class file.Make sure the file is compilable 解決方案&#xff1a; 1、右鍵項目 -> Java Build Path -> Source 在Sourcd folders on bui…

開啟線程的方式

1、實現Runnable接口 1 package test;2 3 4 5 public class ThreadTest implements Runnable{6 public void tt(){7 Thread t new Thread(this);8 t.start();9 } 10 11 Override 12 public void run() { 13 while(true){ 14 …