Files
vlayout/docs/ATTRIBUTES-ch.md
2017-03-14 17:20:55 +08:00

239 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
为了提供丰富的布局能力,我们为`LayoutHelper`设计了一系列布局属性,用来控制布局逻辑和样式。这里介绍这些属性的概念和用法。
[Englist Document](ATTRIBUTES.md)
# margin, padding
Margin, padding就是外边距、内边距,概念与Android系统的margin, padding一样,但也有不同的地方:
+ 它不是整个`RecyclerView`页面的margin和padding,它是每一块`LayoutHelper`所负责的区域的margin和padding。
+ 一个页面里可以有多个`LayoutHelper`,意味着不同`LayoutHelper`可以设置不同的margin和padding。
+ `LayoutHelper`的margin和padding与页面`RecyclerView`的margin和padding可以共存。
+ 目前主要针对非fix类型的`LayoutHelper`实现了margin和padding,fix类型`LayoutHelper`内部没有相对位置关系,不处理边距。
![margin-padding](images/MarginPadding.png)
### 接口
对于`LayoutHelper`,调用
`public void setPadding(int leftPadding, int topPadding, int rightPadding, int bottomPadding)`
`public void setMargin(int leftMargin, int topMargin, int rightMargin, int bottomMargin)`
# bgColor, bgImg
背景颜色或者背景图,这其实不是布局属性,但是由于在vlayout对视图进行了直接布局,不同区域的视图的父节点都是`RecyclerView`,如果想要针对某一块区域单独绘制背景,就很难做到了。vlayout框架对此做了特殊处理,对于非fix、非float类型的`LayoutHelper`,支持配置背景色或背景图。同样目前主要针对非fix类型的`LayoutHelper`实现这个特性。
![background](images/Background.png)
### 接口
使用背景色
`public void setBgColor(int bgColor)`
使用背景图
首先为`LayoutManager`提供一个`ImageView`简单工厂
```
this.mLayoutManager.setLayoutViewFactory(new LayoutViewFactory() {
@Override
public opinion generateLayoutView(@NonNull Context context) {
return new XXImageView(context);
}
});
```
再为`LayoutHelper`提设置图片加载的`Listener`
```
baseHelper.setLayoutViewBindListener(new BindListener(imgUrl));
baseHelper.setLayoutViewUnBindListener(new UnbindListener(imgUrl));
private static class BindListener implements BaseLayoutHelper.LayoutViewBindListener {
private String imgUrl;
public BindListener(String imgUrl) {
this.imgUrl = imgUrl;
}
@Override
public void onBind(View layoutView, BaseLayoutHelper baseLayoutHelper) {
//loading image
}
}
private static class UnbindListener implements BaseLayoutHelper.LayoutViewUnBindListener {
private String imgUrl;
public UnbindListener(String imgUrl) {
this. imgUrl = imgUrl;
}
@Override
public void onUnbind(View layoutView, BaseLayoutHelper baseLayoutHelper) {
//cancel loading image
}
}
```
# aspectRatio
为了保证布局过程中视图的高度一致,我们设计了aspectRatio属性,它是宽与高的比例,`LayoutHelper`里有aspectRatio属性,通过vlayout添加的视图的`LayoutParams`也有aspectRatio属性,后者的优先级比前者高,但含义不一样。
+ `LayoutHelper`定义的aspectRatio,指的是一行视图整体的宽度与高度之比,当然整体的宽度是减去了`RecyclerView和`对应的`LayoutHelper`的margin, padding。
+ 视图的`LayoutParams`定义的aspectRatio,指的是在`LayoutHelper`计算出视图宽度之后,用来确定视图高度时使用的,它会覆盖通过`LayoutHelper`的aspectRatio计算出来的视图高度,因此具备更高优先级。
![aspectRatio](images/AspectRatio.png)
### 接口
对于`LayoutHelper`,调用
`public void setAspectRatio(float aspectRatio)`
对于`LayoutParams`,调用
`((VirutalLayoutManager.LayoutParams) layoutParams).mAspectRatio`
# dividerHeight
`LinearLayoutHelper`的属性,`LinearLayoutHelper`是像`ListView`一样的线性布局,dividerHeight就是每个组件之间的间距。
![dividerHeight](images/DividerHeight.png)
### 接口
对于`LinearLayoutHelper`,调用
`public void setDividerHeight(int dividerHeight)`
# weights
`ColumnLayoutHelper`, `GridLayoutHelper`的属性,它们都是提供网格状的布局能力,**建议使用`GridLayoutHelper`**,它的能力更加强大,参考下文介绍。默认情况下,每个网格中每一列的宽度是一样的,通过weights属性,可以指定让每一列的宽度成比例分配,就像`LinearLayout`的weight属性一样。
weights属性是一个float数组,每一项代表某一列占父容器宽度的百分比,总和建议是100,否则布局会超出容器宽度;如果布局中有4列,那么weights的长度也应该是4;长度大于4,多出的部分不参与宽度计算;如果小于4,不足的部分默认平分剩余的空间。
![weights](images/Weights.png)
### 接口
对于`ColumnLayoutHelper`, `GridLayoutHelper`,调用
`public void setWeights(float[] weights)`
# vGap, hGap
`GridLayoutHelper`与`StaggeredGridLayoutHelper`都有这两个属性,分别控制视图之间的垂直间距和水平间距。
![vgap-hgap](images/HGapVGap.png)
### 接口
对于`GridLayoutHelper`, `StaggeredGridLayoutHelper`,调用
`public void setHGap(int hGap)`
`public void setVGap(int vGap)`
# spanCount, spanSizeLookup
`GridLayoutHelper`的属性,参考于系统的`GridLayoutManager`,spanCount表示网格的列数,默认情况下每一个视图都占用一个网格区域,但通过提供自定义的spanSizeLookUp,可以指定某个位置的视图占用多个网格区域。
![spanCount-spanSize](images/SpanCountSpanSize.png)
### 接口
使用spanCount调用
`public void setSpanCount(int spanCount)`
使用spanSizeLookup
`public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup)`
# autoExpand
`GridLayoutHelper`的属性,当一行里视图的个数少于spanCount值的时候,如果autoExpand为true,视图的总宽度会填满可用区域;否则会在屏幕上留空白区域。
![autoExpand](images/AutoExpand.png)
### 接口
调用
`public void setAutoExpand(boolean isAutoExpand)`
# lane
`StaggeredGridLayoutHelper`中有这个属性,与`GridLayoutHelper`里的spanCount类似,控制瀑布流的列数。
### 接口
调用
`public void setLane(int lane)`
# fixAreaAdjuster
fix类型的`LayoutHelper`,在可能需要设置一个相对父容器四个边的偏移量,比如整个页面里有一个固定的标题栏添加在vlayout容器上,vlayout内部的fix类型视图不希望与外部的标题有所重叠,那么就可以设置一个fixAreaAdjuster来做偏移。
![fixAreaAdjuster](images/FixAreaAdjuster.png)
### 接口
调用
`public void setAdjuster(FixAreaAdjuster adjuster)`
# alignType, x, y
`FixLayoutHelper`, `ScrollFixLayoutHelper`, `FloatLayoutHelper`的属性,表示吸边时的基准位置,有四个取值,分别是`TOP_LEFT`, `TOP_RIGHT`, `BOTTOM_LEFT`, `BOTTOM_RIGHT`。`x`和`y`是相对这四个位置的偏移量,最终的偏移量还要受上述的fixAreaAdjuster影响。
+ `TOP_LEFT`:基准位置是左上角,`x`是视图左边相对父容器的左边距偏移量,`y`是视图顶边相对父容器的上边距偏移量;
+ `TOP_RIGHT`:基准位置是右上角,`x`是视图右边相对父容器的右边距偏移量,`y`是视图顶边相对父容器的上边距偏移量;
+ `BOTTOM_LEFT`:基准位置是左下角,`x`是视图左边相对父容器的左边距偏移量,`y`是视图底边相对父容器的下边距偏移量;
+ `BOTTOM_RIGHT`:基准位置是右下角,`x`是视图右边相对父容器的右边距偏移量,`y`是视图底边相对父容器的下边距偏移量;
![alignTypeXY](images/AlignTypeXY.png)
### 接口
设置基准调用
`public void setAlignType(int alignType)`
设置偏移量调用
`public void setX(int x)`
`public void setY(int y)`
# showType
`ScrollFixLayoutHelper`的属性,取值有`SHOW_ALWAYS`, `SHOW_ON_ENTER`, `SHOW_ON_LEAVE`。
+ `SHOW_ALWAYS`:与`FixLayoutHelper`的行为一致,固定在某个位置;
+ `SHOW_ON_ENTER`:默认不显示视图,当页面滚动到这个视图的位置的时候,才显示;
+ `SHOW_ON_LEAVE`:默认不显示视图,当页面滚出这个视图的位置的时候显示;
![showType](images/ShowType.png)
调用
`public void setShowType(int showType)`
# stickyStart, offset
`StickyLayoutHelper`的属性,当视图的位置在屏幕范围内时,视图会随页面滚动而滚动;当视图的位置滑出屏幕时,`StickyLayoutHelper`会将视图固定在顶部(`stickyStart = true`)或者底部(`stickyStart = false`),固定的位置支持设置偏移量offset。
![stickyStart](images/StickyStart.png)
调用
`public void setStickyStart(boolean stickyStart)`
`public void setOffset(int offset)`