- Notifications
You must be signed in to change notification settings - Fork 101
Home
zyyoona7 edited this page Aug 21, 2018 · 8 revisions
一个顺滑的、高度自定义的滚轮控件和选择器,支持类似 iOS 的 3D 效果。
- 如丝般顺滑的滚动效果,无论快速滚动还是缓慢滚动
- 灵活数据设置,通过泛型设置数据类型,灵活、安全
- 支持类似 iOS 的滚动变化音效
- 支持类似 iOS 的 3D 效果
- 3D 效果下,支持圆弧偏移效果,使其看起来更加立体
- 支持嵌套滚动、循环滚动
- 丰富的滑动监听,支持选中监听、滚动状态改变监听等
- 两种分割线类型可以设置,还有其他分割线骚操作
- 支持自动调整字体大小以使得长文字显示完全
- 支持设置显示条目、设置字体大小、设置字体、设置行间距等常规操作
- 更多自定义操作尽在其中
implementation 'com.github.zyyoona7:wheelview:1.0.0'- 在布局文件中添加(Layout)
<com.zyyoona7.wheel.WheelView android:id="@+id/wheelview" android:layout_width="wrap_content" android:layout_height="wrap_content"/>- 在代码中(java code)
//泛型为数据类型 final WheelView<Integer> wheelView = findViewById(R.id.wheelview); //初始化数据 List<Integer> list = new ArrayList<>(1); for (int i = 0; i < 20; i++) { list.add(i); } //设置数据 wheelView.setData(list); //尽请使用各种方法 wheelView.setTextSize(24f,true); //more...问:我已经有了创建好的实体怎么办?
答:好办~
我已城市列表为例(其他实体同理)
我的城市列表实体是这样的:
public class CityEntity implements IWheelEntity, Serializable { //国家 public static final String LEVEL_COUNTRY = "country"; //省 public static final String LEVEL_PROVINCE = "province"; //市 public static final String LEVEL_CITY = "city"; //区 public static final String LEVEL_DISTRICT = "district"; private String citycode; private String adcode; private String name; private String center; private String level; private List<CityEntity> districts; public String getCitycode() { return citycode; } public void setCitycode(String citycode) { this.citycode = citycode; } public String getAdcode() { return adcode; } public void setAdcode(String adcode) { this.adcode = adcode; } public String getName() { return name == null ? "" : name; } public void setName(String name) { this.name = name; } public String getCenter() { return center; } public void setCenter(String center) { this.center = center; } public String getLevel() { return level; } public void setLevel(String level) { this.level = level; } public List<CityEntity> getDistricts() { return districts == null ? new ArrayList<CityEntity>(1) : districts; } public void setDistricts(List<CityEntity> districts) { this.districts = districts; } @Override public String toString() { return "CityEntity{" + "citycode='" + citycode + '\'' + ", adcode='" + adcode + '\'' + ", name='" + name + '\'' + ", center='" + center + '\'' + ", level='" + level + '\'' + ", districts=" + districts + '}'; } /** * 重点:重写此方法,返回 WheelView 显示的文字 * @return */ @Override public String getWheelText() { return name == null ? "" : name; } }注意,我的 CityEntity 中多实现了一个 IWheelEntity 接口,这个接口是在 WheelView 库中定义好的,实现之后在 getWheelText() 方法返回你想在 WheelView 中展示的字段就大功告成了。
MainActivity WheelView 相关代码:
WheelView<CityEntity> cityWv=findViewById(R.id.wv_city); //解析城市列表 List<CityEntity> cityData= ParseHelper.parseTwoLevelCityList(this); cityWv.setData(cityData);然后,效果图是这样的~

冷知识:其实不实现 IWheelEntity 也是可以的,偷偷给你们看下源码:
//WheelView.java /** * 获取item text * * @param item item数据 * @return 文本内容 */ protected String getDataText(T item) { if (item == null) { return ""; } else if (item instanceof IWheelEntity) { return ((IWheelEntity) item).getWheelText(); } else if (item instanceof Integer) { //如果为整形则最少保留两位数. return isIntegerNeedFormat ? String.format(Locale.getDefault(), mIntegerFormat, (Integer) item) : String.valueOf(item); } else if (item instanceof String) { return (String) item; } return item.toString(); }如果条件都不满足的话会默认执行 toString() 方法,所以理论上也可以在实体的 toString() 方法返回你想展示的字段,但是不推荐,毕竟 toString() 方法以我个人的习惯都是输出 CityEntity 那种的信息~你也可能输出别的信息。