# PickerView
本库中使用的PickerView基于 [ScrollPickerView](https://github.com/1993hzw/Androids/blob/master/androids/src/cn/forward/androids/views/ScrollPickerView.java),
做了部分优化和调整,如下:
* 改为adapter填充数据,不再直接持有数据源。提供两种常用adapter:NumericWheelAdapter和ArrayWheelAdapter
* 增加属性itemSize,支持高度为wrap_content时,根据itemCount和visibleItemCount计算总高度,便于动态改变visibleItemCount
* 提供Formatter接口。外界可以对显示的文案处理。比如把2018变成2018年,8变成 08月。MixedTimePicker中用处更大
* 中心item装饰器由绘制drawable改为由接口CenterDecoration控制,提供默认实现。用户可以自定义,更强大,使用更方便
* 修改数据源size < visibleItemCount时强制不进行循环
* 扩展PickerView数据不仅仅支持String,支持任意数据。提供PickerDataSet数据实体接口,方便设置数据
* 修改默认选中第0个item
* 修复了部分bug
> *需要注意的是:该控件并不支持设置label。个人觉得label束缚较多,影响内容绘制。如果item内容长度差异大,将会更加难以控制。因此该控件并不对label进行支持,而采用更好的Formatter取代。*
## BasePickerView
PickerView基类([ScrollPickerView](https://github.com/1993hzw/Androids/blob/master/androids/src/cn/forward/androids/views/ScrollPickerView.java))
### Attributes
|attribute |format |method | description|
---|---|---|---
| mAdapter | WheelAdapter | setAdapter | 设置数据适配器
| mListener | OnSelectedListener | setOnSelectedListener | 设置滑动选中监听
| mVisibleItemCount | int | setVisibleItemCount | 设置可见的item count
| mItemSize | int | setItemSize | 设置item高/宽度
(仅对应高/宽设置为wrap_content时有效)
| mIsCirculation | boolean | setIsCirculation | 设置是否循环绘制
(当visibleCount>数据个数时有效)
| mIsHorizontal | boolean | setVertical/setHorizontal | 设置是否纵向/横向,默认为纵向
| mIsInertiaScroll | boolean | setInertiaScroll | 设置快速滑动时是否惯性滚动一段距离
| mDisallowInterceptTouch | boolean | setDisallowInterceptTouch | 是否允许父元素拦截事件
| mDisallowTouch | boolean | setDisallowTouch | 设置是否允许手动触摸滚动
| mCenterPosition | int | setDisallowTouch | 设置中间item的位置(即选中的那一行)
| mCanTap | boolean | setCanTap | 设置 单击切换选项或触发点击监听器
| | | autoScrollFast | 自动滚动(必须设置为可循环滚动)
| mFormatter | Formatter | setFormatter | 设置内容Formatter
| mCenterDecoration | CenterDecoration | setCenterDecoration | 设置中心指示器
| mDrawIndicatorNoData | boolean | setDrawIndicatorNoData | 设置没有数据时是否绘制指示器
## Formatter
内容Formatter:用于格式化内容。如在MixedTimePicker中可以实现任意格式的时间格式
```java
public interface Formatter {
CharSequence format(BasePickerView pickerView, int position, CharSequence charSequence);
}
```
具体的Picker中会包含自己的Formatter。
## CenterDecoration
中心装饰器:用于绘制选中的position的装饰器。
```java
public interface CenterDecoration {
void drawIndicator(BasePickerView pickerView, Canvas canvas, int left, int top, int right,
int bottom);
}
```
>*本库设计时尽可能将功能实现抽象为接口方便扩展以及解耦。*
## DefaultCenterDecoration
装饰器CenterDecoration的默认实现。样式为上下两条线,中间可设置drawable
### API
|api|description|
---|---
| setLineColor | 设置lineColor
| setLineWidth | 设置lineWith 单位dp
| setDrawable | 设置CenterDecoration drawable,
参数可以是color或drawable
| setMargin | 设置装饰线的margin 单位px
### Simple Example
```java
// 设置CenterDecoration
DefaultCenterDecoration decoration = new DefaultCenterDecoration(mContext);
decoration.setLineColor(Color.RED)
//.setDrawable(Color.parseColor("#999999"))
.setLineWidth(1)
.setMargin(Util.dip2px(mContext, 10), Util.dip2px(mContext, -3), Util.dip2px(mContext, 10),
Util.dip2px(mContext, -3));
pickerView.setCenterDecoration(decoration);
```
## PickerView
继承自BasePickerView,常用的绘制文字的PickerView(([StringPickerView](https://github.com/1993hzw/Androids/blob/master/androids/src/cn/forward/androids/views/StringScrollPicker.java)))
### API
|api|description|
---|---
| setColor | 设置center out 文字 color
| setTextSize | 设置item文字大小,单位dp
| setAlignment | 设置对其方式
### Simple Example
```java
mPickerView = view.findViewById(R.id.pickerview);
mPickerView.setAdapter(new NumericWheelAdapter(1, 10));
// 覆盖xml中的水平方向
mPickerView.setHorizontal(false);
mPickerView.setTextSize(15, 22);
mPickerView.setIsCirculation(true);
//mPickerView.setAlignment(Layout.Alignment.ALIGN_CENTER);
mPickerView.setCanTap(false);
mPickerView.setDisallowInterceptTouch(false);
// 覆盖xml设置的7
mPickerView.setVisibleItemCount(5);
mPickerView.setItemSize(50);
// 格式化内容
mPickerView.setFormatter(new BasePickerView.Formatter() {
@Override public CharSequence format(BasePickerView pickerView, int position,
CharSequence charSequence) {
return charSequence + "万年";
}
});
int margin = Util.dip2px(mActivity, 2);
DefaultCenterDecoration centerDecoration =
new DefaultCenterDecoration(getActivity()).setLineColor(Color.GREEN)
.setMargin(0, -margin, 0, -margin)
.setLineWidth(1)
.setDrawable(Color.RED);
mPickerView.setCenterDecoration(centerDecoration);
//mPickerView.setSelectedPosition(1);
```