Android-PickerView
介紹
這是一款仿iOS的PickerView控件,有時間選擇器和選項選擇器,新版本的詳細特性如下:
——TimePickerView 時間選擇器,支援年月日時分,年月日,年月,時分等格式。
——OptionsPickerView 選項選擇器,支援一,二,三級選項選擇,并且可以設定是否關聯 。
- 支援三級關聯
- 設定是否關聯
- 設定循環模式
- 支援自定義布局。
- 支援item的分隔線設定。
- 支援item間距設定。
- 時間選擇器支援起始和終止日期設定。
- 支援“年,月,日,時,分,秒”,“省,市,區”等選項的機關(label)顯示、隐藏和自定義。
- 支援自定義文字、顔色、文字大小等屬性
- Item的文字長度過長時,文字會自适應縮放到Item的長度,避免顯示不完全的問題
- 支援Dialog 模式。
- 支援自定義設定容器。
- 實時回調。
有興趣研究3D滾輪效果的實作機制,希望把源碼研究透徹的可以看看這篇部落格:
Android-PickerView系列之源碼解析篇(二)
使用注意事項
- 注意:當我們進行設定時間的啟始位置時,需要特别注意月份的設定
- 原因:Calendar元件内部的月份,是從0開始的,即0-11代表1-12月份
- 錯誤使用案例: startDate.set(2013,1,1); endDate.set(2020,12,1);
- 正确使用案例: startDate.set(2013,0,1); endDate.set(2020,11,1);
V4.1.8 版本更新說明(2019-4-24)
- 更新gradle版本, wheelview基礎庫由 compile 改為 api 依賴,避免gradle 5.0+版本無法引入。
- 修複 setTextXOffset 指派問題。
V4.1.7 版本更新說明(2019-1-10)
- 修複 WheelView在初始化時,資料為空導緻height=0,造成一直顯示不出來的問題。
- 新增取消按鈕的點選事件監聽入口。
- 參數注解添加,規範資料類型。
- 廢棄setBackgroundId方法, 更新方法命名為 setOutSideColor。
V4.1.6 版本更新說明(2018-7-24)
- 優化wheelview 分割線設定 0x00000000 透明色不生效的問題。
- 優化部分文字基線位置偏低,導緻選中項文字顯示不全問題,如 "g" 字母。
更多曆史版本詳情,請查閱:更新日志(4.x版本)
方法名與參數請查閱:方法名與參數說明文檔
如何使用:
Android-PickerView 庫使用示例:
1.添加Jcenter倉庫 Gradle依賴:
compile 'com.contrarywind:Android-PickerView:4.1.8'
或者
Maven
<dependency>
<groupId>com.contrarywind</groupId>
<artifactId>Android-PickerView</artifactId>
<version>4.1.8</version>
<type>pom</type>
</dependency>
2.在項目中添加如下代碼:
//時間選擇器
TimePickerView pvTime = new TimePickerBuilder(MainActivity.this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
Toast.makeText(MainActivity.this, getTime(date), Toast.LENGTH_SHORT).show();
}
}).build();
//條件選擇器
OptionsPickerView pvOptions = new OptionsPickerBuilder(MainActivity.this, new OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3 ,View v) {
//傳回的分别是三個級别的選中位置
String tx = options1Items.get(options1).getPickerViewText()
+ options2Items.get(options1).get(option2)
+ options3Items.get(options1).get(option2).get(options3).getPickerViewText();
tvOptions.setText(tx);
}
}).build();
pvOptions.setPicker(options1Items, options2Items, options3Items);
pvOptions.show();
大功告成~
3.如果預設樣式不符合你的口味,可以自定義各種屬性:
Calendar selectedDate = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
//startDate.set(2013,1,1);
Calendar endDate = Calendar.getInstance();
//endDate.set(2020,1,1);
//正确設定方式 原因:注意事項有說明
startDate.set(2013,0,1);
endDate.set(2020,11,31);
pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date,View v) {//選中事件回調
tvTime.setText(getTime(date));
}
})
.setType(new boolean[]{true, true, true, true, true, true})// 預設全部顯示
.setCancelText("Cancel")//取消按鈕文字
.setSubmitText("Sure")//确認按鈕文字
.setContentSize(18)//滾輪文字大小
.setTitleSize(20)//标題文字大小
.setTitleText("Title")//标題文字
.setOutSideCancelable(false)//點選螢幕,點在控件外部範圍時,是否取消顯示
.isCyclic(true)//是否循環滾動
.setTitleColor(Color.BLACK)//标題文字顔色
.setSubmitColor(Color.BLUE)//确定按鈕文字顔色
.setCancelColor(Color.BLUE)//取消按鈕文字顔色
.setTitleBgColor(0xFF666666)//标題背景顔色 Night mode
.setBgColor(0xFF333333)//滾輪背景顔色 Night mode
.setDate(selectedDate)// 如果不設定的話,預設是系統時間*/
.setRangDate(startDate,endDate)//起始終止年月日設定
.setLabel("年","月","日","時","分","秒")//預設設定為年月日時分秒
.isCenterLabel(false) //是否隻顯示中間選中項的label文字,false則每項item全部都帶有label。
.isDialog(true)//是否顯示為對話框樣式
.build();
pvOptions = new OptionsPickerBuilder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3 ,View v) {
//傳回的分别是三個級别的選中位置
String tx = options1Items.get(options1).getPickerViewText()
+ options2Items.get(options1).get(option2)
+ options3Items.get(options1).get(option2).get(options3).getPickerViewText();
tvOptions.setText(tx);
}
}) .setOptionsSelectChangeListener(new OnOptionsSelectChangeListener() {
@Override
public void onOptionsSelectChanged(int options1, int options2, int options3) {
String str = "options1: " + options1 + "\noptions2: " + options2 + "\noptions3: " + options3;
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
}
})
.setSubmitText("确定")//确定按鈕文字
.setCancelText("取消")//取消按鈕文字
.setTitleText("城市選擇")//标題
.setSubCalSize(18)//确定和取消文字大小
.setTitleSize(20)//标題文字大小
.setTitleColor(Color.BLACK)//标題文字顔色
.setSubmitColor(Color.BLUE)//确定按鈕文字顔色
.setCancelColor(Color.BLUE)//取消按鈕文字顔色
.setTitleBgColor(0xFF333333)//标題背景顔色 Night mode
.setBgColor(0xFF000000)//滾輪背景顔色 Night mode
.setContentTextSize(18)//滾輪文字大小
.setLinkage(false)//設定是否關聯,預設true
.setLabels("省", "市", "區")//設定選擇的三級機關
.isCenterLabel(false) //是否隻顯示中間選中項的label文字,false則每項item全部都帶有label。
.setCyclic(false, false, false)//循環與否
.setSelectOptions(1, 1, 1) //設定預設選中項
.setOutSideCancelable(false)//點選外部dismiss default true
.isDialog(true)//是否顯示為對話框樣式
.isRestoreItem(true)//切換時是否還原,設定預設選中第一項。
.build();
pvOptions.setPicker(options1Items, options2Items, options3Items);//添加資料源
4.如果需要自定義布局:
// 注意:自定義布局中,id為 optionspicker 或者 timepicker 的布局以及其子控件必須要有,否則會報空指針
// 具體可參考demo 裡面的兩個自定義布局
pvCustomOptions = new OptionsPickerBuilder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3, View v) {
//傳回的分别是三個級别的選中位置
String tx = cardItem.get(options1).getPickerViewText();
btn_CustomOptions.setText(tx);
}
})
.setLayoutRes(R.layout.pickerview_custom_options, new CustomListener() {
@Override
public void customLayout(View v) {
//自定義布局中的控件初始化及事件處理
final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);
final TextView tvAdd = (TextView) v.findViewById(R.id.tv_add);
ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);
tvSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomOptions.returnData(tvSubmit);
}
});
ivCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomOptions.dismiss();
}
});
tvAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getData();
pvCustomOptions.setPicker(cardItem);
}
});
}
})
.build();
pvCustomOptions.setPicker(cardItem);//添加資料
5.對使用還有疑問的話,可參考demo代碼
請戳我檢視demo代碼
6.若隻需要WheelView基礎控件自行擴充實作邏輯,可直接添加基礎控件庫,Gradle 依賴:
compile 'com.contrarywind:wheelview:4.0.9'
WheelView 使用代碼示例:
xml布局:
<com.contrarywind.view.WheelView
android:id="@+id/wheelview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Java 代碼:
WheelView wheelView = findViewById(R.id.wheelview);
wheelView.setCyclic(false);
final List<String> mOptionsItems = new ArrayList<>();
mOptionsItems.add("item0");
mOptionsItems.add("item1");
mOptionsItems.add("item2");
wheelView.setAdapter(new ArrayWheelAdapter(mOptionsItems));
wheelView.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(int index) {
Toast.makeText(MainActivity.this, "" + mOptionsItems.get(index), Toast.LENGTH_SHORT).show();
}
});