Android drag drop
最近偶尔知道了锤子的one step,所以在网上看相关的东西,有人说android原生drag drop就能实现,我就去学习一下这个drag drop,下面把学习到的东西总结一下:
drag drop 是需要两个或者两个以上的View 实现的。就是将一个View从某一个位置拖放到另一个位置,在拖放过程中必须有两个或两个以上的View参与,一个是被拖的View,另一个或多个是接收被拖View的View。这一过程可以将拖拽中携带的数据经行传递。下面一步步咱们来解说:
① 那个被拖拽的View,需要做的操作:
* 对用户操作经行响应:设置长点击事件(OnLongClickListener)或者点击事件(OnClickListener)
* 包装传递的数据(ClipData),如果不需要传递数据,开启时第一个参数为null 即可。
* 定义拖拽过程中的Shadow(View.DragShadowBuilder),可以使用系统默认的DragShadowBuilder
* 上述三步完成,第四步 Starts a drag and drop operation
(public final boolean startDrag (ClipData data, View.DragShadowBuilder shadowBuilder, Object myLocalState, int flags))
//长按点击事件
public boolean onLongClick(View v) {
// 创建一个ClipData对象
// 这里分为两步,第一步中方法ClipData.newPlainText()可以创建一个纯文本ClipData // 根据ImageView的标签创建一个ClipData.Item对象
ClipData.Item item = new ClipData.Item((CharSequence) v.getTag()); // 使用标签,纯文本和已经创建的item来创建一个ClipData对象
// 这里将在ClipData中创建一个新的ClipDescription对象并设置它的MIME类型为"text/plain"
ClipData dragData = new ClipData((CharSequence) v.getTag(),
new String[] { ClipDescription.MIMETYPE_TEXT_PLAIN }, item); // 实例化拖拽影子.
View.DragShadowBuilder myShadow = new MyDragShadowBuilder(imageView); // 开始拖拽 return v.startDrag(dragData, // 被拖拽的数据
myShadow, // 拖拽的影子
null, // 不需要使用本地数据
0 // 标记(目前用不到,设置为0)
);
}
自定义的DragShadowBuilder:
private static class MyDragShadowBuilder extends View.DragShadowBuilder {
// 拖动阴影的图像, 作为一个drawable来定义
private static Drawable shadow;
// 构造函数
public MyDragShadowBuilder(View v) {
// 通过myDragShadowBuilder存储View参数
super(v);
// 创建一个可拖拽的图像,此图像可以通过系统的Canvas来填充
shadow = new ColorDrawable(Color.LTGRAY);
}
// 定义一个回调方法,将阴影的维度和触摸点返回给系统
@Override
public void onProvideShadowMetrics(Point size, Point touch) {
// 定义当地的变量
int width;
int height;
// 设置阴影的宽度为视图一半
width = getView().getWidth() / 2;
// 设置阴影的高度为视图一半
height = getView().getHeight() / 2;
// 拖拽阴影是一个ColorDrawable. 这个集合的维度和系统所提供的Canvas是一样的
// 因此,拖拽阴影将会被Canvas覆盖
shadow.setBounds(0, 0, width, height);
// 设置参数宽度和高度的大小.通过大小参数返回给系统
size.set(width, height);
// 设置触摸点的位置为拖拽阴影的中心
touch.set(width / 2, height / 2);
}
// 在画布Canvas中定义一个回调函数来绘制拖拽的阴影,该画布是通过方法onProvideShadowMetrics()提供的维度
// 由系统构造
@Override
public void onDrawShadow(Canvas canvas) {
// 在由系统传递的Canvas上绘制ColorDrawable
shadow.draw(canvas);
}
}
② 要接受拖拽的View,需要的操作:
* 设置拖动事件监听器(OnDragListener)
注:这个要接受拖拽的View,可以通过设置拖动事件监听器来监听拖拽。如果它是自定义的View也可以重写View的onDragEvent()方法对拖拽进行监听。
自定义View实现onDragEvent方法:打印的log很明白告诉你,对应操作的含义:
public boolean onDragEvent(DragEvent event) {
boolean result = false;
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED: {
Log.i("mayingcai", "有View开始被拖动!");
/**
* 在拖动开始时,只有返回true,后面的动作(ACTION_DRAG_ENTERED, ACTION_DRAG_LOCATION, ACTION_DROP)才会被执行!
*/
result = true;
break;
}
case DragEvent.ACTION_DRAG_ENTERED: {
Log.i("mayingcai", "被拖动的View进入当前View!");
break;
}
case DragEvent.ACTION_DRAG_LOCATION: {
Log.i("mayingcai", "被拖动的View进入当前View后,位置发生改变!");
break;
}
case DragEvent.ACTION_DROP: {
Log.i("mayingcai", "拖动的View被放入当前View!");
/**
* 在放时交互两个View的背景。
*/
View mDragView = (View) event.getLocalState();
Drawable mDragViewBackgroud = mDragView.getBackground();
mDragView.setBackgroundDrawable(this.getBackground());
this.setBackgroundDrawable(mDragViewBackgroud);
break;
}
case DragEvent.ACTION_DRAG_ENDED: {
Log.i("mayingcai", "拖动结束!");
break;
}
case DragEvent.ACTION_DRAG_EXITED: {
Log.i("mayingcai", "拖动退出!");
break;
}
default: {
break;
}
}
return result;
}
在开始拖动某一个View时屏幕中所有View的DragEvent.ACTION_DRAG_STARTED事件被触发。当拖拽的View进入对应的View时,会触发DragEvent.ACTION_DRAG_ENTERED,DragEvent.ACTION_DRAG_LOCATION等事件。松开鼠标或者放手后(Drop操作),这时会触发绿色View的DragEvent.ACTION_DROP,DragEvent.ACTION_DRAG_ENDED等事件
注意一下:onLongClick()方法的返回值 和 onDragEvent的返回值
参考文章:
http://blog.csdn.net/mayingcai1987/article/details/6221988
http://blog.csdn.net/zd_1471278687/article/details/20376377
Android drag drop的更多相关文章
- Android -- Drag&&Drop
Android3.0提供了drag/drop框架,利用此框架可以实现使用拖放手势将一个view拖放到当前布局中的另外一个view中. 实现拖放的步骤 首先,我们先了解一下拖放过程,从官方文档可以知道, ...
- Android开发之Drag&Drop框架实现拖放手势
Android3.0提供了drag/drop框架,利用此框架可以实现使用拖放手势将一个view拖放到当前布局中的另外一个view中.本文将介绍如何使用拖放框架. 一.实现拖放的步骤 首先,我们先了解一 ...
- android drag
1.Android:Drag and Drop的应用 2.Android 用户界面---拖放(Drag and Drop)(三) 3.Android 用户界面---拖放(Drag and Drop)( ...
- HTML 学习笔记 (drag & drop)
拖放(Drag & Drop)是一种常见的特性,即抓取对象以后拖到另一个位置.在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放.过去,我们用监听鼠标的Mousedown.Mouseo ...
- HTML5魔法堂:全面理解Drag & Drop API
一.前言 在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5的DnD API觉得那些痛苦的日子将一去不复返,但事实又是怎样的呢?下面我们一起来看看DnD API的真面 ...
- Win10/UWP新特性—Drag&Drop 拖出元素到其他App
在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...
- Draggabilly – 轻松实现拖放功能(Drag & Drop)
Draggabilly 是一个很小的 JavaScript 库,专注于拖放功能.只需要简单的设置参数就可以在你的网站用添加拖放功能.兼容 IE8+ 浏览器,支持多点触摸.可以灵活绑定事件,支持 Req ...
- JS魔法堂:IE5~9的Drag&Drop API
一.前言 < HTML5魔法堂:全面理解Drag & Drop API>中提到从IE5开始已经支持DnD API,但IE5~9与HTML5的API有所不同,下面我们来了解一 ...
- 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop
[源码下载] 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop 作者:weba ...
随机推荐
- EDK II之USB设备驱动程序的加载与运行
本文简单介绍一下USB设备的驱动程序是如何匹配设备以及被加载的: 上文(UDK中USB总线驱动的实现框架)提到USB总线枚举设备的最后一步是调用gBS->ConnectController()去 ...
- PyQt5-多窗口数据传输
#窗口之间数据传递(通过属性方式) from PyQt5.QtWidgets import QDialogButtonBox, QDateTimeEdit,QDialog,QComboBox,QTab ...
- eclipse maven jar工程导出项目依赖的jar包
今天遇到个事,给业务开发/测试搞个了转换工具,是使用swing写的,依赖了很多的三方包,为了方便打算以bat方式提供,但是要导出依赖的三方jar,网上搜了下,如下(已测试): 一.导出到默认目录 ta ...
- Java中单例设计模式,饿汉式和懒汉式
Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...
- python --- 13 内置函数
内置函数 思维导图 1.作用域相关 locals() 返回当前作用域中的名字 globals() 返回全局作用域中的名字 2.迭代器相关 range() 生成数据 next() ...
- Eclipse关联Github
摘自:http://jingyan.baidu.com/article/64d05a0262f013de55f73bcc.html 检查Eclipse中是否已安装Git插件,菜单栏Help -> ...
- 关于BOARD_SYSTEMIMAGE_PARTITION_SIZE【转】
本文转载自:https://blog.csdn.net/ttxgz/article/details/7542380 1. 系统需要,把需要预置在系统的所有apk放在目录 device/softwinn ...
- 4. 多重背包问题 I
多重背包问题 I 描述 有 NN 种物品和一个容量是 VV 的背包. 第 ii 种物品最多有 sisi 件,每件体积是 vivi,价值是 wiwi. 求解将哪些物品装入背包,可使物品体积总和不超过背包 ...
- Asp.net MVC 控制器ActionResult的例子
ActionResult 父类型 ViewResult View() 多重载应用 PartialViewResult PartialView() 部分试图 New EmptyResult() 空 如 ...
- Paper Reading: In Defense of the Triplet Loss for Person Re-Identification
In Defense of the Triplet Loss for Person Re-Identification 2017-07-02 14:04:20 This blog comes ...