web桌面程序之图标拖动排序的分析
在web桌面程序里,图标拖动并重新排序是个比较常见的功能。这个功能我之前反复修改了好几遍,现在终于整理出了比较理想的解决思路,决定拿出来分享下。
这一功能主要有哪些难点呢?我总结了一下一共有2处难点:
1、如何知道被拖动的图标在拖动结束后处于哪个位置
2、知道拖动结束后图标的最后拖动位置,如何判断是在该位置之前插入,还是在之后插入
知道难点后,就可以来一一解决分析了。
首先是第一个,如何知道被拖动的图标在拖动结束后处于哪个位置?要解决这一问题,我在之前的《开源的Web桌面应用框架(文件夹功能分析)》这篇文章中简单的提到过,只不过是简单的文字说明,下面我会在文字说明的基础上增加演示,方便大家理解。
解决这个问题的前提就是需要绘制一套“格子”,这个格子用于图标初始化的排列,也用于拖动后判断结束位置,具体可以看下面的示例:
先点第一步,显示格子,再点第二步,加载图标。但其实直接点第二步就行,加载图标的时候才开始绘制格子,并且格子是不需要显示出来的,这里只是让大家更直观的能看到格子。(注:格子就是一组数组,分别记录每个格子的四角位置)
根据格子放置图标这一步好了之后,我们就可以开始处理刚才第一个问题了,“如何知道被拖动的图标在拖动结束后处于哪个位置”,解决思路就是在拖动结束后,根据鼠标当前位置,在格子数组里进行搜索,因为每个格子都有自己的区域,所以能根据鼠标的坐标查询到处于哪个格子。以下是演示,可以随意拖动图标,拖动结束后会返回拖动结束后,鼠标当前位于哪个格子的编号,为了让效果更明显,在拖动过程中,我还会将鼠标位于的当前格子进行高亮显示。
到这一步后,第一个问题已经解决了。接下来要处理的就是第二个问题,“如何判断是在该位置之前插入,还是在之后插入”。
这里有几种处理办法:
1、这种比较死板,就是统一使用一种插入方式,比如全部都在拖动结束后的位置之后插入,但这就会出现这种问题:你永远无法将某个图标拖动到一个位置。
2、另一种稍微高级点,就是用图标的原始位置和拖动后的位置进行比较,如果后者大于前者,就代表是往前拖动,则图标插入到拖动后的位置之前,反之则插入到拖动后的位置之后。但这个有个缺陷就是,如果图标本身不在区域内,比如有2个区域,均有放置图标,并且可以互相拖动,这时两个位置不在同个区域内,则无法进行比较。
3、第三种是我经过以上两种整理出一种最合理的办法,就是在每个放置图标的格子内,再进行划分,比如平均分成4个小格子,上面2个,下面2个。然后在图标拖动结束的时候,不仅获取当前位于哪个图标格子,同时也获取当前位于这个图标格子里的小格子的位置,通过这个位置,可以判断出是处于格子的左侧还是右侧,或者上方还是下方。最后根据这个判断是在该位置之前插入,还是之后插入,比如位于左侧,就在之前插入,右侧则在之后插入。(之所以分成4个小格子,目的就是应付图标的两种排列方式:横向排列和纵向排列)
既然确定了方法,下面就看下实例,同样,为了让效果更明显,在拖动过程中,我还会将鼠标位于的当前格子进行高亮显示。
到这一步,基本就已经完成了,之后就是根据这2个参数进行操作了。除此之外,如果图标是纵向排列的,也可以进行处理。下面看下完整版demo吧
web桌面程序之图标拖动排序的分析的更多相关文章
- web桌面程序之锁屏功能分析
这是一个在操作系统里比较常见的功能,但在web里实现,有哪些需要注意的呢? 1.如何真正的实现锁屏? 2.如何避免通过技术手段绕过锁屏? 我个人总结出2点需要特别注意的地方,下面就分别进行分析. 第一 ...
- 让人爱不释手的13套精美 Web 应用程序图标素材(转)
图标用于向用户传递信息,不管是在网页还是 Web 应用程序中都非常需要.这些小小的图标元素能够告诉用户怎么到下一页,如何添加.删除和取消等等各种操作.设计精美的图标不仅能增加界面的美观,也能够让应用程 ...
- Electron与WEB桌面应用程序开发及其它
这几天在构思项目,研究了一下Electron,记录下来. 说起WEB桌面程序,当前最火的就是Electron了. Electron的架构用一句话总结,就是一个main.js进程加上一个或数个chrom ...
- 空闲时间研究一个小功能:winform桌面程序如何实现动态更换桌面图标
今天休息在家,由于天气热再加上疫情原因,就在家里呆着,空闲时想着,在很早以前(约3年前),产品人员跟我提了一个需求,那就是winform桌面程序的图标能否根据节日动态更换,这种需求在移动APP上还是比 ...
- Web应用程序信息收集工具wig
Web应用程序信息收集工具wig 很多网站都使用成熟的Web应用程序构建,如CMS.分析网站所使用的Web应用程序,可以快速发现网站可能存在的漏洞.Kali Linux新增加了一款Web应用程序信 ...
- 开发 web 桌面类程序几个必须关注的细节
HoorayOS 写了差不多快2年了,在我的坚持下也有一部分人打算着手自己也写套类似的程序,我想我可以提供一点经验. 俗话说细节决定成败,开发2年多来,我看过大大小小类似的程序不下20个,各有优点也各 ...
- 突破短板,传统桌面程序 使用webapi 扩展迎合web和移动端融合的需求
传统桌面程序不能完全被web和移动端替代,但是需要改造.这里要说的是巧用webapi把以前用dll和com组件,ocx等方式做接口,做分布式开发的方式,改成restful 风格api的方式实现跨平台, ...
- Linux下通过.desktop 文件创建桌面程序图标及文件编写方式(Desktop Entry文件概述)
Linux下通过.desktop 文件创建桌面程序图标及文件编写方式 1.Desktop Entry文件概述:在 Windows 平台上,用户可以通过点击位于桌面或菜单上的快捷方式轻松打开目标应用程序 ...
- 迁移桌面程序到MS Store(11)——应用SVG图标
在传统桌面程序中,对图标的使用大多是直接嵌入JPG或者PNG的图片.在祖传的1366x768分辨率下,并没有什么问题.相对于手机硬件的突飞猛进,也侧面反映了PC行业的落寞和桌面程序开发的不思进取.用3 ...
随机推荐
- Design4:数据库设计规范
当数据模型从概念层转到逻辑层时,需要进行规范化设计.要想设计一个结构合理的关系型数据库,至少需要满足1NF,2NF,3NF,即第一范式,第二范式,第三范式. 1,1NF(原子性) 1NF是最基本的,数 ...
- CSS计数器
使用CSS计数器就像使用变量一样. 它有以下几个属性: counter-reset 创建或重置计数器 counter-increment 增长计数器 content 生成内容 counter() 将计 ...
- 【WP 8.1开发】自定义(RAW)通知的使用
继续前面的话题,还是推送通知.上一篇文章中遗留了RAW通知的推送没有给各位演示,特特地留到现在,不为别的,只为这个RAW通知有点意思,玩起来会比较有意思.官方文档将RAW通知译为“原始通知”,这里还是 ...
- 深入理解CSS中的长度单位
前面的话 本文分为绝对长度单位和相对长度单位来介绍CSS中的长度单位的主要知识 绝对长度单位 绝对长度单位代表一个物理测量 像素px(pixels) 在web上,像素px是典型的度量单位,很多其他长度 ...
- SQL*Loader之CASE11
CASE11 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase11.sql set termout off rem host write sys$output &q ...
- 面试准备 - 最大堆的Csharp实现
面试中最常见的问题之一...在N个数中间寻找前K大个元素 最常见的解法就是最大堆 时间复杂度O(N*log(K)) 空间复杂度O(k) 实现了一个最简单的最大堆,每次有元素进来都和堆顶元素比较一下,如 ...
- Shader 简明入门教程
Unity3D的所有渲染工作都离不开着色器(Shader),如果你和我一样最近开始对Shader编程比较感兴趣的话,可能你和我有着同样的困惑:如何开始?Unity3D提供了一些Shader的手册和文档 ...
- angularjs中 *.min.js.map 404的问题
初次使用AngularJS,在chrom调试的时候,出现如下问题: GET http://localhost:63342/luosuo/visitor/js/lib/angular-animate.m ...
- Twitter Bootstrap深受开发者喜爱的11大理由
Bootstrap,作为创新技术框架,使开发者.设计者更容易.更快捷.更出色地完成网站及应用的搭建工作.如果你还没有使用Twitter Bootstrap,建议你去了解一下.Bootstrap为开发者 ...
- 关于Entity Framework中的Attached报错的完美解决方案终极版
之前发表过一篇文章题为<关于Entity Framework中的Attached报错的完美解决方案>,那篇文章确实能解决单个实体在进行更新.删除时Attached的报错,注意我这里说的单个 ...