Android的拖放机制

一、拖放机制概述

²拖放操作是手指触摸屏幕上的某一对象,然后拖动该对象,最后在屏幕的某个位置释放该对象并执行某种操作,如删除、卸载、启动、复制数据等。

²允许以图形化的手势操作完成某项任务。

²拖放操作的优势:直观、易用、简化操作步骤。

²SDK3.0提供了支持拖放操作的编程机制,简称拖放机制,拖放机制是为数据移动设计的,但能够用于其它的UI操作。如Android系统自带的将托盘内图标代表的应用程序以拖放的方式卸载。

²拖放机制比自编程实现拖放操作更方便,优点包括:

1、提供了对所有View支持拖放操作的API,无需自定义View。

2、系统自动判断手指的位置。

3、由系统自动绘制影子图形。

4、系统提供了拖放对象与目标对象之间传递数据的机制,简化了数据传递的编程。

5、提供了更多的拖放事件,如按下、抬起、释放、进入目标区域、仍在目标区域、离开目标区域、结束拖放等六个事件。并且这些事件由系统捕捉、发送,开发者只需编写处理这些事件的代码。

²拖放机制包括:

1、响应拖放操作事件的接口;

2、存放拖放操作相关信息的类;

3、启动拖放操作的方法;

4、绘制拖放过程中影子图形的类;

5、传递数据的类。

(二)拖放编程步骤

步骤1、设置被拖放对象的点击或长按或触摸的事件响应代码,在该响应代码中完成以下操作:

1)设置传送给目标对象的数据;

2)设置拖放过程中绘制影子图形的对象;

3)启动拖放操作。

步骤2、编写被拖放对象和拖放目标对象的响应拖放事件的代码。

(三)相关类-ClipData

(四)相关类-DragShadowBuilder

1、概述

在拖拽和放下操作期间,系统会显示一张用户拖动的图片。对于要移动的数据,这张图片就代表了被拖动的数据。对于操作,这张图片就代表了拖动操作的某些外观。

这张图片被叫做影子图形,由DragShadowBuilder对象来创建。

DragShadowBuilder类是View类的内部类。

2、构造方法

3、与拖拽相关的方法

(五)相关接口-OnDragListener

1、概述

OnDragListener接口用于响应拖拽的相关事件。

2、接口中声明的方法

(六)相关类-DragEvent

1、概述

系统用DragEvent对象存储拖放事件的相关信息。DragEvent对象包含了一个操作类型,用于告诉监听器在拖放过程中发生的事件。该对象还根据操作类型,包含了其它的数据。

2、拖放事件常量

有六种与拖放相关的事件,这些事件在DragEvent类中用六个常量表示,如下表所示:

3、常用方法

二、【案例】

Ø目标

在屏幕左上有一个时钟图片,屏幕下边有三个标签,分别代表卸载、启动和分享,如图-4所示:

图-4

长按时钟,在日志窗口显示“开始拖拽clock,拖动时钟时,如图-5所示:

图-5

当拖动时钟进入到“启动”标签区域,在日志窗口显示:clock进入启动区,clock仍在启动区,入图-6所示

图-6

当拖动时钟离开“启动”区域,在日志窗口显示:clock离开启动区。松开时钟将显示拖放结束。

图-7

提示:

当进入目标区域时,即使没有松手,仍会发生ACTION_DROP事件,因此在图-7中显示“启动clock”。

当进入“卸载”、“分享”区域时,在日志窗口中也将显示类似图-6、图-7的信息。

Ø思路

步骤1、MainActivity实现拖放的相关接口

publicclassMainActivityextendsActivityimplementsOnDragListener,OnLongClickListener{

步骤2、定义MainActivity的成员

ImageViewmivClock;

TextViewmtvUninstall,mtvStart,mtvShare;

步骤3、初始化控件

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);

}

步骤4、编写响应拖放事件的代码

//响应拖拽事件

@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;

}

步骤5、编写响应长按事件的代码

//长按事件响应程序

@Override

publicbooleanonLongClick(View view) {

//创建实现阴影的对象

DragShadowBuilder builder=newDragShadowBuilder(view);

/*开始拖拽并把view对象传递给系统。作为响应startDrag()方法的一部分,

*系统调用在View.DragShadowBuilder对象中定义的回调方法

*来获取拖拽影子。

*/

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

returntrue;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容