WidgetLayout 介绍
WidgetLayout是一组继承于ViewGroup
的自定义容器集合,大部分支持描边和内容分割线,目前实现了以下实用容器:
ColumnLayout
以等分列方式布局,每列可设置内容居左,中,右,及铺满,可设置最小最大列宽高限定。NestRefreshLayout
一个精简强大的支持任意类型View
的下拉刷新,上拉加载更多,可添加头部和尾部且可设置悬停模式。NestFloatLayout
支持列表的嵌套滑动和指定子View
悬停顶部,类似NestScrollView
。PageScrollView
可水平垂直方向布局和滑动吸顶等,无需嵌套,支持ScrollView
和ViewPager
的交互和接口。PageScrollTab
在PageScrollView
上扩展支持Tab
场景交互和各种UI定制。WrapLayout
支持水平布局,并自适应换行,单行或列时支持weight
属性,可限定每行最少和最多Item数,行内容可水平和垂直居中。LabelLayout
继承自WrapLayout
,以ItemProvider
方式提供内容,有简单的回收复用机制,有Item点击监听。HierarchyLayout
一个展示View
树层级关系和工具容器,可画出结束依赖图和3D层级图,计算出平均层级和最近一次measure,layout,draw
的时间。
以下是各容器实现的结构类图, 查看工程地址 github 点我
实现背景及使用场景
1. 现有系统容器下开发界面经常遇到以下尴尬问题:
* 实现特定的组合布局,我们会用功能鲜明的4大常用布局去嵌套实现,增加了严重OverDraw的机率;
* RelativeLayout
布局功能强大但是measure
过程复杂(每次执行onMeasure
所有直接子View
会有两次measure)
* 为实现复杂交互工作量比开发业务繁重,比如滑动控件的悬停或联动;
* 分割线或是边界线很多人常用View
来实现,即耗内存,又影响测绘时间。
* 等分布局,使用多层不同方向LinearLayout
来实现,嵌套太多。
* 常用容器控件还没有对自身做最大宽高限定的,也无对子 View 做最大宽高限定。
2. 适合的使用场景举例按需要选择,可减少布局嵌套和复杂的交互代码。
+ 容器自身或对直接子View
的最大宽高限定,容器内容和直接子View
的gravity
灵活支持。
+ 容器需要描边或子View
间画分割线的,或有各种间距要求,或按下自带激变层效果可使用继承于PressViewGroup
的容器,如WrapLayout,LabelLayout,ColumnLayout
。
+ 常见的表格布局或动态等分布局可用ColumnLayout
,支持每列的Align
方式(左中右上下)和全铺满。
+ 标签布局或需自适应换行可选用WrapLayout
和LabelLayout
,可设置行最少最多的View
个数和行居中,
+ 列表需要嵌套滑动和悬停吸顶可用NestFloatLayout
,类似NestScrollView 。
+ PageScrollView
可取代ScrollView&HorizontalScrollView
少嵌套,可设置任意子View
滑动悬停在开始和结束位置,可不限定子View
大小像 ViewPager
一样选中居中和滑动的交互。
+ WrapLayout,ColumnLayout
是完全可替代支持不同方向的LinearLayout
并能提供更多的布局约束,和背景,描边,分割等额外装饰。
+ 以上容器都有一个共通的基类,便于统一监控性能打点如layout
,measure
过程等。
Demo演示效果
WrapLayout
和LabelLayout
ColumnLayout
的演示效果。的演示效果。
PageScrollView
和PageScrollTab
的使用示例。
Demo 入口 和 NestFloatLayout
的演示效果。
HiearchyLayout
的静态图,实际是可随手势改变 3D 形态的。
如何使用:XML 属性和 API 简介
compile ‘com.rexy.android:widgetlayout:1.0.0’
通用属性说明和介绍
注;所有xml 中使用自定义属性的地方,请在根标签中加上xmlns:app="http://schemas.android.com/apk/res-auto"
1. 所有容器自身和子 View
对于 maxWidth,maxHeight,gravity
支持。
a. 容器控件自身标签下使用 android:gravity,android:maxWidth ,android:maxHeight
,即可支持容器内容的align 属和最大宽与高的限制。
java 代码可通过 setGravity
,setMaxWidth
,setMaxHeight
来支持。
b. 容器直接子View
使用android:layout_gravity,android:maxWidth,android:maxHeight
即可支持直接子View
在容器内的Align
和自身大小的限制。
java 代码可通过 BaseViewGroup.LayoutParams lp=(BaseViewGroup.LayoutParams)child.getLayoutParams(); lp.gravity=Gravity.CENTER;lp.maxWidth=100;lp.maxHeight=200
2. 部分容器FloatDrawable
和DividerMargin
的应用,仅限于继承于PressViewGroup
的容器
a. xml 中使用支持FloatDrawable
属性和解释如下,java 都有对应的set 和get 方法:
-hover drawable 忽略手势滑动到自身之外取消按下状态-->
<attr name="ignoreForegroundStateWhenTouchOut" format="boolean"/>
<!--hover drawable 颜色-->
<attr name="foregroundColor" format="color"/>
<!--hover drawable 圆角-->
<attr name="foregroundRadius" format="dimension"/>
<!--hover drawable 动画时间-->
<attr name="foregroundDuration" format="integer"/>
<!--hover drawable 最小不透明度-->
<attr name="foregroundAlphaMin" format="integer"/>
<!--hover drawable 最大不透明度-->
<attr name="foregroundAlphaMax" format="integer"/>
b. xml 中使用支持DividerMargin
属性和解释如下,java 都有对应的set 和get 方法:
<!--左边线的颜色,宽度,和边线padding-->
<attr name="borderLeftColor" format="color"/>
<attr