最近看了下Drag and Drop部分的原文,觉得很有意思就像自己试着做一下,说实在的原文真的是不好读啊,要感谢那些为我们发表译文的大神们,

真的是不容易,原文中给了例子,但是只有后面零星的代码,真的是不知道怎么用,索性就搜了下原文翻译,顺便看看有没有人实现出一个例子什

么的,只可惜译文多得很就是没人做出一个可以参照的例子,无奈自己就根据文章意思改了改代码,终于是能用了,但是不知道用的对不对,在这

分享一下,也想看看有没有懂的大神给指点指点。

我的理解就是有一个图片通过监听长期的点击事件得到一个拖拽阴影(也不知道是不是这么叫的),将其拖动到指定的区域,然后在区域里加

监听来判断拖拽的位置是否在区域内,然后在判断释放的位置来断定是否接收到传过来的指定信息。

下面上主代码,MainActivity.java

  1. import android.annotation.SuppressLint;
  2. import android.app.Activity;
  3. import android.content.ClipData;
  4. import android.content.ClipDescription;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Point;
  8. import android.graphics.drawable.ColorDrawable;
  9. import android.graphics.drawable.Drawable;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.view.DragEvent;
  13. import android.view.View;
  14. import android.view.View.OnDragListener;
  15. import android.view.View.OnLongClickListener;
  16. import android.widget.ImageView;
  17. import android.widget.TextView;
  18. import android.widget.Toast;
  19. public class MainActivity extends Activity {
  20. /**
  21. * 为ImageView创建一个字符标签
  22. */
  23. private static final String IMAGEVIEW_TAG = "icon bitmap";
  24. /**
  25. * 创建用于拖动的ImageView
  26. */
  27. private ImageView imageView;
  28. /**
  29. * 拖动事件监听
  30. */
  31. private myDragEventListener mDragListen;
  32. /**
  33. * 拖动ImageView的长按事件监听
  34. */
  35. private OnLongClickListener mLongClick = new OnLongClickListener() {
  36. @SuppressLint("NewApi")
  37. @Override
  38. public boolean onLongClick(View v) {
  39. // 创建一个ClipData对象
  40. // 这里分为两步,第一步中方法ClipData.newPlainText()可以创建一个纯文本ClipData
  41. // 根据ImageView的标签创建一个ClipData.Item对象
  42. ClipData.Item item = new ClipData.Item((CharSequence) v.getTag());
  43. // 使用标签,纯文本和已经创建的item来创建一个ClipData对象
  44. // 这里将在ClipData中创建一个新的ClipDescription对象并设置它的MIME类型为"text/plain"
  45. ClipData dragData = new ClipData((CharSequence) v.getTag(),
  46. new String[] { ClipDescription.MIMETYPE_TEXT_PLAIN }, item);
  47. // 实例化拖拽影子.
  48. View.DragShadowBuilder myShadow = new MyDragShadowBuilder(imageView);
  49. // 开始拖拽
  50. return v.startDrag(dragData, // 被拖拽的数据
  51. myShadow, // 拖拽的影子
  52. null, // 不需要使用本地数据
  53. 0 // 标记(目前用不到,设置为0)
  54. );
  55. }
  56. };
  57. @Override
  58. protected void onCreate(Bundle savedInstanceState) {
  59. super.onCreate(savedInstanceState);
  60. setContentView(R.layout.activity_main);
  61. init();
  62. }
  63. /**
  64. * 功能描述: 初始化<br>
  65. */
  66. public void init() {
  67. imageView = new ImageView(this);
  68. imageView = (ImageView) findViewById(R.id.drag_image);
  69. // 设置标签
  70. imageView.setTag(IMAGEVIEW_TAG);
  71. //添加长按事件
  72. imageView.setOnLongClickListener(mLongClick);
  73. // 创建一个拖拽的事件监听器
  74. mDragListen = new myDragEventListener();
  75. // 拖拽反应区域
  76. View view = findViewById(R.id.drag_room);
  77. // 为该区域添加拖动事件监听器
  78. view.setOnDragListener(mDragListen);
  79. }
  80. /**
  81. * 〈拖动阴影〉<br>
  82. */
  83. @SuppressLint("NewApi")
  84. private static class MyDragShadowBuilder extends View.DragShadowBuilder {
  85. // 拖动阴影的图像, 作为一个drawable来定义
  86. private static Drawable shadow;
  87. // 构造函数
  88. public MyDragShadowBuilder(View v) {
  89. // 通过myDragShadowBuilder存储View参数
  90. super(v);
  91. // 创建一个可拖拽的图像,此图像可以通过系统的Canvas来填充
  92. shadow = new ColorDrawable(Color.LTGRAY);
  93. }
  94. // 定义一个回调方法,将阴影的维度和触摸点返回给系统
  95. @Override
  96. public void onProvideShadowMetrics(Point size, Point touch) {
  97. // 定义当地的变量
  98. int width;
  99. int height;
  100. // 设置阴影的宽度为视图一半
  101. width = getView().getWidth() / 2;
  102. // 设置阴影的高度为视图一半
  103. height = getView().getHeight() / 2;
  104. // 拖拽阴影是一个ColorDrawable. 这个集合的维度和系统所提供的Canvas是一样的
  105. // 因此,拖拽阴影将会被Canvas覆盖
  106. shadow.setBounds(0, 0, width, height);
  107. // 设置参数宽度和高度的大小.通过大小参数返回给系统
  108. size.set(width, height);
  109. // 设置触摸点的位置为拖拽阴影的中心
  110. touch.set(width / 2, height / 2);
  111. }
  112. // 在画布Canvas中定义一个回调函数来绘制拖拽的阴影,该画布是通过方法onProvideShadowMetrics()提供的维度
  113. // 由系统构造
  114. @Override
  115. public void onDrawShadow(Canvas canvas) {
  116. // 在由系统传递的Canvas上绘制ColorDrawable
  117. shadow.draw(canvas);
  118. }
  119. }
  120. @SuppressLint("NewApi")
  121. protected class myDragEventListener implements OnDragListener {
  122. // 该方法由系统调用,当有拖拽事件发生时
  123. @SuppressLint("ShowToast")
  124. public boolean onDrag(View v, DragEvent event) {
  125. // 定义一个变量来存储通过事件传递的action类型
  126. final int action = event.getAction();
  127. // 每个事件的处理
  128. switch (action) {
  129. case DragEvent.ACTION_DRAG_STARTED:
  130. System.out.println("ACTION_DRAG_STARTED----------------");
  131. // 确定是否这个视图(View)可以接收拖拽的数据类型
  132. if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
  133. // 这里是一个例子,通过更改TextView的背景颜色和文字
  134. // 来证明它可以接收数据
  135. v.setBackgroundColor(Color.BLUE);
  136. ((TextView) v).setText("drag");
  137. // 强制重绘视图以显示新的特性
  138. v.invalidate();
  139. // 通过返回true来表明View可以接收拖拽数据
  140. return (true);
  141. } else {
  142. // 返回false. 在当前是拖拽和落下操作时,视图(View)将不再接收
  143. // 事件直到发送ACTION_DRAG_ENDED
  144. return (false);
  145. }
  146. case DragEvent.ACTION_DRAG_ENTERED:
  147. System.out.println("ACTION_DRAG_ENTERED----------------");
  148. // 拖拽的阴影已经到达指定的区域,TextView背景变为绿色,返回true,该返回值没有意义
  149. v.setBackgroundColor(Color.GREEN);
  150. ((TextView) v).setText("in");
  151. // 强制重绘视图以显示新的特性
  152. v.invalidate();
  153. return (true);
  154. case DragEvent.ACTION_DRAG_LOCATION:
  155. // 忽略该事件
  156. return (true);
  157. case DragEvent.ACTION_DRAG_EXITED:
  158. System.out.println("ACTION_DRAG_EXITED----------------");
  159. // 拖拽阴影超出制定区域,重置TextView背景色为蓝色
  160. v.setBackgroundColor(Color.BLUE);
  161. ((TextView) v).setText("drag");
  162. // 强制重绘视图以显示新的特性
  163. v.invalidate();
  164. return (true);
  165. case DragEvent.ACTION_DROP:
  166. System.out.println("ACTION_DROP----------------");
  167. // 获得item包括拖拽数据
  168. ClipData.Item item = event.getClipData().getItemAt(0);
  169. // 从item获得文本数据
  170. CharSequence dragData = item.getText();
  171. // 显示拖拽数据中包含的信息.
  172. Toast.makeText(MainActivity.this, "Dragged data is: " + dragData, Toast.LENGTH_SHORT).show();
  173. // 重新设置颜色和文字
  174. v.setBackgroundColor(Color.WHITE);
  175. ((TextView) v).setText("get");
  176. // 强制重绘视图以显示新的特性
  177. v.invalidate();
  178. // 返回true. DragEvent.getResult()将会返回true.
  179. return (true);
  180. case DragEvent.ACTION_DRAG_ENDED:
  181. System.out.println("ACTION_DRAG_ENDED----------------");
  182. // 重新设置颜色和文字
  183. v.setBackgroundColor(Color.WHITE);
  184. ((TextView) v).setText("room");
  185. // 强制重绘视图以显示新的特性
  186. v.invalidate();
  187. //通过getResult()方法的返回值判断发生了什么
  188. if (event.getResult()) {
  189. Toast.makeText(MainActivity.this, "The drop was handled.", Toast.LENGTH_LONG).show();
  190. } else {
  191. Toast.makeText(MainActivity.this, "The drop didn't work.", Toast.LENGTH_LONG).show();
  192. };
  193. return (true);
  194. // 其他未知的action.
  195. default:
  196. Log.e("DragDrop Example", "Unknown action type received by OnDragListener.");
  197. break;
  198. }
  199. ;
  200. return true;
  201. };
  202. }
  203. }
 

这里就是通过长按ImageView将其拖动到一个TextView的区域里来改变TextView的状态,并显示接收到的数据

布局文件就很简单了 activity_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent" >
  4. <TextView
  5. android:id="@+id/drag_room"
  6. android:layout_width="150dip"
  7. android:layout_height="150dip"
  8. android:gravity="center"
  9. android:layout_centerInParent="true"
  10. android:text="room"
  11. android:textSize="18dp"/>
  12. <ImageView
  13. android:id="@+id/drag_image"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_above="@id/drag_room"
  17. android:src="@drawable/move" />
  18. </RelativeLayout>

基本就是这些,也不知道做的对不对,有懂的给提提吧

为了方便附上原代码,里面还有个拖动图片的例子

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android:Drag and Drop的应用的更多相关文章

  1. android drag

    1.Android:Drag and Drop的应用 2.Android 用户界面---拖放(Drag and Drop)(三) 3.Android 用户界面---拖放(Drag and Drop)( ...

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

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

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

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

  4. Android 用户界面---拖放(Drag and Drop)(一)

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

  5. Android drag drop

    最近偶尔知道了锤子的one step,所以在网上看相关的东西,有人说android原生drag drop就能实现,我就去学习一下这个drag drop,下面把学习到的东西总结一下: drag drop ...

  6. HTML5 之拖放(drag与drop)

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

  7. 通过HTML5的Drag and Drop生成拓扑图片Base64信息

    HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...

  8. 基于HTML5的Drag and Drop生成图片Base64信息

    HTML5的Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过Drag ...

  9. 20 Best Drag and Drop jQuery Plugins--reference

    reference from:http://dizyne.net/20-best-drag-drop-jquery-plugins/ jQuery has done a great job repla ...

随机推荐

  1. 基于visual Studio2013解决算法导论之052深度优先

     题目 深度优先 解决代码及点评 // 深度优先.cpp : 定义控制台应用程序的入口点. // // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include < ...

  2. Hdu 1079 Calendar Game

    Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1079 一道博弈题.刚开始想用判断P点和N点的方法来打表,但无奈不知是哪里出错,总是WA.于是 ...

  3. 获取java byte的无符号数值

    byte a = (byte)234; System.out.println(a); 上面的代码,结果是-22,因为java中byte是有符号的,byte范围是-128~127. 如果想输出234,该 ...

  4. W5100使用中的常见问题

    来自:成都浩然 越来越多的嵌入式网络系统project师喜欢上了W5100,它集TCP/IP协议栈.以太网的MAC和PHY一体,不仅使系统性能得到非常大的提升,也给产品开发工作带来极大的方便.随着W5 ...

  5. python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数

    上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...

  6. 分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map

    原文:分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map import java.util.Map; import org.apache.commons.lang.Ar ...

  7. U盘安装centos 7 提示 “Warning: /dev/root does not exist, could not boot” 解决办法

    1.查询磁盘 cd /dev ls 2.查询结果 sda 是我的硬盘对应的文件名(我机子只有一块硬盘),所以sda4就是U盘对应的文件名了,可以看到是sda4.至此我们重启一下,回到第一个图片所示的界 ...

  8. 相邻数字的基数等比确定进制问题pojg2972

    解决数制转换问题时,如果所给的数值不是用十进制表示的,一般用一个字符型数组来存放,数组的每个元素分别存储它的一位数字.然后按位转换求和,得到十进制表示,再把十进制转成成其他所求的进制表示.转成的结果也 ...

  9. 清华集训2014 day1 task1 玛里苟斯

    题目 这可算是描述很简单的一道题了!但是不简单. \(S\)是一个可重集合,\(S = \{a_1, a_2, \dots, a_n \}\). 等概率随机取\(S\)的一个子集\(A = \{a_{ ...

  10. SQL 多个表之间联合查询

    非常少用join,这次学学,并备忘两篇文章! 转自:http://hcx-2008.javaeye.com/blog/285661 连接查询 通过连接运算符能够实现多个表查询.连接是关系数据库模型的主 ...