日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android -- DragDrop

發(fā)布時(shí)間:2024/4/13 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android -- DragDrop 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。