Android 酷炫WheelView,日期時間選擇控件

開篇

??花了點時間親手擼了一個酷炫高質量的滾輪控件WheelView開源。掃描文中的二維碼下載體驗App。希望童鞋們能喜歡!

WheelView

性能盤點:

  • 1、繪制優化(繪制條數 = 顯示條數 + 2,不會過多繪制)
  • 2、支持各種數據類型(數據類型實現IWheel接口)
  • 3、支持點擊選中
  • 4、封裝了多列底部彈窗
  • 5、封裝了日期時間選擇底部彈出

效果截屏

wheel_view
column_dialog
date_time_dialog

立即體驗

掃描以下二維碼下載體驗App(體驗App內嵌版本更新檢測功能):


掃描下載體驗App

WheelViewLibrary傳送門:https://github.com/JustinRoom/WheelViewDemo

簡析源碼

本篇就不做源碼分析了

gradle引用

    compile 'jsc.kit.wheel:wheel-view:_latestVersion'

屬性

名稱 類型 描述
wheelTextColor color 選中item字體顏色
wheelTextSize dimension 字體大小
wheelShowCount integer 顯示item條數,與wheelItemVerticalSpace決定了控件的高度
wheelTotalOffsetX dimension X軸方向總彎曲度,決定弧形效果
wheelItemVerticalSpace dimension 兩個item之間的間距,與wheelShowCount決定了控件的高度
wheelRotationX float 已X軸為軸心旋轉角度,決定3D效果
wheelVelocityUnits integer 自動翻滾速度單位
名稱 類型 描述
wheelMaskLineColor color 中間選中item的兩條分割線顏色
子View 類型 屬性
wheelView WheelView WheelView所有屬性
wheelMaskView WheelMaskView WheelMaskView所有屬性

使用示例

組件 使用示例
WheelView WheelViewFragment
ColumnWheelDialog ColumnWheelFragment
DateTimeWheelDialog DateTimeWheelFragment
        <jsc.kit.wheel.base.WheelItemView
            android:id="@+id/wheel_view_left"
            android:layout_width="160dp"
            android:layout_height="wrap_content"
            app:wheelItemVerticalSpace="12dp"
            app:wheelTotalOffsetX="12dp" />

        <jsc.kit.wheel.base.WheelView
            android:id="@+id/wheel_view_left"
            android:layout_width="160dp"
            android:layout_height="wrap_content"
            app:wheelItemVerticalSpace="12dp"
            app:wheelTotalOffsetX="-12dp" />
  • 2、 ColumnWheelDialog
    多列互不關聯底部彈窗,最多支持5列。相應的列有數據則顯示,無數據則不顯示。
    private ColumnWheelDialog showDialog() {
        ColumnWheelDialog<WheelItem, WheelItem, WheelItem, WheelItem, WheelItem> dialog = new ColumnWheelDialog<>(getActivity());
        dialog.show();
        dialog.setTitle("選擇菜單");
        dialog.setCancelButton("取消", null);
        dialog.setOKButton("確定", new ColumnWheelDialog.OnClickCallBack<WheelItem, WheelItem, WheelItem, WheelItem, WheelItem>() {
            @Override
            public boolean callBack(View v, @Nullable WheelItem item0, @Nullable WheelItem item1, @Nullable WheelItem item2, @Nullable WheelItem item3, @Nullable WheelItem item4) {
                return false;
            }
        });
                dialog.setItems(
                        initItems("菜單選項一"),
                        initItems("菜單選項二"),
                        initItems("菜單選項三"),
                        initItems("菜單選項四"),
                        initItems("菜單選項五")
                );
                dialog.setSelected(
                        new Random().nextInt(50),
                        new Random().nextInt(50),
                        new Random().nextInt(50),
                        new Random().nextInt(50),
                        new Random().nextInt(50)
                );

    private WheelItem[] initItems(String label) {
        final WheelItem[] items = new WheelItem[50];
        for (int i = 0; i < 50; i++) {
            items[i] = new WheelItem(label + (i < 10 ? "0" + i : "" + i));
        }
        return items;
    }
private DateTimeWheelDialog showDialog(int type) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, 2015);
        calendar.set(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        Date startDate = calendar.getTime();
        calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, 2020);
        Date endDate = calendar.getTime();

        DateTimeWheelDialog dialog = new DateTimeWheelDialog(getActivity());
        dialog.show();
        dialog.setTitle("選擇時間");
        int config = DateTimeWheelDialog.SHOW_YEAR_MONTH_DAY_HOUR_MINUTE;
        switch (type) {
            case 1://只顯示年
                config = DateTimeWheelDialog.SHOW_YEAR;
                break;
            case 2://顯示年、月
                config = DateTimeWheelDialog.SHOW_YEAR_MONTH;
                break;
            case 3://顯示年、月、日
                config = DateTimeWheelDialog.SHOW_YEAR_MONTH_DAY;
                break;
            case 4://顯示年、月、日、時
                config = DateTimeWheelDialog.SHOW_YEAR_MONTH_DAY_HOUR;
                break;
            case 5://顯示年、月、日、時、分
                config = DateTimeWheelDialog.SHOW_YEAR_MONTH_DAY_HOUR_MINUTE;
                break;
        }
        dialog.configShowUI(config);
        dialog.setCancelButton("取消", null);
        dialog.setOKButton("確定", new DateTimeWheelDialog.OnClickCallBack() {
            @Override
            public boolean callBack(View v, @NonNull Date selectedDate) {
                tvResult.setText(SimpleDateFormat.getInstance().format(selectedDate));
                return false;
            }
        });
        dialog.setDateArea(startDate, endDate, true);
        dialog.updateSelectedDate(new Date());
    }

使用介紹就到這里。
從0擼出這個開源庫不容易,希望童鞋們在GitHub上給一顆星星?支持下。謝謝!如果在使用過程中不懂(或需要改進的地方),可以在評論里給我留言,也可以聯系我。
微信:eoy9527QQ:1006368252
平時可能很少登錄QQ。

篇尾

有所作為是生活的最高境界。 —— 恩格斯

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,150評論 25 708
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,897評論 2 59
  • 很久沒有寫東西了,感覺卡在瓶頸太久,卻也始終找不到突破的方法,只渾渾噩噩地勉強過活著,每天淹沒在繁雜的事物當中,做...
    唐泫然閱讀 358評論 0 2
  • 所有的光芒,都需要時間才能被看到。今天是感恩節,我想對你說,謝謝你出現在我身邊! [抱拳]
    如意M閱讀 549評論 0 0
  • 2017年7月16日 陣雨 星期日 昨晚睡覺時腿肚子又抽筋了,也不知道是缺鈣的原因,還是別的什么?一陣...
    蘇桐媽媽閱讀 368評論 6 15