Android:Drag and Drop的应用
最近看了下Drag and Drop部分的原文,觉得很有意思就像自己试着做一下,说实在的原文真的是不好读啊,要感谢那些为我们发表译文的大神们,
真的是不容易,原文中给了例子,但是只有后面零星的代码,真的是不知道怎么用,索性就搜了下原文翻译,顺便看看有没有人实现出一个例子什
么的,只可惜译文多得很就是没人做出一个可以参照的例子,无奈自己就根据文章意思改了改代码,终于是能用了,但是不知道用的对不对,在这
分享一下,也想看看有没有懂的大神给指点指点。
我的理解就是有一个图片通过监听长期的点击事件得到一个拖拽阴影(也不知道是不是这么叫的),将其拖动到指定的区域,然后在区域里加
监听来判断拖拽的位置是否在区域内,然后在判断释放的位置来断定是否接收到传过来的指定信息。
下面上主代码,MainActivity.java
- import android.annotation.SuppressLint;
- import android.app.Activity;
- import android.content.ClipData;
- import android.content.ClipDescription;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Point;
- import android.graphics.drawable.ColorDrawable;
- import android.graphics.drawable.Drawable;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.DragEvent;
- import android.view.View;
- import android.view.View.OnDragListener;
- import android.view.View.OnLongClickListener;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- /**
- * 为ImageView创建一个字符标签
- */
- private static final String IMAGEVIEW_TAG = "icon bitmap";
- /**
- * 创建用于拖动的ImageView
- */
- private ImageView imageView;
- /**
- * 拖动事件监听
- */
- private myDragEventListener mDragListen;
- /**
- * 拖动ImageView的长按事件监听
- */
- private OnLongClickListener mLongClick = new OnLongClickListener() {
- @SuppressLint("NewApi")
- @Override
- 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)
- );
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- init();
- }
- /**
- * 功能描述: 初始化<br>
- */
- public void init() {
- imageView = new ImageView(this);
- imageView = (ImageView) findViewById(R.id.drag_image);
- // 设置标签
- imageView.setTag(IMAGEVIEW_TAG);
- //添加长按事件
- imageView.setOnLongClickListener(mLongClick);
- // 创建一个拖拽的事件监听器
- mDragListen = new myDragEventListener();
- // 拖拽反应区域
- View view = findViewById(R.id.drag_room);
- // 为该区域添加拖动事件监听器
- view.setOnDragListener(mDragListen);
- }
- /**
- * 〈拖动阴影〉<br>
- */
- @SuppressLint("NewApi")
- 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);
- }
- }
- @SuppressLint("NewApi")
- protected class myDragEventListener implements OnDragListener {
- // 该方法由系统调用,当有拖拽事件发生时
- @SuppressLint("ShowToast")
- public boolean onDrag(View v, DragEvent event) {
- // 定义一个变量来存储通过事件传递的action类型
- final int action = event.getAction();
- // 每个事件的处理
- switch (action) {
- case DragEvent.ACTION_DRAG_STARTED:
- System.out.println("ACTION_DRAG_STARTED----------------");
- // 确定是否这个视图(View)可以接收拖拽的数据类型
- if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
- // 这里是一个例子,通过更改TextView的背景颜色和文字
- // 来证明它可以接收数据
- v.setBackgroundColor(Color.BLUE);
- ((TextView) v).setText("drag");
- // 强制重绘视图以显示新的特性
- v.invalidate();
- // 通过返回true来表明View可以接收拖拽数据
- return (true);
- } else {
- // 返回false. 在当前是拖拽和落下操作时,视图(View)将不再接收
- // 事件直到发送ACTION_DRAG_ENDED
- return (false);
- }
- case DragEvent.ACTION_DRAG_ENTERED:
- System.out.println("ACTION_DRAG_ENTERED----------------");
- // 拖拽的阴影已经到达指定的区域,TextView背景变为绿色,返回true,该返回值没有意义
- v.setBackgroundColor(Color.GREEN);
- ((TextView) v).setText("in");
- // 强制重绘视图以显示新的特性
- v.invalidate();
- return (true);
- case DragEvent.ACTION_DRAG_LOCATION:
- // 忽略该事件
- return (true);
- case DragEvent.ACTION_DRAG_EXITED:
- System.out.println("ACTION_DRAG_EXITED----------------");
- // 拖拽阴影超出制定区域,重置TextView背景色为蓝色
- v.setBackgroundColor(Color.BLUE);
- ((TextView) v).setText("drag");
- // 强制重绘视图以显示新的特性
- v.invalidate();
- return (true);
- case DragEvent.ACTION_DROP:
- System.out.println("ACTION_DROP----------------");
- // 获得item包括拖拽数据
- ClipData.Item item = event.getClipData().getItemAt(0);
- // 从item获得文本数据
- CharSequence dragData = item.getText();
- // 显示拖拽数据中包含的信息.
- Toast.makeText(MainActivity.this, "Dragged data is: " + dragData, Toast.LENGTH_SHORT).show();
- // 重新设置颜色和文字
- v.setBackgroundColor(Color.WHITE);
- ((TextView) v).setText("get");
- // 强制重绘视图以显示新的特性
- v.invalidate();
- // 返回true. DragEvent.getResult()将会返回true.
- return (true);
- case DragEvent.ACTION_DRAG_ENDED:
- System.out.println("ACTION_DRAG_ENDED----------------");
- // 重新设置颜色和文字
- v.setBackgroundColor(Color.WHITE);
- ((TextView) v).setText("room");
- // 强制重绘视图以显示新的特性
- v.invalidate();
- //通过getResult()方法的返回值判断发生了什么
- if (event.getResult()) {
- Toast.makeText(MainActivity.this, "The drop was handled.", Toast.LENGTH_LONG).show();
- } else {
- Toast.makeText(MainActivity.this, "The drop didn't work.", Toast.LENGTH_LONG).show();
- };
- return (true);
- // 其他未知的action.
- default:
- Log.e("DragDrop Example", "Unknown action type received by OnDragListener.");
- break;
- }
- ;
- return true;
- };
- }
- }
这里就是通过长按ImageView将其拖动到一个TextView的区域里来改变TextView的状态,并显示接收到的数据
布局文件就很简单了 activity_main.xml
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- <TextView
- android:id="@+id/drag_room"
- android:layout_width="150dip"
- android:layout_height="150dip"
- android:gravity="center"
- android:layout_centerInParent="true"
- android:text="room"
- android:textSize="18dp"/>
- <ImageView
- android:id="@+id/drag_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_above="@id/drag_room"
- android:src="@drawable/move" />
- </RelativeLayout>
基本就是这些,也不知道做的对不对,有懂的给提提吧
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android:Drag and Drop的应用的更多相关文章
- android drag
1.Android:Drag and Drop的应用 2.Android 用户界面---拖放(Drag and Drop)(三) 3.Android 用户界面---拖放(Drag and Drop)( ...
- Android 用户界面---拖放(Drag and Drop)(三)
设计拖放操作 本节主要内容如下: 1. 如何开始拖拽: 2. 在拖拽期间如何响应事件: 3. 如何响应落下事件: 4. 如何结束拖放操作. 开始拖拽 用户使用一个拖拽手势开始拖拽,通常是在 ...
- Android 用户界面---拖放(Drag and Drop)(二)
拖拽事件监听器和回调方法 View对象既可以用实现View.OnDragListener接口的拖放事件监听器,也可以用View对象的onDragEvent(DragEvent)回调方法来接收拖拽事 ...
- Android 用户界面---拖放(Drag and Drop)(一)
用Android的拖放框架,能够允许用户使用图形化的拖放手势,把数据从当前布局中的一个View对象中移到另一个View对象中.这个框架包括:拖拽事件类.拖拽监听器.以及辅助的方法和类. 尽管这个框架主 ...
- Android drag drop
最近偶尔知道了锤子的one step,所以在网上看相关的东西,有人说android原生drag drop就能实现,我就去学习一下这个drag drop,下面把学习到的东西总结一下: drag drop ...
- HTML5 之拖放(drag与drop)
拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖放实例 ...
- 通过HTML5的Drag and Drop生成拓扑图片Base64信息
HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...
- 基于HTML5的Drag and Drop生成图片Base64信息
HTML5的Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过Drag ...
- 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 ...
随机推荐
- php三元运算
$a = 2; $a == 1 ? $test="企业" : ($a==2 ? $test="地区" : $test="其他地方"); ec ...
- 17.1.1 How to Set Up Replication
17.1.1 How to Set Up Replication 17.1.1.1 Setting the Replication Master Configuration 17.1.1.2 Sett ...
- 【LeetCode】Repeated DNA Sequences 解题报告
[题目] All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: &quo ...
- Amazon的AWS账单看起来不是很方便
发了一个PDF格式的收据,只写了收取的费用,EC2下面的明细没有. DetailAmazon Simple Notification Service $0.00Charges $0.00Estimat ...
- C++的运算符
C++的运算符十分丰富,使得C++的运算十分灵活方便.例如把赋值号(=)也作为运算符处理,这样,a=b=c=4就是合法的表达式,这是与其他语言不同的.C++提供了以下运算符: 算术运算符+(加) - ...
- 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)
原文:分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要) XML文件 <?xml version="1.0"?> <student ...
- POJ 3986 Math teacher's homework
题目 给出\(n,m_1,m_2,...,m_n\),求\(x_1 xor x_2 xor ... xor x_n=k (0 \leq x_i \leq m_i)\)的解的数量.二进制位数小于\(32 ...
- Esper学习之五:EPL语法(一)
上篇说到了Esper的Context,要是不了解的同学请参看<Esper学习之四:Context>,看过的同学如果还是不理解的话可以给我评论,我将会尽可能的解答.之前有些同学问我Conte ...
- 数据交换工具Kettle
网上搜集了一些关于开源数据交换工具Kattle的文章,特收藏例如以下: 文章一:ETL和Kettle简单介绍 ETL即数据抽取(Extract).转换(Transform).装载(Load)的过程.它 ...
- longest incresing sequence
动态规划基本题目,longest incresing sequence,找出序列中的最长递增子序列: 例如给出序列{8,3,5,2,4,9,7,11}, 其中最长递增子序列为{3,5,9,11}或{3 ...