Android 用戶界面---拖放(Drag and Drop)(二)


拖拽事件監聽器和回調方法

View對象既可以用實現View.OnDragListener接口的拖放事件監聽器,也可以用View對象的onDragEvent(DragEvent)回調方法來接收拖拽事件。當系統調用這個回調方法或監聽器時,都要給它們傳遞一個DragEvent對象。

在大多數場景中你可能會使用監聽器。因為在設計UI界面時,通常沒有View類的子類,而使用回調方法,為了覆寫這個方法,就會強制你使用View類及子類。相比之下,你可以實現一個監聽器類,然后再幾個不同的View對象中使用。你還可以把監聽器接口作為一個匿名的內部類來實現。調用setOnDragListener()方法給View對象設置監聽器。

View對象能夠同時擁有監聽器和回調方法,如果發生這種情況,系統會首先調用監聽器。除非監聽器返回了false,否則系統不會調用回調方法。

onDragEvent(DragEvent)回調方法和View.OnDragListener監聽器的組合跟用於觸屏事件的onTouchEvent()回調方法和View.OnTouchListener監聽器類似。

拖拽事件

系統用DragEvent對象形式的拖拽事件。這個對象包含了一個操作類型,它告訴監聽器在拖放過程中發生的事情。這個對象還根據操作類型,包含了其他的數據。

調用getAction()方法能夠獲得操作類型。有六種可能的值,在DragEvent類中被定義成常量。詳細見下表1.

DragEvent對象還包含了應用程序在調用startDrag()方法時,提供給系統的數據。這些數據中有些只對特定的操作類型有效。在下表2中概要的介紹了對每種操作類型可以獲取的有效數據。

1.DragEvent操作類型

getAction()方法返回值

含義

ACTION_DRAG_STARTED

只在應用程序調用startDrag()方法,並且獲得了拖拽影子后,View對象的拖拽事件監聽器才接收這種事件操作。

ACTION_DRAG_ENTERED

當拖拽影子剛進入View對象的邊框時,View對象的拖拽事件監聽器會接收這種事件操作類型。

ACTION_DRAG_LOCATION

View對象收到一個ACTION_DRAG_ENTERED事件之后,並且拖拽影子依然還在這個對象的邊框之內時,這個View對象的拖拽事件監聽器會接收這種事件操作類型

ACTION_DRAG_EXITED

View對象收到一個ACTION_DRAG_ENTERED和至少一個ACTION_DRAG_LOCATION事件之后,這個對象的事件監聽器會接受這種操作類型。

ACTION_DROP

當用戶在一個View對象之上釋放了拖拽影子,這個對象的拖拽事件監聽器就會收到這種操作類型。如果這個監聽器在響應ACTION_DRAG_STARTED拖拽事件中返回了true,那么這種操作類型只會發送給一個View對象。如果用戶在沒有被注冊監聽器的View對象上釋放了拖拽影子,或者用戶沒有在當前布局的任何部分釋放操作影子,這個操作類型就不會被發送。如果View對象成功的處理放下事件,監聽器要返回true,否則應該返回false

ACTION_DRAG_ENDED

當系統結束拖拽操作時,View對象拖拽監聽器會接收這種事件操作類型。這種操作類型之前不一定是ACTION_DROP事件。如果系統發送了一個ACTION_DROP事件,那么接收ACTION_DRAG_ENDED操作類型不意味着放下操作成功了。監聽器必須調用getResult()方法來獲得響應ACTION_DROP事件中的返回值。如果ACTION_DROP事件沒有被發送,那么getResult()會返回false

 

2.通過操作類型事件獲取有效的DragEvent對象的數據,x代表能夠獲取有效數據。

getAction() Value

getClipDescription()

getLocalState()

getX()

getY()

getClipData()

getResult()

ACTION_DRAG_STARTED

X

X

X

X

 

 

ACTION_DRAG_ENTERED

X

X

 

 

 

 

ACTION_DRAG_LOCATION

X

X

X

X

 

 

ACTION_DRAG_EXITED

X

X

 

 

 

 

ACTION_DROP

X

X

X

X

X

 

ACTION_DRAG_ENDED

X

X

 

 

 

X

 

getAction()describeContents()writeToParcel()toString方法始終返回有效的數據。

對於特殊的操作類型,如果一個方法不包含有效的數據,就會根據類型的不同而返回null0

 

拖拽影子

在拖拽和放下操作期間,系統會顯示一張用戶拖動的圖片。對於要移動的數據,這張圖片就代表了被拖動的數據。對於操作,這張圖片就代表了拖動操作的某些外觀。

這張圖片被叫做拖動影子,使用View.DragShadowBuilder對象的方法來創建它,並且在使用startDrag()方法開始拖拽時,把這個對象傳遞給系統。作為響應startDrag()方法的一部分,系統會調用在View.DragShadowBuilder對象中定義的回調方法,來獲取拖拽影子。

View.DragShadowBuilder類有兩個構造器:

View.DragShadowBuilder(View):

這個構造器接收任意的應用程序的View對象。這個構造器把View對象保存在View.DragShadowBuilder對象中,以便在回調期間訪問這個View對象,來構造拖拽影子。它(View對象參數)不必跟用戶選擇的開始拖拽操作的View對象相關聯。

如果使用這個構造器,就不必擴展View.DragShadowBuilder類或覆寫它的方法。默認情況,你會獲得一個跟傳遞給構造器的View對象外觀相同的拖拽影子。在用戶的觸屏位置下方,以出點為中心顯示。

View.DragShadowBuilder():

如果使用這個構造器,在ViewDragShadowBuilder對象中沒有有效的View對象。默認情況下,如果使用這個構造器,並且沒有擴展View.DragShadowBuilder類或覆寫它的方法,那么就會獲得一個不可見的拖拽影子,系統不會給出錯誤。

ViewDragShadowBuilder類有兩個方法:

onProvideShadowMetrics():

在你調用startDrag()方法后,系統會立即調用這個方法,給系統發送拖拽影子的尺寸和觸點。這個方法有兩個參數:

dimensions:一個Point對象,其中X代表影子的寬度,Y代表影子的高度;

touch_point:一個Point對象,這個觸點應該是拖拽期間用戶手指下方的拖拽影子的位置,X代表x軸的坐標,Y代表y軸的坐標。

onDrawShadow()

調用onProviderShadowMetrics()回調之后,系統會立即調用onDrawShadow()方法來獲得拖拽影子。這個方法有一個畫布參數(Canvas對象),系統會使用onProvideShadowMetrics()方法中提供的參數來構造這個Canvas對象,並在這個對象中描畫拖拽影子。

要改善性能,就要保持拖拽影子要用小的尺寸。對於一個單獨的項目,可以使用一個圖標,對於多項選擇,可以是堆棧中的圖標而不是分散在屏幕上的完整的圖片。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM