自定义 ViewGroup 集合,高效布局。

WidgetLayout 介绍

WidgetLayout是一组继承于ViewGroup的自定义容器集合,大部分支持描边和内容分割线,目前实现了以下实用容器:

  1. ColumnLayout 以等分列方式布局,每列可设置内容居左,中,右,及铺满,可设置最小最大列宽高限定。
  2. NestRefreshLayout 一个精简强大的支持任意类型View的下拉刷新,上拉加载更多,可添加头部和尾部且可设置悬停模式。
  3. NestFloatLayout 支持列表的嵌套滑动和指定子 View 悬停顶部,类似NestScrollView
  4. PageScrollView 可水平垂直方向布局和滑动吸顶等,无需嵌套,支持ScrollViewViewPager的交互和接口。
  5. PageScrollTabPageScrollView上扩展支持Tab场景交互和各种UI定制。
  6. WrapLayout 支持水平布局,并自适应换行,单行或列时支持weight属性,可限定每行最少和最多Item数,行内容可水平和垂直居中。
  7. LabelLayout 继承自 WrapLayout,以ItemProvider 方式提供内容,有简单的回收复用机制,有Item点击监听。
  8. HierarchyLayout 一个展示 View树层级关系和工具容器,可画出结束依赖图和3D层级图,计算出平均层级和最近一次measure,layout,draw的时间。

以下是各容器实现的结构类图, 查看工程地址 github 点我
classlayer.jpg

实现背景及使用场景

1. 现有系统容器下开发界面经常遇到以下尴尬问题:
* 实现特定的组合布局,我们会用功能鲜明的4大常用布局去嵌套实现,增加了严重OverDraw的机率
* RelativeLayout 布局功能强大但是measure过程复杂(每次执行onMeasure 所有直接子View会有两次measure)
* 为实现复杂交互工作量比开发业务繁重,比如滑动控件的悬停或联动
* 分割线或是边界线很多人常用View来实现,即耗内存,又影响测绘时间。
* 等分布局,使用多层不同方向LinearLayout来实现,嵌套太多。
* 常用容器控件还没有对自身做最大宽高限定的,也无对子 View 做最大宽高限定。

2. 适合的使用场景举例按需要选择,可减少布局嵌套和复杂的交互代码。
+ 容器自身或对直接子View的最大宽高限定,容器内容和直接子Viewgravity灵活支持。
+ 容器需要描边或子View间画分割线的,或有各种间距要求,或按下自带激变层效果可使用继承于PressViewGroup的容器,如WrapLayout,LabelLayout,ColumnLayout
+ 常见的表格布局或动态等分布局可用ColumnLayout,支持每列的Align方式(左中右上下)和全铺满。
+ 标签布局或需自适应换行可选用WrapLayoutLabelLayout,可设置行最少最多的View 个数和行居中,
+ 列表需要嵌套滑动和悬停吸顶可用NestFloatLayout,类似NestScrollView 。
+ PageScrollView 可取代ScrollView&HorizontalScrollView 少嵌套,可设置任意子View滑动悬停在开始和结束位置,可不限定子View大小像 ViewPager 一样选中居中和滑动的交互。
+ WrapLayout,ColumnLayout是完全可替代支持不同方向的LinearLayout并能提供更多的布局约束,和背景,描边,分割等额外装饰
+ 以上容器都有一个共通的基类,便于统一监控性能打点如layout,measure过程等。

Demo演示效果

WrapLayoutLabelLayout ColumnLayout的演示效果。的演示效果。

wraplabel.gif
column.gif

PageScrollViewPageScrollTab的使用示例。

example_scrollview.gif
example_viewpager.gif

Demo 入口 和 NestFloatLayout的演示效果。

entry.jpg
nestlist.gif

HiearchyLayout的静态图,实际是可随手势改变 3D 形态的。
hierarchyView.jpeg

hierarchyViewNode.jpeg

如何使用: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. 部分容器FloatDrawableDividerMargin的应用,仅限于继承于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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值