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;

}

}
相关文章
相关标签/搜索