基本概念

以下各節說明幾個拖曳程序的重要概念。

拖曳程序

拖曳程序包含四個步驟或狀態:已開始 停止、捨棄和結束

已開始

為回應使用者的拖曳手勢,應用程式會呼叫 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 所述:

表 1. DragEvent 動作類型

動作類型 意義
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 上放開拖曳陰影時傳送 監聽器的事件監聽器尚未註冊,或者使用者放開拖曳 任何不屬於目前版面配置的內容都會加上陰影。

如果事件監聽器會傳回布林值 true 處理掉落作業否則,必須傳回 false

ACTION_DRAG_ENDED 系統正在結束拖曳作業。這個動作類型 而不是放在 ACTION_DROP 事件之前。如果 系統會傳送 ACTION_DROP,並在收到要求後接收 ACTION_DRAG_ENDED 動作類型並不表示 捨棄成功接聽程式必須呼叫 getResult(), 如表 2 所示,您必須先取得 回應 ACTION_DROP。如果 ACTION_DROP 事件不會傳送,那麼 getResult() 會傳回 false

DragEvent 物件也會包含應用程式所需的資料和中繼資料 會在呼叫 startDragAndDrop() 時提供給系統部分資料 僅適用於特定動作類型,請參見表 2。如要 相關資訊,請參閱「A 拖曳作業

表 2. 各動作類型的有效 DragEvent 資料

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() 後立即呼叫這個方法。 使用這個方法,將拖曳陰影的尺寸和觸控點傳送至 以及系統此方法有兩個參數:

outShadowSizePoint 物件。拖曳陰影寬度為 x,且高度為 y

outShadowTouchPointPoint 物件。觸控點代表位置 置於使用者手指下方的拖曳陰影中。 該分數的 X 位置為 xY 位置則為 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 搭配觸控事件使用