鍍金池/ 教程/ Android/ Android拖放
Android 應用組件
使用布局文件自定義Android組件
Android通知
Android主題示例
Android JetPlayer實例
Android MediaPlayer(多媒體播放)
Android AbsoluteLayout
Android FrameLayout
Android Gestures/手勢
Android AutoCompleteTextView(自動完成)實例
Android 資源組織和訪問
Android ListView
Android GridView
Android數(shù)據(jù)備份
Android撥打電話
Android發(fā)送短信/SMS
Android ProgressDialog
SimpleCursorAdapter
Android發(fā)送電子郵件
Android Activity
Android TextView
Android事件處理
Android TableLayout
Android加載Spinner
Android內(nèi)容提供者
Android自定義字體
Android Service
Android CheckBox
Android Intent過濾器
Android LinearLayout
Android登錄實例
Android RadioButton
Android樣式和主題
Android自定義組件及屬性
Android UI控件
Android Animation(動畫)實例
Android Camera(攝像頭)
Android ToggleButton
Android Clipboard(復制/剪貼板)
Android音頻捕獲(錄音)
發(fā)布Android應用
Android Alertdialog(警告對話框)
Android圖片效果
Android內(nèi)部存儲
Android基于位置服務
Android RadioGroup
Android AutoCompleteTextView
Android Bluetooth(藍牙)實例
Android RelativeLayout
Android最佳實踐
Android本地化
Android自定義組件
Android教程
Android 架構(gòu)
Android UI布局
Android Button
Android Hello World示例
Android音頻管理器實例
ArrayAdapter
Android拖放
Android碎片/片段
Android圖片切換
Android JSON解析器
Android開發(fā)環(huán)境搭建
Android Spinner
Android樣式示例
使用活動代碼自定義Android組件
Android ImageButton
Android EditText
Android廣播接收器

Android拖放

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 類

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對象的字符串表示

監(jiān)聽拖放事件

如果想要的任何布局內(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 應用組件