天天看點

android仿iOS的PickerView控件,時間選擇器和選項選擇器Android-PickerView

Android-PickerView

介紹

這是一款仿iOS的PickerView控件,有時間選擇器和選項選擇器,新版本的詳細特性如下:

——TimePickerView 時間選擇器,支援年月日時分,年月日,年月,時分等格式。

——OptionsPickerView 選項選擇器,支援一,二,三級選項選擇,并且可以設定是否關聯 。

  • 支援三級關聯
  • 設定是否關聯
  • 設定循環模式
  • 支援自定義布局。
  • 支援item的分隔線設定。
  • 支援item間距設定。
  • 時間選擇器支援起始和終止日期設定。
  • 支援“年,月,日,時,分,秒”,“省,市,區”等選項的機關(label)顯示、隐藏和自定義。
  • 支援自定義文字、顔色、文字大小等屬性
  • Item的文字長度過長時,文字會自适應縮放到Item的長度,避免顯示不完全的問題
  • 支援Dialog 模式。
  • 支援自定義設定容器。
  • 實時回調。
android仿iOS的PickerView控件,時間選擇器和選項選擇器Android-PickerView
android仿iOS的PickerView控件,時間選擇器和選項選擇器Android-PickerView
android仿iOS的PickerView控件,時間選擇器和選項選擇器Android-PickerView

有興趣研究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();
            }
        });
           

效果圖(招行信用卡的“掌上生活”裡面條件選擇器他們用的就是我這個庫,大家可以當實際項目參考)

android仿iOS的PickerView控件,時間選擇器和選項選擇器Android-PickerView

繼續閱讀