最近看了下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. KINGSO介绍

    kingso_intro - Taocode KINGSO介绍 KINGSO是一种高效的垂直化的搜索引擎,其包含query解析.检索.过滤.统计.排序功能,不包含抓取部分.它对商品搜索做了针对性的优化 ...

  2. c# 课堂总结7--函数

    函数:数据类型-变量类型-运算符号表达式-语句(顺序,分支,循环)-数字 程序里的函数:能完成一个相对独立功能的代码块.数学里的函数:高度抽象.函数四要素:函数名,输入(参数),输出(返回值类型),加 ...

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

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

  4. windows安装Apache,注册服务出现“(OS 5)拒绝访问。 : AH00369: Failed to open the WinNT service manager..."错误

    原文:http://blog.csdn.net/jaray/article/details/9950211 在安装Apache的时候,我下载的是zip格式,不是msi安装版,需要自己注册服务,才能在桌 ...

  5. android开发隐藏了actionbar仍然短暂闪现的解决方法

    有时候我们在代码里隐藏了actionbar,在打开应用时,仍然短暂闪现下actionbar,用户体验很不好.   最简单的方法是 在AndroidManifest.xml中设置主题中配置不显示titl ...

  6. HDU1058 Humble Numbers 【数论】

    Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  7. Android XML解析器的问题

    最近在项目中遇到了一个解析XML的问题,我们是用android自带的DOM解析器来解析XML的,但发现了一个android的问题,那就是在2.3的SDK上面,无法解析像<, >, 等字符串 ...

  8. c++, class的大小

    不为类.对象的函数分配空间: 在类中如果有virtual声明的虚函数,则会隐藏一个指针,该指针指向虚函数表,这对于纯虚函数也是一样: 对于虚继承,还有一个指向父类的指针,该指针为指向虚基类的指针(Po ...

  9. 先有Delphi内存对象,后有句柄(如果需要的话),最后再显示

    在设计期放上一个Panel1和Button1,然后设置Panel1.Visible:=False 这时候执行: procedure TForm1.Button4Click(Sender: TObjec ...

  10. PHP学习之-1.5 字符串

    字符串 一个字符串是用双引号扩起来的一个词或者一个句子,比如 "Hello Word" ,你可以使用PHP语言输入这个字符串,像这样 <?php echo "Hel ...