专栏首页非著名程序员拖拽,自由组合,让你的开发更加简单,用户更方便

拖拽,自由组合,让你的开发更加简单,用户更方便

今天给大家推荐一个自由拖拽,自由组合的控件,这个控件是我自定义写的。通过它,我们可以自由拖拽,自由组合实现一个界面,满足一个用户自由组合界面的需求。这里不是通过自由拖拽控件,来快速开发一个界面,而且更人性化的让用户去自由组合一个界面。

1

前言

最近有一个项目,有一个主界面,界面上有很多控件或者有多个 fragment 组成,大小不一,而且由于用户需要,需要自由拖动和自由组合,形成用户自己需要的组合成的模样。所以就写了一个 DragerViewLayout ,只要在 DragerViewLayout 下,写入了多个视图,就可以自由拖动和组合了。DragerViewLayout 本质上是一个相对布局,所以初始位置都可以自己按相对布局的方式来定义,然后用户手动拖动后,会自动记录每个子视图的位置,进行保存,等到重新加载后,会按照记录的位置进行布局。

2

效果图

说一千道一万,不如看实践,那就一起来欣赏一下效果图的效果如何吧?

你们感觉如何?

3

实现思路

3.1

首先

首先,我们来想想,要是实现各个子控件和视图之间的拖拽和交换位置,那这就意味着所有的子视图和控件必须在一个层级之内,否则跨层级的拖拽是非常难实现的。所以第一个思路就是:

使用相对布局

使用相对布局,其实可以满足所有控件都在一个层级之内的,而且可以满足我们初始的任何样式的布局。况且相对布局是 Android 官方推荐使用的布局。

3.2

其次

其次,就该讨论拖拽的问题了,如何实现拖拽呢?有没有更好的,简单的方式呢?难道只能自己实现触摸事件,判断是哪个控件,计算 X , Y 坐标移动呢?非也,其实有简单的好办法。那就是:

使用 ViewDragHelper

ViewDragHelper 是一个非常棒的东西,好用,简单,不需要你去计算。2013年谷歌 I/O 大会上介绍了两个新的 layout: SlidingPaneLayout 和 DrawerLayout,现在这两个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了 ViewDragHelper 来处理拖动。ViewDragHelper 是 framework 中不为人知却非常有用的一个工具。

ViewDragHelper 解决了 Android 中手势处理过于复杂的问题,在 DrawerLayout 出现之前,侧滑菜单都是由第三方开源代码实现的,其中著名的当属 MenuDrawer ,MenuDrawer 重写 onTouchEvent 方法来实现侧滑效果,代码量很大,实现逻辑也需要很大的耐心才能看懂。如果每个开发人员都从这么原始的步奏开始做起,那对于安卓生态是相当不利的。所以说 ViewDragHelper 等的出现反映了安卓开发框架已经开始向成熟的方向迈进。

关于 ViewDragHelper 的具体用法,这里不过多赘述,想了解的,在网上一搜,有非常多的文章都在介绍它的基本使用方法。

3.3

再次

再次,我们该如何把拖动的视图的位置,保存住呢?又该如何在重新打开应用的时候按照我们自己组合和重新排列的布局显示呢?其实方法也一样很简单,那就是:

记住每个子控件拖拽后的位置,并保存,在 onLayout 方法中,读取记录的位置

在这里,我给每个视图和控件都增加了一个 tag ,在拖拽的时候根据 tag 知道拖拽的是哪个控件和视图,然后记录位置,写入 SharedPreferences 文件中,在 onLayout 方法中读取文件,根据记录的位置布局,这样,再次打开应用时,就会根据自己拖拽和组合的方式排列。

3.4

最后

最后,有一个问题就是,相对布局会根据自己初始的位置有覆盖层级的,先写的在下面,后写的控件在上面,拖拽的时候,怎么把下面的提到上面来呢?方法也很简单,那就是:

使用 child.bringToFront() 方法

bringToFront() 方法就是干这个事的,会把操作的视图,提到最上层来。

4

最后

最后的最后,我就不贴具体的代码和使用方式了,代码和使用方法都在我的 github 上,地址如下:

https://github.com/loonggg/DragerViewLayout

有兴趣的同学可以去研究一下。

本文分享自微信公众号 - 非著名程序员(non-famous-coder),作者:loonggg

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-04-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android官方支持百分比设置宽和高的控件及示例

    Android官方支持百分比设置宽和高的控件及示例 非著名程序员 Android官方终于支持按百分比来设置控件的宽和高了。有了这样的控件,写起来就比较方便了。其...

    非著名程序员
  • 代码实验室--带你一步步理解使用 ConstraintLayout

    ? 说明 这次 IO 给开发者带来了很多惊喜, ConstraintLayout 是其中较为实用的之一. Google 第一时间发布了官方的代码实验室指导教程...

    非著名程序员
  • 如何用好 GitHub 中的 Watch、Star、Fork

    在每个 github 项目的右上角,都有三个按钮,分别是 watch、star、fork,但是有些刚开始使用 github 的同学,可能对这三个按钮的使用却不怎...

    非著名程序员
  • UI上search 的drop down list是怎么实现的

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Jerry Wang
  • iOS 统一设置返回按钮图片 返回按钮标题不显示

    iOSDevLog
  • 正则表达式-入门

    前言:今天先分享正则表达式的基础元字符,后续会分享正则表达式的子表达式,回溯引用,前后查找,嵌入条件,,全部分享完成之后,会尝试着去分享一些例子与拆分介...

    杨小杰
  • Hello Lightning Network -3

    在前面几篇文章中我们评论道:闪电网络是一个丰富的生态,将来里面会有各种各样的角色参与其中;目前来看,如何注入足够Inbound Capacity,保持闪电网络有...

    happy123.me
  • 006 | 我是如何写作的

    今天再免费放出一篇专栏文章,因为我想推荐更多人开始写作。另外,多点下文后的广告吧,就当是给我的稿费。

    Keegan小钢
  • 正则表达式是如何让你的网页卡住的

    正则表达式在我们日程的工作项目中,应该是一个经常用到的技能。在做一些字符的匹配和处理的过程中,发挥了很大的作用。我们这篇文章主要是通过一个我在工作中遇到的性能问...

    黄Java
  • Python高级特性:列表生成式

    列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

    听着music睡

扫码关注云+社区

领取腾讯云代金券