Android開發之Drag&Drop架構實現拖放手勢

來源:互聯網
上載者:User

標籤:

  Android3.0提供了drag/drop架構,利用此架構可以實現使用拖放手勢將一個view拖放到當前布局中的另外一個view中。本文將介紹如何使用拖放架構。

一、實現拖放的步驟

   首先,我們先瞭解一下拖放過程,從官方文檔可以知道,整個拖放過程共分為4個步驟,具體如下:

  1、  Started:啟動拖放,主要是調用被拖放View的startDrag方法。此方法原型為:

public final boolean startDrag(ClipData data,

               View.DragShadowBuilder shadowBuilder,

               Object myLocalState,

                int flags)

  啟動後,系統產生拖放陰影並發送action為ACTION_DRAG_STARTED的拖放事件到當前布局中已經設定了拖放監聽的View。

  2、  Continuing:保持拖動狀態。在此過程中系統可能會發送一個或多個拖動事件給設定了拖放監聽器的View,比如ACTION_DRAG_ENTERED、ACTION_DRAG_LOCATION等。

  3、  Dropped:使用者在目的地區域內釋放拖動陰影,系統會向設定了拖放監聽器的View發送action為ACTION_DROP的事件。

  4、  Ended:使用者釋放了拖動陰影,系統會向設定了拖放監聽器的View發送action為ACTION_DRAG_ENDED事件,完成拖放。

二、拖放過程中關鍵的介面和類

   其次,我們要瞭解清楚拖放過程中的幾個關鍵的介面和類,主要有OnDragListener、DragEvent、DragShadowBuilder、ClipData、ClipDescription等。

  1、OnDragListener:介面,拖放事件監聽器。當發生Drag時,回調此介面中的方法。介面中只含有一個方法onDrag,方法原型為:

   boolean onDrag(View v,DragEvent event)

   參數v:設定了監聽器的View

   參數event:拖放事件的參數,封裝了拖放相關的資料

   返回值:true-事件已處理;false事件未處理。

  2、DragEvent:拖放事件對象,根據action的不同,包含不同的事件數目據。

  3、DragShadowBuilder:拖放陰影構造者對象,用於構造拖放陰影。

  4、ClipData、ClipDescription:用於拖放的移動資料。

三、案例展示

   對以上內容有了基本瞭解後,我們來進行如下案例,首先看

  介面內共有兩個地區,灰色地區和黃色地區,表徵圖可在灰色地區內自由拖動,並可改變自己的位置,如

 

  當表徵圖進入或離開黃色地區時,將改變顏色,如下

四、案例實現

   下面我們看看具體如何?:

  布局檔案,代碼如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/topContainer"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <ImageView        android:id="@+id/img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:contentDescription="@null"        android:src="@drawable/ic_launcher" />    <LinearLayout        android:id="@+id/container"        android:layout_width="match_parent"        android:layout_height="100dp"        android:layout_alignParentBottom="true"        android:orientation="vertical"        android:background="#cccccc" >        <TextView            android:id="@+id/title"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:textColor="#ff0000"            android:textSize="18sp" />    </LinearLayout></RelativeLayout>

  Java檔案:

  為ImageView綁定長點擊事件

imageView.setOnLongClickListener(new OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                //建立移動資料                ClipData.Item item = new ClipData.Item((String) v.getTag());                ClipData data = new ClipData(IMAGEVIEW_TAG,                        new String[] { ClipDescription.MIMETYPE_TEXT_PLAIN },                        item);                //調用startDrag方法,第二個參數為建立拖放陰影                v.startDrag(data, new View.DragShadowBuilder(v), null, 0);                return true;            }        });

  為目標View綁定拖拽監聽:

container.setOnDragListener(new OnDragListener() {            @Override            public boolean onDrag(View v, DragEvent event) {                final int action = event.getAction();                switch (action) {                case DragEvent.ACTION_DRAG_STARTED:                    //拖拽開始事件                    if (event.getClipDescription().hasMimeType(                            ClipDescription.MIMETYPE_TEXT_PLAIN)) {                        return true;                    }                    return false;                case DragEvent.ACTION_DRAG_ENTERED:                    //被拖放View進入目標View                    container.setBackgroundColor(Color.YELLOW);                    return true;                case DragEvent.ACTION_DRAG_LOCATION:                    return true;                case DragEvent.ACTION_DRAG_EXITED:                    //被拖放View離開目標View                    container.setBackgroundColor(Color.BLUE);                    title.setText("");                    return true;                case DragEvent.ACTION_DROP:                    //釋放拖放陰影,並擷取移動資料                    ClipData.Item item = event.getClipData().getItemAt(0);                    String dragData = item.getText().toString();                    title.setText(dragData+event.getY()+":"+event.getX());                    return true;                case DragEvent.ACTION_DRAG_ENDED:                    //拖放事件完成                    return true;                default:                    break;                }                return false;            }        });
五、源碼下載

  想要動手實踐的小夥伴,可以點擊“源碼下載”下載完整工程測試。

Android開發之Drag&Drop架構實現拖放手勢

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.