Android的拖放機制

1、拖放機制概述

²拖放操做是手指觸摸屏幕上的某一對象,而後拖動該對象,最後在屏幕的某個位置釋放該對象並執行某種操做,如刪除、卸載、啓動、複製數據等。編程

²容許以圖形化的手勢操做完成某項任務。ide

²拖放操做的優點:直觀、易用、簡化操做步驟。ui

²SDK3.0提供了支持拖放操做的編程機制,簡稱拖放機制,拖放機制是爲數據移動設計的,但可以用於其它的UI操做。如Android系統自帶的將托盤內圖標表明的應用程序以拖放的方式卸載。this

²拖放機制比自編程實現拖放操做更方便,優勢包括:spa

一、提供了對全部View支持拖放操做的API,無需自定義View。設計

二、系統自動判斷手指的位置。日誌

三、由系統自動繪製影子圖形。code

四、系統提供了拖放對象與目標對象之間傳遞數據的機制,簡化了數據傳遞的編程。對象

五、提供了更多的拖放事件,如按下、擡起、釋放、進入目標區域、仍在目標區域、離開目標區域、結束拖放等六個事件。而且這些事件由系統捕捉、發送,開發者只需編寫處理這些事件的代碼。接口

²拖放機制包括:

一、響應拖放操做事件的接口;

二、存放拖放操做相關信息的類;

三、啓動拖放操做的方法;

四、繪製拖放過程當中影子圖形的類;

五、傳遞數據的類。

(二)拖放編程步驟

步驟一、設置被拖放對象的點擊或長按或觸摸的事件響應代碼,在該響應代碼中完成如下操做:

1)設置傳送給目標對象的數據;

2)設置拖放過程當中繪製影子圖形的對象;

3)啓動拖放操做。

步驟二、編寫被拖放對象和拖放目標對象的響應拖放事件的代碼。

(三)相關類-ClipData

圖片描述

(四)相關類-DragShadowBuilder

一、概述

在拖拽和放下操做期間,系統會顯示一張用戶拖動的圖片。對於要移動的數據,這張圖片就表明了被拖動的數據。對於操做,這張圖片就表明了拖動操做的某些外觀。

這張圖片被叫作影子圖形,由DragShadowBuilder對象來建立。

DragShadowBuilder類是View類的內部類。

二、構造方法
圖片描述

三、與拖拽相關的方法
圖片描述

(五)相關接口-OnDragListener

一、概述

OnDragListener接口用於響應拖拽的相關事件。

二、接口中聲明的方法
圖片描述

(六)相關類-DragEvent

一、概述

系統用DragEvent對象存儲拖放事件的相關信息。DragEvent對象包含了一個操做類型,用於告訴監聽器在拖放過程當中發生的事件。該對象還根據操做類型,包含了其它的數據。

二、拖放事件常量
圖片描述
有六種與拖放相關的事件,這些事件在DragEvent類中用六個常量表示,以下表所示:
圖片描述
三、經常使用方法
圖片描述

2、【案例】

Ø目標

在屏幕左上有一個時鐘圖片,屏幕下邊有三個標籤,分別表明卸載、啓動和分享,如圖所示:
圖片描述
長按時鐘,在日誌窗口顯示「開始拖拽clock,拖動時鐘時,如圖下所示:
圖片描述
當拖動時鐘進入到「啓動」標籤區域,在日誌窗口顯示:clock進入啓動區,clock仍在啓動區,入圖下所示
圖片描述
圖片描述
當拖動時鐘離開「啓動」區域,在日誌窗口顯示:clock離開啓動區。鬆開時鐘將顯示拖放結束。
圖片描述
提示:

當進入目標區域時,即便沒有鬆手,仍會發生ACTION_DROP事件,所以在圖-7中顯示「啓動clock」。

當進入「卸載」、「分享」區域時,在日誌窗口中也將顯示相似圖-六、圖-7的信息。

Ø思路

步驟一、MainActivity實現拖放的相關接口

publicclassMainActivityextendsActivityimplementsOnDragListener,OnLongClickListener{

步驟二、定義MainActivity的成員

ImageViewmivClock;

TextViewmtvUninstall,mtvStart,mtvShare;

步驟三、初始化控件

privatevoidinitView() {

//建立顯示時鐘的控件

mivClock=(ImageView) findViewById(R.id.ivClock);

//設置時鐘拖拽事件的響應

mivClock.setOnDragListener(this);

//設置長按時間的響應

mivClock.setOnLongClickListener(this);

//建立表明分享、啓動和卸載的三個控件

mtvShare=(TextView) findViewById(R.id.tvShare);

mtvStart=(TextView) findViewById(R.id.tvStart);

mtvUninstall=(TextView) findViewById(R.id.tvUninstall);

//設置三個TextView響應拖拽事件的代碼

mtvShare.setOnDragListener(this);

mtvStart.setOnDragListener(this);

mtvUninstall.setOnDragListener(this);

}

步驟四、編寫響應拖放事件的代碼

//響應拖拽事件

@Override

publicbooleanonDrag(View view, DragEvent event) {

booleanresult=true;

//獲取拖拽的動做類型值

intaction=event.getAction();

switch(action) {

caseDragEvent.ACTION_DRAG_STARTED:

if(view.getId()==R.id.ivClock){

Log.i("main","開始拖拽clock");

}

break;

caseDragEvent.ACTION_DRAG_ENTERED:

if(view.getId()==R.id.tvStart){

Log.i("main","clock進入啓動區");

}

break;

caseDragEvent.ACTION_DRAG_EXITED:

if(view.getId()==R.id.tvStart){

Log.i("main","clock離開啓動區");

}

caseDragEvent.ACTION_DRAG_LOCATION:

if(view.getId()==R.id.tvStart){

Log.i("main","clock仍在啓動區");

}

caseDragEvent.ACTION_DROP:

if(view.getId()==R.id.tvShare){

Log.i("main","分享clock");

}elseif(view.getId()==R.id.tvStart){

Log.i("main","啓動clock");

}elseif(view.getId()==R.id.tvUninstall){

Log.i("main","卸載clock");

}

break;

caseDragEvent.ACTION_DRAG_ENDED:

Log.i("main","拖拽結束,在drop事件以後發生");

break;

default:

result=false;

break;

}

returnresult;

}

步驟五、編寫響應長按事件的代碼

//長按事件響應程序

@Override

publicbooleanonLongClick(View view) {

//建立實現陰影的對象

DragShadowBuilder builder=newDragShadowBuilder(view);

/*開始拖拽並把view對象傳遞給系統。做爲響應startDrag()方法的一部分,

*系統調用在View.DragShadowBuilder對象中定義的回調方法

*來獲取拖拽影子。

*/

view.startDrag(null, builder,null, 0);

returntrue;

}

}
相關文章
相關標籤/搜索