安卓 Input Events(输入事件)
生活随笔
收集整理的這篇文章主要介紹了
安卓 Input Events(输入事件)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在安卓中,有不止一種方法從你的應(yīng)用截取用戶交互事件。在你的用戶界面中考慮事件,途徑就是從用戶界面中的一個(gè)指定的view對(duì)象中捕獲事件。該view提供了這樣做的方法。
在你用來(lái)組成你布局的不同的view類中,你或許注意到了一些公共的回調(diào)方法似乎看起來(lái)對(duì)UI事件有用。這些方法由安卓的框架調(diào)用,當(dāng)各自的操作在對(duì)象中發(fā)生時(shí)。例如,當(dāng)一個(gè)view (一個(gè)按鈕)被觸摸,在這個(gè)對(duì)象中的onTouchEvent() 方法就會(huì)被調(diào)用。然而,為了攔截這個(gè)事件,你必須繼承該類(button )并且重寫(xiě)該方法(onTouchEvent)。然而,為了處理這樣的一個(gè)事件而繼承每一個(gè)view對(duì)象或許不實(shí)際。這就是為什么View 類經(jīng)常包含一組嵌套的調(diào)用接口讓你可以跟方便的定義(事件處理方法)。這些接口,叫做事件監(jiān)聽(tīng)者(?event listeners),用來(lái)捕獲用戶與UI的交互。 當(dāng)你更加平常的為你的用戶交互使用事件監(jiān)聽(tīng)者,當(dāng)你想繼承一個(gè)view類,為了創(chuàng)建一個(gè)自定義組件,或許可以使用一次。或許你想要繼承Button類來(lái)讓一些東西更加精美。在這樣的情況下,你或許需要為你的類定義一個(gè)默認(rèn)事件行為,使用該類的事件處理者(event handlers.).?事件監(jiān)聽(tīng)者(Event Listeners)
一個(gè)事件監(jiān)聽(tīng)者是在view類中的一個(gè)接口,它包含了一個(gè)簡(jiǎn)單的回調(diào)函數(shù)。這些方法將會(huì)被安卓框架調(diào)用,當(dāng)該view的監(jiān)聽(tīng)者已經(jīng)被注冊(cè)并且通過(guò)用戶ui 項(xiàng)被觸發(fā)。 包含了事件監(jiān)聽(tīng)者接口的都有如下回調(diào)方法: onClick()來(lái)自View.OnClickListener.。當(dāng)用戶觸摸該item(觸摸模式下),或者使用導(dǎo)航鍵或軌跡球使焦點(diǎn)聚集在該項(xiàng)上并且按下了適當(dāng)?shù)?#34;enter"(進(jìn)入)按鍵或者在軌跡球上執(zhí)行了按下操作。 onLongClick()來(lái)自?View.OnLongClickListener.。當(dāng)用戶持續(xù)觸摸item時(shí)(觸摸模式下),或者使用導(dǎo)航鍵或軌跡球使焦點(diǎn)聚集在該項(xiàng)上并且持續(xù)按著適當(dāng)?shù)?#34;enter"(進(jìn)入)按鍵或者在軌跡球上執(zhí)行持續(xù)按下操作(持續(xù)一秒)。 onFocusChange()來(lái)自?View.OnFocusChangeListener?當(dāng)用戶使用導(dǎo)航鍵或者軌跡球?qū)Ш降交蛘唠x開(kāi)該item 時(shí)。 onKey()來(lái)自View.OnKeyListener.?當(dāng)用戶聚焦在了項(xiàng)目上并且按下或松開(kāi)設(shè)備上的按鍵時(shí) onTouch()來(lái)自View.OnTouchListener.當(dāng)用戶執(zhí)行一個(gè)合格的觸摸操作,包括按下,釋放或者任何屏幕上的手勢(shì)動(dòng)作(在項(xiàng)目的邊界內(nèi)) onCreateContextMenu()來(lái)自View.OnCreateContextMenuListener. 當(dāng)上下文菜單開(kāi)始構(gòu)建時(shí)調(diào)用(如持續(xù)“長(zhǎng)按”的結(jié)果)。查看在?Menus開(kāi)發(fā)向?qū)е嘘P(guān)于上下文菜單的討論。 這些方法是它們各自接口的唯一方法。為定義其中的一個(gè)方法并且處理你的事件,在你的activity中實(shí)現(xiàn)嵌套的接口,或者作為一個(gè)匿名類定義它。然后,傳遞一個(gè)你的實(shí)例引用給各自的View.set...Listener()方法。?method (例如,調(diào)用setOnClickListener()并且傳遞一個(gè)你實(shí)例化的OnClickListener) 下面一個(gè)案例展示了如何為一個(gè)按鈕注冊(cè)一個(gè)on-click監(jiān)聽(tīng)者。 // 為OnClickListener創(chuàng)建一個(gè)匿名實(shí)例 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); ... } 你可以更加方便的找到實(shí)現(xiàn)OnClickListener?,作為activity的一部分。這將會(huì)避免額外的類加載和對(duì)象分配。如下: 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()?回調(diào)并沒(méi)有返回值,但是一些其它的事件處理方法必須返回一個(gè)布爾類型。原因取決于事件。這里有少數(shù)的一些原因:- onLongClick()?- 該方法返回一個(gè)布爾類型來(lái)指明你是否消耗了該事件,并且它不應(yīng)該進(jìn)一步傳遞下去。也就是說(shuō),返回true表明你處理了該事件并且它應(yīng)該在這停下來(lái);返回false,如果你沒(méi)有處理它或者該事件應(yīng)該繼續(xù)傳遞給其它on-click監(jiān)聽(tīng)者。
- onKey()?- 該方法返回一個(gè)布爾類型來(lái)表明你是否消耗了該事件并且不應(yīng)該進(jìn)一步傳遞下去。也就是說(shuō),返回true表明你處理了該事件并且它應(yīng)該在這停下來(lái);返回false,如果你沒(méi)有處理它或者該事件應(yīng)該繼續(xù)傳遞給其它on-click監(jiān)聽(tīng)者。
- onTouch()?-?該方法返回一個(gè)布爾類型來(lái)表明你是否消耗了該事件。重要的是該事件可以有多個(gè)符合觸發(fā)條件的操作。因此,當(dāng)按下事件被接受到,如果你返回了false,表明你沒(méi)有處理該事件并且對(duì)這個(gè)事件的后續(xù)行動(dòng)不感興趣。因此,你不會(huì)為每一個(gè)操作都調(diào)用該事件,如手勢(shì)動(dòng)作,或者最后的抬手動(dòng)作(up action event)。
?事件處理者(Event Handlers)
如果你想自定義一個(gè)view組件,那么你可能會(huì)定義一些回調(diào)方法作為默認(rèn)的事件處理者來(lái)使用。在Custom Components, 這篇文章中,你將會(huì)看到一些被用作事件處理的公共回調(diào)函數(shù),包括:- onKeyDown(int, KeyEvent)?- 當(dāng)一個(gè)新的按鍵事件發(fā)生時(shí)調(diào)用
- onKeyUp(int, KeyEvent)?- 當(dāng)一個(gè)按鍵松開(kāi)(key up )事件發(fā)生時(shí)調(diào)用
- onTrackballEvent(MotionEvent)?- 當(dāng)一個(gè)軌跡球運(yùn)動(dòng)事件發(fā)生時(shí)
- onTouchEvent(MotionEvent)?- 當(dāng)一個(gè)屏幕觸摸事件發(fā)生時(shí)
- onFocusChanged(boolean, int, Rect)?- 當(dāng)該view獲得或失去焦點(diǎn)時(shí)
- Activity.dispatchTouchEvent(MotionEvent)?-允許你的activity攔截所有的觸摸事件,在他們分發(fā)給window之前。
- ViewGroup.onInterceptTouchEvent(MotionEvent)?- 允許一個(gè)viewgroup 來(lái)觀察事件是否派遣給了子view。
- ViewParent.requestDisallowInterceptTouchEvent(boolean)?-調(diào)用該方法取決于父視圖,表明它不應(yīng)該通過(guò)onInterceptTouchEvent(MotionEvent).攔截觸摸事件。
?觸摸模式(Touch Mode)
當(dāng)用戶使用方向鍵或軌跡球在用戶界面上移動(dòng)時(shí),給予活動(dòng)項(xiàng)(如按鈕)焦點(diǎn)是必須的,這樣用戶可以看見(jiàn)什么輸入將會(huì)被接受。如果該設(shè)備有觸摸能力,并且用戶開(kāi)始通過(guò)觸摸來(lái)與界面交互,那么并不需要高亮顯示項(xiàng)目,或者給指定view 一個(gè)焦點(diǎn)。因此,有一個(gè)交互模式叫做“觸摸模式”(當(dāng)今的安卓手機(jī)主要是該模式,因它沒(méi)有硬件輸入設(shè)備) 對(duì)于一個(gè)可觸摸的設(shè)備,移動(dòng)用戶觸摸了屏幕,設(shè)備將會(huì)進(jìn)入觸摸模式。從此刻開(kāi)始,只有當(dāng)view因?yàn)閕sFocusableInTouchMode()為true時(shí)才可被聚焦,如文本編輯組件。其它view都是可觸摸的,如按鈕,在觸摸時(shí)將不會(huì)獲得焦點(diǎn);當(dāng)按下時(shí),他們僅僅的激活他們的on-click 監(jiān)聽(tīng)者。 任何時(shí)候,用戶點(diǎn)擊一個(gè)方向鍵或滑動(dòng)軌跡球,設(shè)備將會(huì)退出觸摸模式并且找到一個(gè)view使其獲得焦點(diǎn)。現(xiàn)在,用戶可以繼續(xù)與用戶界面交互,不使用觸摸屏幕這種方式。 觸摸模式狀態(tài)一直維持在整個(gè)系統(tǒng)中(所有Windows和activitys ).為查詢當(dāng)前狀態(tài),你可以調(diào)用isInTouchMode()?來(lái)查看設(shè)備當(dāng)前是否處于觸摸模式。處理焦點(diǎn)(Handling Focus?)
框架將會(huì)處理常規(guī)響應(yīng)用戶輸入時(shí)的的焦點(diǎn)移動(dòng)。這包括當(dāng)view移除或隱藏時(shí)改變焦點(diǎn),或一個(gè)新的view變?yōu)榭捎谩iew通過(guò)isFocusable()方法來(lái)表明他們獲得焦點(diǎn)的意愿。改變view是否能獲得焦點(diǎn),調(diào)用setFocusable()。當(dāng)處于觸摸模式,你或許需要通過(guò)isFocusableInTouchMode()查詢一個(gè)view是否允許聚焦。通過(guò)使用setFocusableInTouchMode()你可以改變它。 焦點(diǎn)的移動(dòng)是基于一個(gè)算法的,它順著一個(gè)給定的方向?qū)ふ易罱?view)。少數(shù)情況下,默認(rèn)算法或許不符合開(kāi)發(fā)者的要求。在這種情況下,你可以提供詳細(xì)的覆蓋,通過(guò)在布局文件中使用如下xml 屬性:nextFocusDown,nextFocusLeft,?nextFocusRight, 和?nextFocusUp。將其中的一個(gè)屬性添加到view上。該屬性的值是下一個(gè)需要獲取焦點(diǎn)的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> 通常,在該垂直布局中,從第一個(gè)按鈕開(kāi)始操縱(焦點(diǎn))將不會(huì)跑去任何地方,如果從第二個(gè)按鈕開(kāi)始操作,(焦點(diǎn))也不會(huì)跑到它的下面去。現(xiàn)在頂部按鈕在底部定義了一個(gè)(按鈕)同nextFocusUp設(shè)置一樣(反之亦然),focus? 焦點(diǎn)將會(huì)上-下 下-上的循環(huán)移動(dòng)。 如果你想要在你UI中什么一個(gè)view是可聚焦的(當(dāng)它一般情況下不是時(shí)),為view添加android:focusable?xml屬性,在你的布局文件中聲明。設(shè)置該值為true。你也可以聲明該view的可聚焦性,當(dāng)在觸摸模式時(shí)通過(guò)android:focusableInTouchMode. 為請(qǐng)求一個(gè)特別的view獲得焦點(diǎn),調(diào)用requestFocus() 為監(jiān)聽(tīng)焦點(diǎn)事件(當(dāng)一個(gè)view獲得或失去焦點(diǎn)時(shí)通知),使用onFocusChange(),在上文#事件監(jiān)聽(tīng)者(Event Listeners)中討論的。總結(jié)
以上是生活随笔為你收集整理的安卓 Input Events(输入事件)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在Windows下编译zlib1.2.5
- 下一篇: VMwarePro16 安装 Win7