以下各節說明幾個拖曳程序的重要概念。
拖曳程序
拖曳程序包含四個步驟或狀態:已開始 停止、捨棄和結束
- 已開始
為回應使用者的拖曳手勢,應用程式會呼叫
startDragAndDrop()
指示系統開始拖曳作業。 方法的引數提供下列項目:- 要拖曳的資料。
- 用於繪製拖曳陰影的回呼
- 描述拖曳資料的中繼資料
- 系統會回應應用程式,取得拖曳功能 影子。然後在裝置上顯示拖曳陰影。
- 接著,系統會傳送動作類型的拖曳事件
將
ACTION_DRAG_STARTED
移至拖曳事件 目前版面配置中所有View
物件的監聽器。目的地: 持續收到拖曳事件,包括可能的捨棄事件 事件—拖曳事件監聽器必須傳回true
。此暫存器 與系統通訊只有已註冊的聽眾繼續使用 接收拖曳事件。此時,監聽器也可以變更 放置目標View
物件的外觀,表示檢視畫面可以 接受放置事件 - 如果拖曳事件監聽器回傳
false
,就不會收到拖曳事件 目前作業的事件,直到系統傳送拖曳事件為止 動作類型為ACTION_DRAG_ENDED
。 事件監聽器會傳回false
,告知系統不感興趣 ,且拒絕接受拖曳的資料。
- 繼續
- 使用者持續拖曳。當拖曳陰影與
放置目標的定界框時,系統會將一或多個拖曳事件傳送至
目標的拖曳事件監聽器。接聽程式可能會修改
放置目標
View
,以回應事件。舉例來說 表示拖曳陰影進入放置點的定界框 目標—動作類型ACTION_DRAG_ENTERED
敬上 —事件監聽器可以醒目顯示View
來做出回應。 - 已拖曳
- 使用者在放置方塊的定界框中釋放拖曳陰影
目標。系統會透過動作,傳送拖曳目標的事件監聽器
輸入
ACTION_DROP
。 拖曳事件物件包含將資料傳送至 呼叫startDragAndDrop()
來啟動作業。事件監聽器會 如果事件監聽器成功,則預期將布林值true
傳回系統 處理捨棄的資料 :使用者必須將拖曳陰影放置在View
的定界框,其事件監聽器已註冊接收拖曳事件 (放置目標)。當使用者在任何其他 Google 資源中放開拖曳陰影 在此情況下,系統不會傳送ACTION_DROP
拖曳事件。 - 已結束
使用者放開拖曳陰影後,系統傳送
發生動作類型為
ACTION_DROP
的拖曳事件時 (如有需要),系統會 會傳送動作類型為ACTION_DRAG_ENDED
的拖曳事件,表示 拖曳作業結束無論使用者位於何處 放開拖曳陰影。事件會傳送給 註冊以接收拖曳事件,即使接聽程式也會收到ACTION_DROP
事件。
每個步驟都會在名為 拖曳作業。
拖曳事件
系統會以 DragEvent
物件的形式傳送拖曳事件,
包含動作類型,說明拖曳中發生的情況
上傳資料集之後,您可以運用 AutoML
自動完成部分資料準備工作視動作類型而定,物件中也可能包含其他資料。
拖曳事件監聽器會接收 DragEvent
物件。為了取得動作類型,事件監聽器會呼叫 DragEvent.getAction()
。DragEvent
類別中的常數定義了六個可能的值。
表 1 所述:
動作類型 | 意義 |
---|---|
ACTION_DRAG_STARTED |
應用程式會呼叫 startDragAndDrop() 並取得
產生拖曳陰影如果事件監聽器要繼續接收拖曳事件
進行這項作業時,必須將布林值 true 傳回給
有些人會將 Cloud Storage 視為檔案系統
但實際上不是
|
ACTION_DRAG_ENTERED |
拖曳陰影會進入拖曳事件監聽器的邊框
View 。這是監聽器的第一個事件動作類型
會在拖曳陰影進入定界框時接收。
|
ACTION_DRAG_LOCATION |
隨後傳送到
ACTION_DRAG_ENTERED 事件,拖曳陰影仍在
位於拖曳事件監聽器的定界框內
View 。
|
ACTION_DRAG_EXITED |
追蹤ACTION_DRAG_ENTERED 和至少一個
ACTION_DRAG_LOCATION 事件,拖曳陰影移動
位於拖曳事件監聽器的定界框外
View 。
|
ACTION_DROP |
拖曳陰影會在拖曳事件監聽器的上方放開
View 。這個動作類型已傳送至View
只有當事件監聽器傳回布林值時,該物件的事件監聽器
true 以回應
ACTION_DRAG_STARTED 拖曳事件。不屬於這個動作類型
當使用者在 View 上放開拖曳陰影時傳送
監聽器的事件監聽器尚未註冊,或者使用者放開拖曳
任何不屬於目前版面配置的內容都會加上陰影。
如果事件監聽器會傳回布林值 |
ACTION_DRAG_ENDED |
系統正在結束拖曳作業。這個動作類型
而不是放在 ACTION_DROP 事件之前。如果
系統會傳送 ACTION_DROP ,並在收到要求後接收
ACTION_DRAG_ENDED 動作類型並不表示
捨棄成功接聽程式必須呼叫
getResult() ,
如表 2 所示,您必須先取得
回應 ACTION_DROP 。如果
ACTION_DROP 事件不會傳送,那麼
getResult() 會傳回 false 。
|
DragEvent
物件也會包含應用程式所需的資料和中繼資料
會在呼叫 startDragAndDrop()
時提供給系統部分資料
僅適用於特定動作類型,請參見表 2。如要
相關資訊,請參閱「A
拖曳作業
getAction() 值 |
getClipDescription() 值 |
getLocalState() 值 |
getX() 值 |
getY() 值 |
getClipData() 值 |
getResult() 值 |
---|---|---|---|---|---|---|
ACTION_DRAG_STARTED |
✓ | ✓ | ||||
ACTION_DRAG_ENTERED |
✓ | ✓ | ||||
ACTION_DRAG_LOCATION |
✓ | ✓ | ✓ | ✓ | ||
ACTION_DRAG_EXITED |
✓ | ✓ | ||||
ACTION_DROP |
✓ | ✓ | ✓ | ✓ | ✓ | |
ACTION_DRAG_ENDED |
✓ | ✓ |
DragEvent
方法 getAction()
、
describeContents()
、
writeToParcel()
、
和 toString()
永遠
傳回有效的資料。
如果方法未包含特定動作類型的有效資料,則會傳回
null
或 0,視結果類型而定。
拖曳陰影
執行拖曳作業期間,系統會顯示使用者顯示圖片 。若是移動資料,此圖片則代表拖曳的資料。若是其他作業,圖片則代表拖曳作業的某些部分。
圖片稱為「拖曳陰影」。使用您宣告的方法
換
View.DragShadowBuilder
敬上
物件。開始拖曳時,會將建構工具傳遞至系統
使用 startDragAndDrop()
執行這項作業。做為回覆
startDragAndDrop()
,系統會叫用您定義的回呼方法
View.DragShadowBuilder
可取得拖曳陰影。
View.DragShadowBuilder
類別有兩個建構函式:
View.DragShadowBuilder(View)
此建構函式接受應用程式的任何
View
物件。建構函式會儲存View.DragShadowBuilder
物件中的View
物件,因此回呼 就能存取該物件來建構拖曳陰影檢視畫面不一定要是 使用者選取的View
以啟動拖曳作業。使用這個建構函式時,您不必
View.DragShadowBuilder
或覆寫其方法。根據預設,您可以使用拖曳方式 外觀與做為引數傳遞的View
相同, 置中對齊。View.DragShadowBuilder()
如果您使用這個建構函式,
View
就不會在View.DragShadowBuilder
物件。這個欄位已設為null
。你必須延長View.DragShadowBuilder
並覆寫其方法,或者, 隱形的拖曳陰影系統不會擲回錯誤。
View.DragShadowBuilder
類別有兩種方法共同建立拖曳項目
陰影:
onProvideShadowMetrics()
系統會在您呼叫
startDragAndDrop()
後立即呼叫這個方法。 使用這個方法,將拖曳陰影的尺寸和觸控點傳送至 以及系統此方法有兩個參數:outShadowSize
:Point
物件。拖曳陰影寬度為x
,且高度為y
。outShadowTouchPoint
:Point
物件。觸控點代表位置 置於使用者手指下方的拖曳陰影中。 該分數的 X 位置為x
,Y 位置則為y
。onDrawShadow()
呼叫
onProvideShadowMetrics()
後,系統會立即呼叫onDrawShadow()
來建立拖曳陰影。此方法含有 引數,Canvas
物件 系統是根據您提供的參數建構內容onProvideShadowMetrics()
。此方法會在提供的Canvas
。
如要提升效能,請縮減拖曳陰影的大小。單一 項目,建議您使用圖示。如果要選取多個項目,可以 想以堆疊的方式使用圖示,而不是讓整個圖片分散在畫面中。
拖曳事件監聽器和回呼方法
View
會透過實作的拖曳事件監聽器接收拖曳事件
View.OnDragListener
,或使用檢視畫面的 onDragEvent()
回呼方法。時間
系統就會呼叫方法或事件監聽器
DragEvent
引數。
在大部分情況下,使用監聽器時最好使用回呼方法。時間
設計 UI 時,您通常不會將 View
類別設為子類別,但使用
回呼方法會強制您建立子類別來覆寫方法。於
比較,您可以實作一個事件監聽器類別,然後搭配多個
不同的 View
物件。您也可以將預做為匿名內嵌類別
或 lambda 運算式。如要設定 View
物件的事件監聽器,請呼叫
setOnDragListener()
。
不過,您可以變更 onDragEvent()
的預設實作方式。
而不必覆寫 方法設定
OnReceiveContentListener
敬上
或「探索」維度詳情請參閱
setOnReceiveContentListener()
。
接著,onDragEvent()
方法會預設執行以下操作:
- 傳回 true,以回應對
startDragAndDrop()
的呼叫。 來電次數
performReceiveContent()
敬上 如果在檢視畫面上放置了拖曳資料資料會傳送到 將方法當做ContentInfo
物件使用。 方法叫用OnReceiveContentListener
。如果拖曳資料在檢視畫面中放置,而且
OnReceiveContentListener
會使用任何內容。
定義 OnReceiveContentListener
即可專門處理以下項目的資料:
應用程式。為了回溯相容到 API 級別 24,請使用 Jetpack 版本的
OnReceiveContentListener
。
您可以在 View
中為 View
物件設定拖曳事件監聽器和回呼方法
在這種情況下,系統會先呼叫事件監聽器。系統不會呼叫
回呼方法,除非事件監聽器傳回 false
。
onDragEvent()
方法和 View.OnDragListener
的組合為
類似於
onTouchEvent()
敬上
和View.OnTouchListener
搭配觸控事件使用