自定义GridLayout控件,可以在新闻咨询类APP中的管理页面使用到,也可以应用在类别管理中,总之,可以帮助我们设计更加规范和炫酷的手机页面。
新闻类app是最常见的应用之一,而频道管理又是其必不可少的功能,该自定义控件不仅可以带我们实现炫酷的频道管理功能,还可以让我们学习如何使用Android拖拽框架实现我们想要的多种功能,以及让我们对自定义控件会有更多的理解。
知识点
GridLayout的使用
- 从Google官方文档学习GridLayout的功能以及用法
- 使用GridLayout实现子控件排列显示
View的拖拽功能实现
- 通过查看Google文档,学会调用view的拖拽方法
- 拖拽事件的处理
- 使用View的拖拽框架实现实现频道切换位置效果
自定义GridLayout控件
自定义GridLayout控件,实现拖拽功能,继而实现频道管理操作
Rect类的使用
使用Rect类确定被触摸到的子控件
新闻频道管理的多种实现
实现类似于网易新闻频道管理有几种方式
实现方案1:使用两个GridView实现,这是比较早的一种解决方案,比较复杂,具体可以参考 Android 高仿 频道管理—-网易、今日头条、腾讯视频
实现方案2:使用两个RecyclerView或ListView实现,这种实现方式好于于方案1
实现方案3:使用一个RecyclerView实现,这是我目前见过的比较好的方式,貌似比网易新闻等客户端的要流畅,具体可以参考:高仿网易新闻栏目动画效果 、 使用ItemTouchHelper高效地实现 今日头条 、网易新闻 的频道排序、移动
实现方案4:使用两个GridLayout实现,也就是本文要介绍的方式
拖拽
长按item开始拖拽
|
|
拖拽方法参数说明
- startDragAndDrop() api24
- startDrag(ClipData data, DragShadowBuilder shadowBuilder, Object myLocalState, int flag)
参数1:ClipData data 拖拽过程中可以transferred的数据,可以为空
参数2:DragShadowBuilder shadowBuilder,拖拽阴影效果创建者
参数3:Object myLocalState,拖拽状态
参数4:int flag,可以控制拖拽操作的flag,未定义,传0即可
拖拽监听
|
|
DragEvent
拖拽事件 | 说明 |
---|---|
ACTION_DRAG_STARTED | 当拖拽操作执行时,就会执行一次 |
DragEvent.ACTION_DRAG_ENDED | 当拖拽事件结束,手指抬起时,就是执行一次 |
DragEvent.ACTION_DRAG_ENTERED | 当手指进入设置了拖拽监听的控件范围内的瞬间执行一次 |
DragEvent.ACTION_DRAG_EXITED | 当手指离开设置了拖拽监听的控件范围内的瞬间执行一次 |
DragEvent.ACTION_DRAG_LOCATION | 当手指在设置了拖拽监听的控件范围内,移动时,实时会执行,执行N次 |
DragEvent.ACTION_DROP | 当手指在设置了拖拽监听的控件范围内松开时,执行一次 |
当拖拽事件开始时,创建出与子控件对应的矩形数组
|
|
手指移动时,实时判断触摸是否进入了某一个子控件
|
|
是否允许拖拽
|
|
设置列数和动画
|
|
DragGridlayout
|
|
MainActivity
布局文件
|
|
代码实现