Android的拖放机制

news/2023/12/8 19:22:09

一、拖放机制概述

²拖放操作是手指触摸屏幕上的某一对象,然后拖动该对象,最后在屏幕的某个位置释放该对象并执行某种操作,如删除、卸载、启动、复制数据等。

²允许以图形化的手势操作完成某项任务。

²拖放操作的优势:直观、易用、简化操作步骤。

²SDK3.0提供了支持拖放操作的编程机制,简称拖放机制,拖放机制是为数据移动设计的,但能够用于其它的UI操作。如Android系统自带的将托盘内图标代表的应用程序以拖放的方式卸载。

²拖放机制比自编程实现拖放操作更方便,优点包括:

1、提供了对所有View支持拖放操作的API,无需自定义View。

2、系统自动判断手指的位置。

3、由系统自动绘制影子图形。

4、系统提供了拖放对象与目标对象之间传递数据的机制,简化了数据传递的编程。

5、提供了更多的拖放事件,如按下、抬起、释放、进入目标区域、仍在目标区域、离开目标区域、结束拖放等六个事件。并且这些事件由系统捕捉、发送,开发者只需编写处理这些事件的代码。

²拖放机制包括:

1、响应拖放操作事件的接口;

2、存放拖放操作相关信息的类;

3、启动拖放操作的方法;

4、绘制拖放过程中影子图形的类;

5、传递数据的类。

(二)拖放编程步骤

步骤1、设置被拖放对象的点击或长按或触摸的事件响应代码,在该响应代码中完成以下操作:

1)设置传送给目标对象的数据;

2)设置拖放过程中绘制影子图形的对象;

3)启动拖放操作。

步骤2、编写被拖放对象和拖放目标对象的响应拖放事件的代码。

(三)相关类-ClipData

图片描述

(四)相关类-DragShadowBuilder

1、概述

在拖拽和放下操作期间,系统会显示一张用户拖动的图片。对于要移动的数据,这张图片就代表了被拖动的数据。对于操作,这张图片就代表了拖动操作的某些外观。

这张图片被叫做影子图形,由DragShadowBuilder对象来创建。

DragShadowBuilder类是View类的内部类。

2、构造方法
图片描述

3、与拖拽相关的方法
图片描述

(五)相关接口-OnDragListener

1、概述

OnDragListener接口用于响应拖拽的相关事件。

2、接口中声明的方法
图片描述

(六)相关类-DragEvent

1、概述

系统用DragEvent对象存储拖放事件的相关信息。DragEvent对象包含了一个操作类型,用于告诉监听器在拖放过程中发生的事件。该对象还根据操作类型,包含了其它的数据。

2、拖放事件常量
图片描述
有六种与拖放相关的事件,这些事件在DragEvent类中用六个常量表示,如下表所示:
图片描述
3、常用方法
图片描述

二、【案例】

Ø目标

在屏幕左上有一个时钟图片,屏幕下边有三个标签,分别代表卸载、启动和分享,如图所示:
图片描述
长按时钟,在日志窗口显示“开始拖拽clock,拖动时钟时,如图下所示:
图片描述
当拖动时钟进入到“启动”标签区域,在日志窗口显示:clock进入启动区,clock仍在启动区,入图下所示
图片描述
图片描述
当拖动时钟离开“启动”区域,在日志窗口显示:clock离开启动区。松开时钟将显示拖放结束。
图片描述
提示:

当进入目标区域时,即使没有松手,仍会发生ACTION_DROP事件,因此在图-7中显示“启动clock”。

当进入“卸载”、“分享”区域时,在日志窗口中也将显示类似图-6、图-7的信息。

Ø思路

步骤1、MainActivity实现拖放的相关接口

publicclassMainActivityextendsActivityimplementsOnDragListener,OnLongClickListener{

步骤2、定义MainActivity的成员

ImageViewmivClock;

TextViewmtvUninstall,mtvStart,mtvShare;

步骤3、初始化控件

privatevoidinitView() {

//创建显示时钟的控件

mivClock=(ImageView) findViewById(R.id.ivClock);

//设置时钟拖拽事件的响应

mivClock.setOnDragListener(this);

//设置长按时间的响应

mivClock.setOnLongClickListener(this);

//创建代表分享、启动和卸载的三个控件

mtvShare=(TextView) findViewById(R.id.tvShare);

mtvStart=(TextView) findViewById(R.id.tvStart);

mtvUninstall=(TextView) findViewById(R.id.tvUninstall);

//设置三个TextView响应拖拽事件的代码

mtvShare.setOnDragListener(this);

mtvStart.setOnDragListener(this);

mtvUninstall.setOnDragListener(this);

}

步骤4、编写响应拖放事件的代码

//响应拖拽事件

@Override

publicbooleanonDrag(View view, DragEvent event) {

booleanresult=true;

//获取拖拽的动作类型值

intaction=event.getAction();

switch(action) {

caseDragEvent.ACTION_DRAG_STARTED:

if(view.getId()==R.id.ivClock){

Log.i("main","开始拖拽clock");

}

break;

caseDragEvent.ACTION_DRAG_ENTERED:

if(view.getId()==R.id.tvStart){

Log.i("main","clock进入启动区");

}

break;

caseDragEvent.ACTION_DRAG_EXITED:

if(view.getId()==R.id.tvStart){

Log.i("main","clock离开启动区");

}

caseDragEvent.ACTION_DRAG_LOCATION:

if(view.getId()==R.id.tvStart){

Log.i("main","clock仍在启动区");

}

caseDragEvent.ACTION_DROP:

if(view.getId()==R.id.tvShare){

Log.i("main","分享clock");

}elseif(view.getId()==R.id.tvStart){

Log.i("main","启动clock");

}elseif(view.getId()==R.id.tvUninstall){

Log.i("main","卸载clock");

}

break;

caseDragEvent.ACTION_DRAG_ENDED:

Log.i("main","拖拽结束,在drop事件之后发生");

break;

default:

result=false;

break;

}

returnresult;

}

步骤5、编写响应长按事件的代码

//长按事件响应程序

@Override

publicbooleanonLongClick(View view) {

//创建实现阴影的对象

DragShadowBuilder builder=newDragShadowBuilder(view);

/*开始拖拽并把view对象传递给系统。作为响应startDrag()方法的一部分,

*系统调用在View.DragShadowBuilder对象中定义的回调方法

*来获取拖拽影子。

*/

view.startDrag(null, builder,null, 0);

returntrue;

}

}

http://www.niftyadmin.cn/n/3123647.html

相关文章

ABP文档 - 导航

文档目录 本节内容: 创建菜单 注册导航供应器显示菜单每个web应用都有一些菜单用来在页面/屏幕之间导航,ABP提供了一个通用的基础框架创建并显示菜单给用户。 创建菜单 一个应用可能由不同模块组成,每个模块可以有它自己的菜单项,…

React脚手架、组件基础总结

文章目录React脚手架的使用React脚手架意义React脚手架初始化项目在脚手架中使用React项目的默认目录React组件基础模块化和组件化的区别组件的两种创建方式函数组件类组件函数组件和类组件的区别React事件处理事件绑定事件绑定中的this不建议方法React脚手架的使用 React脚手…

centos 开放端口

1.修改文件/etc/sysconfig/iptables [rootzsq ~]# cd /etc/sysconfig/[rootzsq sysconfig]# vi iptables 文件内容如下,注意红色一行是新加的,目的是对外界开放8080端口 # Firewall configuration written by system-config-firewall# Manual customizat…

使用spring配置quartz定时器

quartz是石英钟的意思,所以用这个名字来做定时器的框架名称再适合不过。一年前做项目的时候有用过这个框架,当时没有整理,今天刚好新的商城系统也需要定时器。想要达到的效果是:每天的固定时间,比如凌晨3:0…

【转】MySQL各版本的区别

来源:https://www.cnblogs.com/langtianya/p/5185601.html MySQL各版本的区别: 1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。2. MySQL Enterprise Edition 企业版本,需付费,可以试…

jenkins 忘记密码快速找回

2019独角兽企业重金招聘Python工程师标准>>> 来源 http://blog.csdn.net/jingjing029/article/details/50371485 在jenkin home里面找到config.xml 找到<passwordHash>节点里面的加密后的密码替换成 #jbcrypt:$2a$10$DdaWzN64JgUtLdvxWIflcuQu2fgrrMSAMabF5TS…

密码过期导致的用户锁定问题

第一章 数据安全&#xff1a;巧妙解决由密码过期导致的用户锁定问题 数据库安全问题一直是人们关注的焦点。oracle数据库使用了多种手段来保证数据库的安全&#xff0c;如密码&#xff0c;角色&#xff0c;权限等等。今天我们来讨论一下关于oracle的密码问题。然而&#xff0c…

【转】压缩感知测量矩阵之有限等距性质(Restricted Isometry Property, RIP)

出处&#xff1a;http://blog.csdn.net/jbb0523/article/details/44565647 题目&#xff1a;压缩感知测量矩阵之有限等距性质&#xff08;Restricted Isometry Property,RIP&#xff09; 阅读压缩感知的文献&#xff0c;RIP绝对是一个抬头不见低头见的英文简写&#xff0c;也就…

zabbix 自动注册发现

前段时间有人问我zabbix自动注册发现怎么搞&#xff1f;今天就写个博客简单演示下.zabbix的自动注册发现添加就在zabbix的报警添加动作那块&#xff0c;只是有个下拉按钮&#xff0c;其实也特别简单&#xff0c;看下图&#xff1a;组态-动作-自动注册-创建名称自己写一个&#…

获取KeyValuePairstring, object)泛型结构的默认值

获取框架定义的类型的方式&#xff1a;KeyValuePair<string, object>&#xff0c;如&#xff1a;default(string)&#xff0c;default(class) KeyValuePair实际是一个泛型结构&#xff0c;获取方式如下&#xff1a; default(KeyValuePair<string, object>))转载于:…

Ae 效果:CC Threshold RGB

风格化/CC Threshold RGB Stylize/CC Threshold RGB CC Threshold RGB&#xff08;CC 阈值 RGB&#xff09;效果可以为红、绿、蓝三个原色通道分别设置阈值&#xff0c;即&#xff0c;通道上高于此阈值时为纯白&#xff0c;低于此阈值时纯黑&#xff0c;以实现对原色通道的二值…

@private、@protected与@public三者之间的区别

private、protected与public三者之间的区别 类之间关系图 private只能够使用在声明的类当中&#xff0c;其子类也不能够使用用private声明的实例变量 protected只能在声明的类当中使用&#xff0c;但其子类具有使用protected声明变量的资格 public可以全局使用&#xff0c;属性…

jq验证码换一换

<!DOCTYPE html><html><head> <meta charset"utf-8"> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <title>换一换</title> <meta name"description" content"&qu…

tab_切换

采用的是类名的字符拼接 &#xff0c;在setTab(name,num,n)方法中&#xff0c;传入部分共用的名字&#xff0c;当前的inum的时候&#xff0c;n总个数&#xff08;用于遍历出多有tab头和tabbox&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> …

盒子模型及弹性盒子

文章目录什么是盒子模型盒子模型分类弹性盒子布局容器属性项目属性圣杯布局示例什么是盒子模型 把所有的网页元素都看成一个盒子&#xff0c;它具有以下四个属性&#xff1a; margin—外边距border—边框padding—内边框content—内容 盒子模型分类 W3C标准盒子模型 标…

使用Express开发node.js应用

Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架&#xff0c;它提供一系列强大的特性&#xff0c;帮助你创建各种 Web 和移动设备应用。&#xff08;来自Express官网&#xff09;比较简单的方式是使用webStorm,如果想更好的理解一下npm gulp各种插件&#xff…
最新文章