Android -- DragDrop
Android3.0提供了drag/drop框架,利用此框架可以實(shí)現(xiàn)使用拖放手勢(shì)將一個(gè)view拖放到當(dāng)前布局中的另外一個(gè)view中。
實(shí)現(xiàn)拖放的步驟
首先,我們先了解一下拖放過(guò)程,從官方文檔可以知道,整個(gè)拖放過(guò)程共分為4個(gè)步驟,具體如下:
1、? Started:啟動(dòng)拖放,主要是調(diào)用被拖放View的startDrag方法。此方法原型為:
public final boolean startDrag(ClipData data, View.DragShadowBuilder shadowBuilder, Object myLocalState, int flags)啟動(dòng)后,系統(tǒng)生成拖放陰影并發(fā)送action為ACTION_DRAG_STARTED的拖放事件到當(dāng)前布局中已經(jīng)設(shè)置了拖放監(jiān)聽的View。
2、? Continuing:保持拖動(dòng)狀態(tài)。在此過(guò)程中系統(tǒng)可能會(huì)發(fā)送一個(gè)或多個(gè)拖動(dòng)事件給設(shè)置了拖放監(jiān)聽器的View,比如ACTION_DRAG_ENTERED、ACTION_DRAG_LOCATION等。
3、? Dropped:用戶在目標(biāo)區(qū)域內(nèi)釋放拖動(dòng)陰影,系統(tǒng)會(huì)向設(shè)置了拖放監(jiān)聽器的View發(fā)送action為ACTION_DROP的事件。
4、? Ended:用戶釋放了拖動(dòng)陰影,系統(tǒng)會(huì)向設(shè)置了拖放監(jiān)聽器的View發(fā)送action為ACTION_DRAG_ENDED事件,完成拖放。
拖放過(guò)程中關(guān)鍵的接口和類
其次,我們要了解清楚拖放過(guò)程中的幾個(gè)關(guān)鍵的接口和類,主要有OnDragListener、DragEvent、DragShadowBuilder、ClipData、ClipDescription等。
1、OnDragListener:接口,拖放事件監(jiān)聽器。當(dāng)發(fā)生Drag時(shí),回調(diào)此接口中的方法。接口中只含有一個(gè)方法onDrag,方法原型為:
boolean onDrag(View v, DragEvent event) //參數(shù)v:設(shè)置了監(jiān)聽器的View //參數(shù)event:拖放事件的參數(shù),封裝了拖放相關(guān)的數(shù)據(jù) //返回值:true-事件已處理;false事件未處理。2、DragEvent:拖放事件對(duì)象,根據(jù)action的不同,包含不同的事件數(shù)據(jù)。
3、DragShadowBuilder:拖放陰影構(gòu)造者對(duì)象,用于構(gòu)造拖放陰影。
4、ClipData、ClipDescription:用于拖放的移動(dòng)數(shù)據(jù)。
code
<?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" ><ImageViewandroid:id="@+id/img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:contentDescription="@null"android:src="@drawable/ic_launcher" /><LinearLayoutandroid:id="@+id/container"android:layout_width="match_parent"android:layout_height="100dp"android:layout_alignParentBottom="true"android:orientation="vertical"android:background="#cccccc" ><TextViewandroid:id="@+id/title"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textColor="#ff0000"android:textSize="18sp" /></LinearLayout></RelativeLayout>為ImageView綁定長(zhǎng)點(diǎn)擊事件
imageView.setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {//創(chuàng)建移動(dòng)數(shù)據(jù)ClipData.Item item = new ClipData.Item((String) v.getTag());ClipData data = new ClipData(IMAGEVIEW_TAG,new String[] { ClipDescription.MIMETYPE_TEXT_PLAIN },item);//調(diào)用startDrag方法,第二個(gè)參數(shù)為創(chuàng)建拖放陰影v.startDrag(data, new View.DragShadowBuilder(v), null, 0);return true;}});為目標(biāo)View綁定拖拽監(jiān)聽:
container.setOnDragListener(new OnDragListener() {@Overridepublic 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進(jìn)入目標(biāo)View container.setBackgroundColor(Color.YELLOW);return true;case DragEvent.ACTION_DRAG_LOCATION:return true;case DragEvent.ACTION_DRAG_EXITED://被拖放View離開目標(biāo)View container.setBackgroundColor(Color.BLUE);title.setText("");return true;case DragEvent.ACTION_DROP://釋放拖放陰影,并獲取移動(dòng)數(shù)據(jù)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;}});imageView的位置
topContainer.setOnDragListener(new OnDragListener() {@Overridepublic boolean onDrag(View v, DragEvent event) {final int action = event.getAction();switch (action) {case DragEvent.ACTION_DRAG_STARTED:return true;case DragEvent.ACTION_DRAG_ENTERED:return true;case DragEvent.ACTION_DRAG_LOCATION:return true;case DragEvent.ACTION_DRAG_EXITED:return true;case DragEvent.ACTION_DROP:imageView.setX(event.getX()-imageView.getWidth()/2);imageView.setY(event.getY()-imageView.getHeight()/2);return true;case DragEvent.ACTION_DRAG_ENDED:return true;default:break;}return false;}});效果
我是天王蓋地虎的分割線
?
?
轉(zhuǎn)載:http://www.cnblogs.com/jerehedu/p/4427588.html
總結(jié)
以上是生活随笔為你收集整理的Android -- DragDrop的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 10.10SSD安装盘clover 下开
- 下一篇: Android 组件系列-----Act