²拖放操做是手指觸摸屏幕上的某一對象,而後拖動該對象,最後在屏幕的某個位置釋放該對象並執行某種操做,如刪除、卸載、啓動、複製數據等。編程
²容許以圖形化的手勢操做完成某項任務。ide
²拖放操做的優點:直觀、易用、簡化操做步驟。ui
²SDK3.0提供了支持拖放操做的編程機制,簡稱拖放機制,拖放機制是爲數據移動設計的,但可以用於其它的UI操做。如Android系統自帶的將托盤內圖標表明的應用程序以拖放的方式卸載。this
²拖放機制比自編程實現拖放操做更方便,優勢包括:spa
一、提供了對全部View支持拖放操做的API,無需自定義View。設計
二、系統自動判斷手指的位置。日誌
三、由系統自動繪製影子圖形。code
四、系統提供了拖放對象與目標對象之間傳遞數據的機制,簡化了數據傳遞的編程。對象
五、提供了更多的拖放事件,如按下、擡起、釋放、進入目標區域、仍在目標區域、離開目標區域、結束拖放等六個事件。而且這些事件由系統捕捉、發送,開發者只需編寫處理這些事件的代碼。接口
²拖放機制包括:
一、響應拖放操做事件的接口;
二、存放拖放操做相關信息的類;
三、啓動拖放操做的方法;
四、繪製拖放過程當中影子圖形的類;
五、傳遞數據的類。
步驟一、設置被拖放對象的點擊或長按或觸摸的事件響應代碼,在該響應代碼中完成如下操做:
1)設置傳送給目標對象的數據;
2)設置拖放過程當中繪製影子圖形的對象;
3)啓動拖放操做。
步驟二、編寫被拖放對象和拖放目標對象的響應拖放事件的代碼。
一、概述
在拖拽和放下操做期間,系統會顯示一張用戶拖動的圖片。對於要移動的數據,這張圖片就表明了被拖動的數據。對於操做,這張圖片就表明了拖動操做的某些外觀。
這張圖片被叫作影子圖形,由DragShadowBuilder對象來建立。
DragShadowBuilder類是View類的內部類。
二、構造方法
三、與拖拽相關的方法
一、概述
OnDragListener接口用於響應拖拽的相關事件。
二、接口中聲明的方法
一、概述
系統用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; } }