android交互功能,Android 用户界面交互---拖放(OnDragListener)

设计拖放操作

本节主要内容如下:

1.  如何开始拖拽;

2.  在拖拽期间如何响应事件;

3.  如何响应落下事件;

4.  如何结束拖放操作。

开始拖拽

用户使用一个拖拽手势开始拖拽,通常是在View对象上长按。在响应中,应该做下列事情:

1.  必要时,给要移动的数据创建一个ClipData和ClipData.Item对象,作为ClipData对象的一部分,在ClipData对象内部的ClipDescription对象中保存了元数据。因为拖放操作不代表数据的移动,因此可以使用null来代替实际的对象。

例如,以下代码段显示了如何在ImageView对象的长按事件上创建一个包含ImageView对象标签的ClipData对象。// Create a string for the ImageView label

private static final String IMAGEVIEW_TAG = "icon bitmap"

// Creates a new ImageView

ImageView imageView = new ImageView(this);

// Sets the bitmap for the ImageView from an icon bit map (defined elsewhere)

imageView.setImageBitmap(mIconBitmap);

// Sets the tag

imageView.setTag(IMAGEVIEW_TAG);

...

// Sets a long click listener for the ImageView using an anonymous listener object that

// implements the OnLongClickListener interface

imageView.setOnLongClickListener(new View.OnLongClickListener() {

// Defines the one method for the interface, which is called when the View is long-clicked

public boolean onLongClick(View v) {

// Create a new ClipData.

// This is done in two steps to provide clarity. The convenience method

// ClipData.newPlainText() can create a plain text ClipData in one step.

// Create a new ClipData.Item from the ImageView object's tag

ClipData.Item item = new ClipData.Item(v.getTag());

// Create a new ClipData using the tag as a label, the plain text MIME type, and

// the already-created item. This will create a new ClipDescription object within the

// ClipData, and set its MIME type entry to "text/plain"

ClipData dragData = new ClipData(v.getTag(),ClipData.MIMETYPE_TEXT_PLAIN,item);

// Instantiates the drag shadow builder.

View.DragShadowBuilder myShadow = new MyDragShadowBuilder(imageView);

// Starts the drag

v.startDrag(dragData,  // the data to be dragged

myShadow,  // the drag shadow builder

null,      // no need to use local data

0          // flags (not currently used, set to 0)

);

}

}

2. 以下代码段定义了一个myDragShadowBuilder类,它创建一个用于拖拽TextView对象的小的灰色的矩形作为拖拽影子:private static class MyDragShadowBuilder extends View.DragShadowBuilder {

// The drag shadow image, defined as a drawable thing

private static Drawable shadow;

// Defines the constructor for myDragShadowBuilder

public MyDragShadowBuilder(View v) {

// Stores the View parameter passed to myDragShadowBuilder.

super(v);

// Creates a draggable image that will fill the Canvas provided by the system.

shadow = new ColorDrawable(Color.LTGRAY);

}

// Defines a callback that sends the drag shadow dimensions and touch point back to the

// system.

@Override

public void onProvideShadowMetrics (Point size, Point touch)

// Defines local variables

private int width, height;

// Sets the width of the shadow to half the width of the original View

width = getView().getWidth() / 2;

// Sets the height of the shadow to half the height of the original View

height = getView().getHeight() / 2;

// The drag shadow is a ColorDrawable. This sets its dimensions to be the same as the

// Canvas that the system will provide. As a result, the drag shadow will fill the

// Canvas.

shadow.setBounds(0, 0, width, height);

// Sets the size parameter's width and height values. These get back to the system

// through the size parameter.

size.set(width, height);

// Sets the touch point's position to be in the middle of the drag shadow

touch.set(width / 2, height / 2);

}

// Defines a callback that draws the drag shadow in a Canvas that the system constructs

// from the dimensions passed in onProvideShadowMetrics().

@Override

public void onDrawShadow(Canvas canvas) {

// Draws the ColorDrawable in the Canvas passed in from the system.

shadow.draw(canvas);

}

}

注意:不必扩展View.DragShadowBuilder类,因为构造器View.DragShadowBuilder(View)会创建一个默认的跟传递给它的View对象相同尺寸的拖拽影子,而且触点在拖拽影子的中心。

对拖拽开始的响应

在拖拽操作期间,系统会分发拖拽事件给当前布局中View对象的拖拽事件监听器。监听器应该通过调用getAction()方法对获得的操作类型做出反应。在拖拽开始时,这个方法返回ACTION_DRAG_STARTED.

在对ACTION_DRAG_STARTED操作类型做出的响应中,监听器应该做下列事情:

1.  调用getClipDescription()方法来获得ClipDescription对象,使用ClipDescription对象中的MIME类型方法来判断监听器是否能够接收被拖拽的数据。

如果拖拽操作不代表要移动的数据,这个判断就不是必须的了。

2.  如果监听器能够接受落下事件,它应该返回true。这样就告诉系统可以继续给这个监听器发送拖拽事件。如果不能够接收落下事件,它应该返回false,系统就不再会给这个监听器发送拖拽事件了。

要注意的是针对ACTION_DRAG_STARTED事件,下列DragEvent对象方法不能获取有效的数据:getClipData()、getX()、getY()和getResult()。

在拖拽期间处理事件

在拖拽期间,在响应ACTION_DARG_STARTED拖拽事件中返回true的监听器会继续接收拖拽事件。这种类型的拖拽监听器会依赖拖拽期间拖拽影子的位置和监听器的View对象的可见性来接收拖拽事件。

在拖拽期间,监听器主要使用拖拽事件来判断是否应该改变View对象的外观。

拖拽期间,getAction方法会返回下列三个值之一:

1. ACTION_DRAG_ENTERED:当触点(触屏上手指下方的点)进入监听器View对象的边框时,View对象的拖拽监听器就会收到这个事件。

2. ACTION_DRAG_LOCATION:一旦拖拽监听器收到一个ACTION_DRAG_ENTERED事件,并且在收到ACTION_DRAG_EXITED事件之前,每次移动触点时都会收到一个新的ACTION_DRAG_LOCATION事件。getX和getY()方法会返回触点的X和Y轴坐标。

3. ACTION_DRAG_EXITED:在拖拽影子离开监听器View对象的边框之后,这个事件会发送给之前收到ACTION_DRAG_ENTERED事件的那个监听器。

监听器不需要对这些操作类型都做出反应,如果监听器给系统返回了一个值,它就会被忽略。以下是响应这些操作类型的一些指南:

1.  在对ACTION_DRAG_ENTERED或ACTION_DRAG_LOCATION事件的响应中,监听器能够改变View对象的外观来指示View对象能够接受放下事件。

2. ACTION_DRAG_LOCATION事件包含了对getX()和getY()方法有效的数据,这两个方法的返回值对应了触点的位置。监听器可以使用这个信息来修改触点所在的View对象的外观,也能使用这个信息来判断用户拖放阴影的准确位置。

3. 在对ACTION_DRAG_EXITED事件的响应中,监听器应该重设在响应ACTION_DRAG_ENTERED或ACTION_DRAG_LOCATION事件对外观的任何改变。这个事件指示拖放对象已经离开准备放下的目标。

响应放下事件

当用户在应用中的一个View对象上释放了拖拽影子,并且这个View对象是之前报告的能够接收被拖拽内容的那个View对象,系统就会给这个View对象发送一个ACTION_DROP类型的拖拽事件。监听器应该做下列事情:

1.  调用getClipData()方法获得ClipData对象,这个对象在调用startDrag()方法时被初始化并保存在拖拽监听器中。如果拖放操作不移动数据,那么就不需要做这件事;

2.  返回true,指示放下事件被成功处理,否则返回false。对于ACTION_DRAG_ENDED事件,这个返回值就是通过getResult()方法返回的值。

要注意的是,如果系统不发送ACTION_DROP事件,针对对ACTION_DRAG_ENDED事件的getResult()方法调用的返回值是false。

系统允许用户在监听器不接收拖放事件的View对象之上释放拖拽影子,也允许用户在应用程序UI的空白区域或应用程序以外的区域释放拖拽影子,这样系统就不会发出ACTION_DROP类型的事件,直接会发出一个ACTION_DRAG_ENDED事件。

响应拖拽结束事件

用户释放了拖拽影子后,系统会立即给应用程序中所有的拖拽事件监听器发送ACTION_DRAG_ENDED类型的拖拽事件,指示拖拽操作结束了。

每个监听器都应该做下列事情:

1.  如果监听器在操作期间改变了View对象的外观,那么应该把View对象重设为默认的外观。这是对用户可见的操作结束的指示;

2.  监听器能够可选的调用getResult()方法来查找更多的相关操作。如果在响应ACTION_DROP类型的事件中监听器返回了true,那么getResult()方法也会返回true。在其他的情况中,getResult()方法会返回false,包括系统没有发出ACTION_DROP事件的情况;

3.  监听器应该给系统返回true。

响应拖拽事件的一个例子:

所有的拖拽事件都会被拖拽事件的回调方法或监听器接收。以下代码片段是一个简单的在监听器中对拖拽事件作出反应的示例。// Creates a new drag event listener

mDragListen = new myDragEventListener();

View imageView = new ImageView(this);

// Sets the drag event listener for the View

imageView.setOnDragListener(mDragListen);

...

protected class myDragEventListener implements View.OnDragEventListener {

// This is the method that the system calls when it dispatches a drag event to the

// listener.

public boolean onDrag(View v, DragEvent event) {

// Defines a variable to store the action type for the incoming event

final int action = event.getAction();

// Handles each of the expected events

switch(action) {

case DragEvent.ACTION_DRAG_STARTED:

// Determines if this View can accept the dragged data

if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {

// As an example of what your application might do,

// applies a blue color tint to the View to indicate that it can accept

// data.

v.setColorFilter(Color.BLUE);

// Invalidate the view to force a redraw in the new tint

v.invalidate();

// returns true to indicate that the View can accept the dragged data.

return(true);

} else {

// Returns false. During the current drag and drop operation, this View will

// not receive events again until ACTION_DRAG_ENDED is sent.

return(false);

}

break;

case DragEvent.ACTION_DRAG_ENTERED: {

// Applies a green tint to the View. Return true; the return value is ignored.

v.setColorFilter(Color.GREEN);

// Invalidate the view to force a redraw in the new tint

v.invalidate();

return(true);

break;

case DragEvent.ACTION_DRAG_LOCATION:

// Ignore the event

return(true);

break;

case DragEvent.ACTION_DRAG_EXITED:

// Re-sets the color tint to blue. Returns true; the return value is ignored.

v.setColorFilter(Color.BLUE);

// Invalidate the view to force a redraw in the new tint

v.invalidate();

return(true);

break;

case DragEvent.ACTION_DROP:

// Gets the item containing the dragged data

ClipData.Item item = event.getClipData().getItemAt(0);

// Gets the text data from the item.

dragData = item.getText();

// Displays a message containing the dragged data.

Toast.makeText(this, "Dragged data is " + dragData, Toast.LENGTH_LONG);

// Turns off any color tints

v.clearColorFilter();

// Invalidates the view to force a redraw

v.invalidate();

// Returns true. DragEvent.getResult() will return true.

return(true);

break;

case DragEvent.ACTION_DRAG_ENDED:

// Turns off any color tinting

v.clearColorFilter();

// Invalidates the view to force a redraw

v.invalidate();

// Does a getResult(), and displays what happened.

if (event.getResult()) {

Toast.makeText(this, "The drop was handled.", Toast.LENGTH_LONG);

} else {

Toast.makeText(this, "The drop didn't work.", Toast.LENGTH_LONG);

};

// returns true; the value is ignored.

return(true);

break;

// An unknown action type was received.

default:

Log.e("DragDrop Example","Unknown action type received by OnDragListener.");

break;

};

};

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙模块智能灯控应用方案

当今是信息高速发展的时代,经济、文化的流行与传播都离不开信息。信息的传递直接影响着人们生活的方方面面,信息的传递方式又各有不同,如有线传输、无线传输等;而无线传输还可按协议不同分为:蓝牙、WIFI、zigbee、LoRa…

【渝粤教育】国家开放大学2018年秋季 0717-22T社会保障基础 参考试题

科目编号:[0721] 座位号 2018-2019学年度第一学期期末考试 财务管理实务 试题 2019年 1月 一、单选题(本大题共10小题,每小题3分,共计30分) (★请考生务必将答案填入到下面对应序号的答题框中★&#xff0…

弱电安防关于交换机的一些常用专业术语介绍

交换机根据工作位置的不同,可以分为广域网交换机和局域网交换机。最常见的交换机是以太网交换机,其他常见的还有电话语音交换机、光纤交换机等。那么,关于交换机的一些常用术语你是否了解呢?接下来我们就跟随飞畅科技的小编一起来…

LoRa和ZigBee谁更适合智能家居?

智能家居,是近几年来市场的宠儿。作为一个新产业,现在一个导入期与成长期的临界点。智能家居的市场消费观念还未形成,但随着智能家居市场的推广普及,消费者使用习惯的变化,智能家居市场的消费潜力必然是巨大的。 那么L…

【渝粤教育】国家开放大学2018年秋季 1063t现代货币金融学说 参考试题

试卷代号:1076 常微分方程 试题(半开卷) 2019年1月 一、单项选择题(每小题3分.本题共15分) 1.微分方程xy’l的通解为y( ). A.CInx B.C- Inx C.Cln…

Java中的PriorityBlockingQueue

介绍: Java中的PriorityBlockingQueue实现了BlockingQueue接口并支持PriorityQueue的功能。 那么,什么是BlockingQueue? 以下适用于BlockingQueue的任何实现: 尝试检索元素时,如果队列为空,线程将等待 在…

android 火狐 插件,最新Android版Firefox浏览器不再支持现有插件

原标题:最新Android版Firefox浏览器不再支持现有插件火狐背后的非盈利组织Mozilla最近还为Android重新设计了浏览器,几乎丢掉了用户多年来习惯的许多惯例和功能,只有少数插件在新版Android浏览器启动时可以使用。在某种程度上,新的…

ZigBee网络架构详解

在万物互联-物联网的背景下,zigbee网络应用越加广泛,zigbee技术具有强大的组网能力,可以形成星型、树型和网状网3种结构,这三种网络结构各有优势,大家可以根据实际项目需要来选择合适的zigbee网络结构。下面亿佰特就为…

【渝粤教育】国家开放大学2018年秋季 1137t医院管理 参考试题

第一部 交际用语(共计10分,每小题2分) 1-5小题:阅读下面的小对话,从A、B、C三个选项中选出一个能填入空白处的最佳选项,并在答题纸上写出所选的字母符号。 1.-May I help…

同一交换机的不同VLAN如何隔离?

三层交换机下的VLAN划分,本身就已经做到了隔离,无法通信,VLAN的作用是可以隔离冲突域和广播域。那么,同一交换机不同VLAN如何隔离呢?接下来我们就跟随飞畅科技的小编一起来详细了解下吧! 什么是VLAN&#…

1G、3G都失败了,5G也会失败吗?

在我们通信行业里,一直都有这么个说法——通信标准如果是单数,一定失败,如果是双数,一定成功。 什么意思呢?就是说,像1G、3G这样的单数通信标准,都失败了。而2G、4G这样的双数标准,…

【渝粤教育】国家开放大学2018年秋季 1306T社会政策 参考试题

试卷代号:1315 社会调查方法 试题 2019年1月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收完考卷和答题纸后才可离开考场…

android studio怎么回退,如何回滚已经commit的代码(Android Studio)

01项目开发中,时常会遇到这样一种情况,代码已经commit(非push)上去了,但此时发现有误,不想提交了,如何回滚?这点对于新手git的开发者还是比较陌生的。今天和大家分享这个知识点,如果你对git用法很熟练&…

低功耗蓝牙模块智能门锁应用案例

要说我们接触最多的智能产品应该就是手机吧,随着科技的不断发展,各种各样的智能产品现在都前赴后继的出现在我们眼前了,其中智能家居的迭代也如雨后春笋一般。层出不穷的产品除了让用户感受到科技感以外也便捷了生活和管理。今天我们来说一说…

飞畅科技教你如何选择合适的交换机?

交换机作为造存储区域的重要部件,可以看出其作用的重要性,目前光纤交换机的市场竞争力很强,需求量也在逐步的增加,其性能和特点也得到了很多人的认可。但由于光纤交换机是构造存储区域的核心部件,所以选择最合适的交换…

【渝粤教育】国家开放大学2018年秋季 1370T教师心理专题 参考试题

试卷代号:13 96 药事管理与法规(本) 试题 2019年1月 一、单选题(35题,每题2分,共70分) 1.从药品使用途径和安全管理角度,可将药品分为( )。 A.现代药和传统药…

内部时钟和外部时钟隔离的Σ-Δ调制器

“在本文中,将详细研究这两类隔离Σ-Δ调制器的输出数据信号完整性。并通过简单的电磁干扰(EMI)测试设置、对由这两类Σ-Δ调制器的高频时钟信号产生的EMI进行比较。 对输出数据信号完整性和时钟信号电磁干扰(EMI)的比…

【渝粤教育】国家开放大学2018年秋季 2111T病理学与病理生理学 参考试题

试卷代号:2119 医护心理学 试题(开卷) 2019年1月 一、单项选择题(每题2分,共60分) 1.下列反应中常见的急性应激反应是( )。 A.急性焦虑反应 B.急性呼吸道感染 C&#xf…

javafx中的tree_JavaFX中的塔防(5)

javafx中的tree这是有关使用FXGameEngine在JavaFX中创建塔防游戏的本教程的第5部分。 敌人现在飞向目标的攻击路径,炮塔瞄准并射击。 因此,最重要的部分在那里,但是仍然缺少许多细节。 游戏只是开始,没有给我们准备下一波的机会。…

android tag定义快捷键,Android Studio快捷键生成TAG、Log.x日志输出介绍

生成TAGlogtTab键:private static final String TAG "Extract";生成Log.d()logdTab键:Log.d(TAG, "onCreate: ");生成Log.e()logeTab键:Log.e(TAG, "onCreate: ",new Throwable());生成Log.i/w类似Log.i(TAG,…