Android 拖/放框架允許用戶將數(shù)據(jù)從一個View到另一個視圖在當前布局中使用圖形化的拖放動作。該框架包括以下三個重要組成部分,支持拖放功能:
拖動事件類
拖動監(jiān)聽器
輔助方法和類
基本上有四個步驟,在拖放過程或狀態(tài):
開始:此事件發(fā)生時開始拖動布局中的一個項目,應用類的tartDrag()方法來告訴系統(tǒng)啟動拖動。startDrag()方法的參數(shù)提供被拖動的數(shù)據(jù),這些是數(shù)據(jù)的元數(shù)據(jù)和一個回調(diào)用于繪制的拖動陰影。
該系統(tǒng)首先通過回調(diào)應用程序,以獲得一個拖陰影的響應。然后顯示在設備上的拖影。
接下來,系統(tǒng)會發(fā)送拖曳事件動作類型ACTION_DRAG_STARTED在當前布局中的所有視圖對象拖動事件監(jiān)聽器注冊。
若要繼續(xù)接收拖動事件,其中包括一個可能的放事件,一個拖事件偵聽器必須返回true,如果拖動事件偵聽器返回false,那么它不會收到拖動事件當前的操作,直到系統(tǒng)發(fā)送一個動作類型的拖曳事件ACTION_DRAG_ENDED。
繼續(xù):用戶可以繼續(xù)拖動。系統(tǒng)發(fā)送ACTION_DRAG_ENTERED動作,其次注冊拖動事件偵聽器的視圖中拖動點進入ACTION_DRAG_LOCATION動作。響應該事件監(jiān)聽器可以選擇改變其對象的外觀或可以凸顯其觀點反應。用戶移動拖動視圖的邊框陰影外拖曳事件偵聽器接收ACTION_DRAG_EXITED動作。
拖動:用戶釋放拖動的項目視圖的邊框內(nèi)。該系統(tǒng)發(fā)送對象的偵聽器拖動事件使用動作類型ACTION_DROP。
結(jié)果:操作類型ACTION_DROP之后,系統(tǒng)發(fā)出一個操作類型ACTION_DRAG_ENDED表示拖動操作結(jié)束的拖動事件。
dragEvent代表一個事件,就會由系統(tǒng)送出拖放操作過程中在不同的時間。這個類提供了一些常量和重要的方法在使用拖/放過程。
以下是所有常量作為部分 dragEvent 類整數(shù)。
S.N. | 常量說明 |
---|---|
1 |
ACTION_DRAG_STARTED 拖放操作的開始的信號 |
2 |
ACTION_DRAG_ENTERED 一種視圖拖動點已進入視圖的邊框的信號 |
3 |
ACTION_DRAG_LOCATION 發(fā)送到ACTION_DRAG_ENTERED后的視圖,如果拖影依然是查看對象的邊框內(nèi) |
4 |
ACTION_DRAG_EXITED 信號的用戶移動拖動陰影視圖的邊框之外 |
5 |
ACTION_DROP 信號到View用戶發(fā)布了拖影,而阻力點就是視圖的邊框內(nèi) |
6 |
ACTION_DRAG_ENDED 視圖拖放操作已經(jīng)結(jié)束信號 |
以下是作為部分的 dragEvent 類提供一些重要的和最常用的方法。
S.N. | 常量說明 |
---|---|
1 |
int getAction() 檢查此事件的動作值 |
2 |
ClipData getClipData() 返回對象到系統(tǒng)調(diào)用ClipData()發(fā)送作為到startDrag一部分部分 |
3 |
ClipDescription getClipDescription() 返回包含在ClipData的ClipDescription對象 |
4 |
boolean getResult() 返回拖放操作的結(jié)果的指示 |
5 |
float getX() 獲取阻力的X坐標點 |
6 |
float getY() 獲取阻力的Y坐標點 |
7 |
String toString() 返回DragEvent對象的字符串表示 |
如果想要的任何布局內(nèi)視圖響應拖動事件,那么視圖要么實現(xiàn) View.OnDragListener 或者設置 onDragEvent(DragEvent) 回調(diào)方法。當系統(tǒng)調(diào)用的方法或監(jiān)聽器,它傳遞給上述 dragEvent 對象??梢圆榭磳ο蟮谋O(jiān)聽器和一個回調(diào)方法。如果發(fā)生這種情況,系統(tǒng)首先調(diào)用監(jiān)聽器,然后定義回調(diào)監(jiān)聽器返回true。
組合 onDragEvent(DragEvent)方法 和 View.OnDragListener,類似于 onTouchEvent() 和 View.OnTouchListener 使用在舊版本 Android 觸摸事件的組合。
開始創(chuàng)建ClipData和移動數(shù)據(jù)ClipData.Item。作為ClipDataobject 的一部分提供的元數(shù)據(jù)被存儲在ClipDescription內(nèi)ClipData對象。對于拖放操作,并不代表數(shù)據(jù)移動,可能想使用空(null)而不是實際的對象。
下一步,可以擴展 View.DragShadowBuilder 創(chuàng)建一個拖動視圖,或者使用 View.DragShadowBuilder(View) 創(chuàng)建一個默認的大小相同的View參數(shù)傳遞給它的拖影,觸摸拖動陰影點集中在拖影。
下面的例子顯示了一個簡單的拖放示例中使用View.setOnLongClickListener() 事件偵聽器和 View.OnDragEventListener().函數(shù)。
步驟 | 描述 |
---|---|
1 | 使用Android Studio創(chuàng)建Android應用程序,并將它命名為:DragNDropDemo。在創(chuàng)建這個項目,確保目標SDK和編譯在Android SDK的最新版本或使用更高級別的API。 |
2 | 修改 src/MainActivity.java 文件,并添加定義事件偵聽器的代碼,以及一個回調(diào)方法,在這個例子中使用Logo圖像 |
3 | 復制圖片logo.png到res/drawable-* 文件夾??梢允褂玫那闆r下,要為他們提供了不同的設備有不同的分辨率的圖像 |
4 | 修改布局文件 res/layout/activity_main.xml l定義logo圖片的默認視圖 |
5 | 運行該應用程序啟動 Android模擬器并驗證應用程序所做的修改結(jié)果。 |
以下是修改主活動文件 src/com.yiibai.dragndropdemo/MainActivity.java 。這個文件可以包括每個生命周期基本方法。
package com.yiibai.dragndropdemo; import android.os.Bundle; import android.app.Activity; import android.content.ClipData; import android.content.ClipDescription; import android.util.Log; import android.view.DragEvent; import android.view.View; import android.view.View.DragShadowBuilder; import android.view.View.OnDragListener; import android.widget.*; public class MainActivity extends Activity{ ImageView ima; private static final String IMAGEVIEW_TAG = "Android Logo"; String msg; private android.widget.RelativeLayout.LayoutParams layoutParams; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ima = (ImageView)findViewById(R.id.iv_logo); // Sets the tag ima.setTag(IMAGEVIEW_TAG); ima.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { ClipData.Item item = new ClipData.Item((CharSequence)v.getTag()); String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN}; ClipData dragData = new ClipData(v.getTag().toString(), mimeTypes, item); // Instantiates the drag shadow builder. View.DragShadowBuilder myShadow = new上一篇:Android LinearLayout下一篇:Android 應用組件