用Android的拖放框架,能够允许用户使用图形化的拖放手势,把数据从当前布局中的一个View对象中移到另一个View对象中。这个框架包括:拖拽事件类、拖拽监听器、以及辅助的方法和类。

尽管这个框架主要是为数据移动设计的,但是你能够把它用于其他的UI操作。如,你能够创建一个调色应用程序,用户把一个颜色的图标拖到另一个颜色图标之上,完成两个颜色的调配操作。

概要

当用户使用一些被认可的手势信号来开始拖动数据时,一个拖放操作就开始了。在响应中, 应用程序会告诉系统拖动正在启动。系统就会回调应用程序来获得一个代表被拖动的数据的图形,当用户的手指移到这个代表图形(拖动阴影)当前的布局之上时, 系统会把拖动事件发给拖动事件监听器对象,并且拖动事件回调方法会跟布局中对应View对象进行关联。一旦用户释放了拖动阴影图形,系统就会结束拖动操作。

从实现View.OnDragListener接口的类中创建一个拖动事件监听器对象。用View对象的setOnDragListener()方法把拖动事件监听器对象设置给一个View对象。每个View对象还有一个onDragEvent()回调方法。这两个方法会在“拖拽事件监听器和回调方法”一节中详细介绍。

注意:为了简单起见,一下章节用“拖拽事件监听器”作为接收拖拽事件的示例程序,尽管可实践中也可以使用回调方法。

在开始拖动的时候,要把要移动的数据和描述这个数据的元数据作为系统调用的一部分。拖拽期间,系统把拖拽事件发送给拖拽事件监听器或布局中每个View对象的回调方法。监听器或回调方法能够使用元数据来判断它们是否能够接受这种数据。如果用户在一个View对象之上放下数据,并且这个View对象的监听器或回调方法已经告诉系统它要接收这个数据,那么系统就会把数据发送给拖拽事件中的监听器或回调方法。

通过调用startDrag()方法,应用程序会告诉系统开始拖拽的动作。这样就告诉系统要开始发送拖拽事件了。这个方法也发送正在拖放的数据。

你能够针对当前布局中任何绑定的View对象调用startDrag()方法。系统只使用View对象来获取对布局中的全局设置的访问。

一旦你的应用程序调用了startDrag()方法,剩下的过程就是使用系统发送给布局中的View对象的事件。

拖放过程

在拖放过程中有以下四个基本的步骤或状态:

1.  开始

在响应用户的屏幕手势中来开始拖拽,应用程序要调用startDrag()方法来告诉系统开始拖拽。给startDrag()方法提供的参数包括:被拖拽的数据、这个数据的元数据、以及描画拖拽阴影的回调方法。

系统通过响应这个调用,首先返回应用程序需要的拖拽阴影。然后再设备上显示阴影。

接下来,系统会把带有ACTION_DRAG_STARTED类型的拖拽事件发送给当前布局中所有的View对象的拖拽事件监听器,如果要继续接收拖拽事件包括可能的放下事件,View对象的拖拽事件监听器必须返回true。这样就在系统中注册了监听器。只有被注册的监听器能够继续接收拖拽事件。这时,监听器也能够改变它的View对象的外观来表示这个对象的监听器能够接收放下事件。

如果拖拽事件监听器返回false,那么一直到系统发送带有ACTION_DRAG_ENDED类型操作的拖拽事件时,这个事件监听器都不会接收当前操作的拖拽事件。通过发送false返回值,监听器会告诉系统它对这个拖拽操作不感兴趣,并且不会接收被拖拽的数据。

2.  持续

用户持续拖拽过程中,当拖拽阴影跟一个View对象的边框相交时,系统就会发送一个或多个拖拽事件给View对象的拖拽事件监听器(如果它被注册用来接收这些事件的话)。监听器也可以选择改变响应事件的View对象的外观。例如,如果这个事件指示拖拽阴影已经进入到接受拖拽事件的View对象的边框内,监听器就能够通过高亮显示它的View对象来做出反应。

3.  放下

用户在能够接受数据的View对象的边框内释放拖拽阴影,系统就会给View对象的监听器发送一个带有ACTION_DROP操作类型的拖拽事件。这个拖拽事件包含在startDrag()方法调用中传递给系统的数据。如果接受成功,监听器就会返回true给系统。

注意,这个步骤只会在用户放下拖放阴影的View对象(这个对象被注册用于接受这个拖拽事件)中发生,如果用户在其他的任何不接收这个拖拽事件的地方释放了拖拽阴影,就不会有ACTION_DROP拖拽事件发出。

4.  结束

用户释放了拖拽阴影之后,并且如果需要,系统也会发出了带有ACTION_DROP操作类型的拖拽事件,系统就会发出带有ACTION_DRAG_ENDED操作类型的拖拽事件,指示拖拽操作结束了。用户释放拖拽阴影的时机就是解除注册的时机。这个事件会发送给每个被注册用于接受这个拖拽事件的监听器,即使这个监听器收到了ACTION_DROP事件。

 
 

Android 用户界面---拖放(Drag and Drop)(一)的更多相关文章

  1. Android开发者指南-用户界面-拖放-Drag and Drop[原创译文]

      英文原文:http://developer.android.com/guide/topics/ui/drag-drop.html 版本:Android 4.0 r1 译者注:黄色底色为未决译文 快 ...

  2. Android 用户界面---拖放(Drag and Drop)(三)

      设计拖放操作 本节主要内容如下: 1.  如何开始拖拽: 2.  在拖拽期间如何响应事件: 3.  如何响应落下事件: 4.  如何结束拖放操作. 开始拖拽 用户使用一个拖拽手势开始拖拽,通常是在 ...

  3. Android 用户界面---拖放(Drag and Drop)(二)

      拖拽事件监听器和回调方法 View对象既可以用实现View.OnDragListener接口的拖放事件监听器,也可以用View对象的onDragEvent(DragEvent)回调方法来接收拖拽事 ...

  4. HTML5 之拖放(drag与drop)

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖放实例 ...

  5. HTML 5 拖放(Drag 和drop)

    浏览器支持 Internet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5. 1.把标签 draggable 属性设置为 true. 2.向标签添加on ...

  6. HTML5 拖放---drag和drop

    拖放四步走:第一步:设置元素可拖放,即把 draggable属性设置为 true:  例:<div id="div" draggable="true"&g ...

  7. 拖放(Drag和Drop)--html5

    拖放,就是抓取一个对象后拖放到另一个位置.很常用的一个功能,在还没有html5的时候,我们实现这个功能,通常会用大量的js代码,再利用mousemove,mouseup等鼠标事件来实现,总的来说比较麻 ...

  8. 在Blazor中实现拖放(drag and drop)

    前言 我在实现一个含有待办列表功能的页面时,发现了一个好看的设计,它将待办分为--"待办","正在进行",和"已完成"三种状态,并且将待办通 ...

  9. HTML5 拖放(Drag 和 Drop)功能开发——基础实战

    随着HTML5的普及度越来越高,现在写代码也遇到一些了,经过同事的点播开展了一次Dojo活动用以技术交流,我也乘此机会将HTML5的拖放功能整理了一下. 简介 拖拽(Drag/Drop)是个非常普遍的 ...

随机推荐

  1. 高德地图根据经纬度转换成地址JS代码demo

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  2. POJ 1759

    Garland Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1236   Accepted: 547 Descriptio ...

  3. 使用 Struts 2 开发 RESTful 服务

    REST 简介 REST 是英文 Representational State Transfer 的缩写,这个术语由 Roy Thomas Fielding 博士在他的论文<Architectu ...

  4. **RESTful API版本控制策略

    做RESTful开放平台,一方面其API变动越少, 对API调用者越有利:另一方面,没有人可以预测未来,系统在发展的过程中,不可避免的需要添加新的资源,或者修改现有资源.因此,改动升级必不可少,但是, ...

  5. POJ 2653 Pick-up sticks(线段相交)

    题目链接 题意 : 把每根棍往地上扔,找出最后在上面的棍,也就是说找出所有的没有别的棍子压在它的上面的棍子. 思路 : 对于每根棍子,压在他上面的棍子一定是在它之后扔的棍子,所以在找的时候只要找它之后 ...

  6. (转)STL中set的用法

    转载自here 1.关于set map容器是键-值对的集合,好比以人名为键的地址和电话号码.相反地,set容器只是单纯的键的集合.例如,某公司可能定义了一个名为bad_checks的set容器,用于记 ...

  7. 妙味课堂——HTML+CSS(第一课)

    一句话,还记忆不如烂笔头,何况还这么笨,记下笔记,也是记录这一路学习的过程. 妙味课堂第一课并未一味地先讲HTML,而是穿插着CSS讲解,这一点不同于一些其他视频,这一点挺特别的!所以这一课涉及到HT ...

  8. list, set操作

    def union_list(l1, l2): result = [] if not l1: result.extend(l2) return result if not l2: result.ext ...

  9. 第一个React程序HelloWorld

    一.程序步骤 1.用React.createClass生成组件 2.调用React.render把组件渲染到页面中,dom的操作由react自动完成 二.代码 <!DOCTYPE html> ...

  10. JLink v8克隆版破解向导(此方法仅适用XP32位版 WIN7及以上和64位均不支持 建议使用虚拟机)

    此方法仅适用XP32位版 WIN7及以上和64位均不支持 建议使用虚拟机 摘要 Jlink 4.5版本之后驱动会识别老的克隆版的JlinkV8,Jlink软件在启动时会提示为克隆版本后退出.目前主流的 ...