-
Notifications
You must be signed in to change notification settings - Fork 97
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 那种的信息~你也可能输出别的信息。