美文网首页非著名程序员Android UI特效实现Android之界面
一个可拖拽,移动,自由组合子控件的视图控件,让开发更简单

一个可拖拽,移动,自由组合子控件的视图控件,让开发更简单

作者: 非著名程序员 | 来源:发表于2017-04-20 13:22 被阅读654次

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

前言

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

效果图

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




你们感觉如何?

实现思路

首先

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

使用相对布局

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

其次

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

使用 ViewDragHelper

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

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

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

再次

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

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

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

最后

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

使用 child.bringToFront() 方法

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

最后的最后

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

https://github.com/loonggg/DragerViewLayout

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

相关文章

  • 一个可拖拽,移动,自由组合子控件的视图控件,让开发更简单

    今天给大家推荐一个自由拖拽,自由组合的控件,这个控件是我自定义写的。通过它,我们可以自由拖拽,自由组合实现一个界面...

  • IOS开发中的坐标转换

    在平时的开发中, 我们经常会遇到一个控件的上面添加另一个控件的情况,这时如果需要获取该控件的子控件相对于目标视图的...

  • 怎么让拖到xib上的控件显示边框

    当我们使用xcode的xib构建视图的时候,如果往视图上面拖拽控件的时候,默认是没有边框的,这里简单介绍一下怎么让...

  • 1. UIView

    标签:获取子视图、添加子视图、坐标转换、Superview、UIview的常用属性 子控件的点坐标转化为父控件的坐...

  • 获取控制器上所有的子控件

    有时候我们开发会需要获取视图上的子控件 我这里贴一个简单的方法,而且层级关系明了 pragma mark - 获取...

  • iOS控件--UIScrollView--滑动控件

    UIScrollView是一个能够滚动的视图控件,可以滑动来展示大量的内容,并且可以让用户通过滚动拖拽手势查看所有...

  • iOS UITableView 下拉刷新和上拉加载

    HHRefresh易于定制下拉刷新控件的模板控件。你需要做的是添加子视图和在setState方法里,维护子视图的状...

  • iOS 设置视图半透明而子控件不透明

    让一个控件半透明,通常我们第一个想到的方法就是调整控件的alpha值。当然如果你的视图上如果有其他子控件就会发现这...

  • iOS 蒙版小技巧

    让一个控件半透明,通常我们第一个想到的方法就是调整控件的alpha值。当然如果你的视图上如果有其他子控件就会发现这...

  • iOS 设置视图半透明而子控件不透明

    让一个控件半透明,通常我们第一个想到的方法就是调整控件的alpha值。当然如果你的视图上如果有其他子控件就会发现这...

网友评论

  • Souv:什么都不说,就这效果已经让我耳目一新了。

本文标题:一个可拖拽,移动,自由组合子控件的视图控件,让开发更简单

本文链接:https://www.haomeiwen.com/subject/bzqlzttx.html