MCPcopy
hub / github.com/gzu-liyujiang/AndroidPicker

github.com/gzu-liyujiang/AndroidPicker @4.1.15 sqlite

repository ↗ · DeepWiki ↗ · release 4.1.15 ↗
1,615 symbols 4,107 edges 169 files 530 documented · 33%
README

# AndroidPicker

API 19+ Release APK

安卓选择器类库,包括日期及时间选择器(可用于出生日期、营业时间等)、单项选择器(可用于性别、民族、职业、学历、星座等)、二三级联动选择器(可用于车牌号、基金定投日期等)、城市地址选择器(分省级、地市级及区县级)、数字选择器(可用于年龄、身高、体重、温度等)、日历选日期择器(可用于酒店及机票预定日期)、颜色选择器、文件及目录选择器等……

【抱歉!各位小伙伴,从2022年开始我已经没做安卓开发了,项目虽然已经趋于稳定,不过需要大家参与维护,多提PullRequest,我目前已经没法贡献代码了】

欢迎大伙儿在Issues提交你的意见或建议。欢迎 Fork & Pull requests 贡献您的代码,大家共同学习【AndroidPicker 交流群 604235437】。

接入指引

最新版本jitpack (具体历史版本号参见 更新日志

注意事项

依赖配置

在项目根目录下的build.gradle

如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入:

allprojects {
    repositories {
        // JitPack 远程仓库:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}

如果你的 Gradle 配置是 7.0 及以上,则需要在 settings.gradle 文件中加入:

dependencyResolutionManagement {
    repositories {
        // JitPack 远程仓库:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}

在项目模块下的build.gradle中(以下依赖项不必全部引入,请按需来)

所有选择器的基础窗体(用于自定义弹窗):

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:<version>'
}

滚轮选择器的滚轮控件(用于自定义滚轮选择器):

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelView:<version>'
}

单项/数字、二三级联动、日期/时间等滚轮选择器:

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:<version>'
}

省市区地址选择器:

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:AddressPicker:<version>'
}

文件/目录选择器:

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:FilePicker:<version>'
}

颜色选择器:

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:ColorPicker:<version>'
}

日历日期选择器(README.md):

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:CalendarPicker:<version>'
}

图片选择器(README.md):

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:ImagePicker:<version>'
}

旧版本 AndroidX 稳定版本 (不推荐):

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:2.0.0'
    implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:2.0.0'
    implementation 'com.github.gzu-liyujiang.AndroidPicker:FilePicker:2.0.0'
    implementation 'com.github.gzu-liyujiang.AndroidPicker:ColorPicker:2.0.0'
}

旧版本 Support 稳定版本 (不推荐):

dependencies {
    implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:1.5.6.20181018'
    implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:1.5.6.20181018'
    implementation 'com.github.gzu-liyujiang.AndroidPicker:FilePicker:1.5.6.20181018'
    implementation 'com.github.gzu-liyujiang.AndroidPicker:ColorPicker:1.5.6.20181018'
}

API 说明

API 说明文档

混淆规则

项目库混淆无需额外配置。

用法示例

常见用法请参阅 demo高级用法请细读源码, 诸如可以重写同名的assets/china_address.json来自定义省市区数据, 重写同名的DialogSheetAnimation来自定义弹窗动画……。 代码是最好的老师,强烈建议拉取代码运行,尝试修改 demo 对比查看实际效果以便加深理解。

在 Java 中

List<GoodsCategoryBean> data = new ArrayList<>();
data.add(new GoodsCategoryBean(1, "食品生鲜"));
data.add(new GoodsCategoryBean(2, "家用电器"));
data.add(new GoodsCategoryBean(3, "家居生活"));
data.add(new GoodsCategoryBean(4, "医疗保健"));
data.add(new GoodsCategoryBean(5, "酒水饮料"));
data.add(new GoodsCategoryBean(6, "图书音像"));
OptionPicker picker = new OptionPicker(this);
picker.setTitle("货物分类");
picker.setBodyWidth(140);
picker.setData(data);
picker.setDefaultPosition(2);
picker.setOnOptionPickedListener(this);
//OptionWheelLayout wheelLayout = picker.getWheelLayout();
//wheelLayout.setIndicatorEnabled(false);
//wheelLayout.setTextColor(0xFFFF00FF);
//wheelLayout.setSelectedTextColor(0xFFFF0000);
//wheelLayout.setTextSize(15 * view.getResources().getDisplayMetrics().scaledDensity);
//wheelLayout.setSelectedTextBold(true);
//wheelLayout.setCurtainEnabled(true);
//wheelLayout.setCurtainColor(0xEEFF0000);
//wheelLayout.setCurtainCorner(CurtainCorner.ALL);
//wheelLayout.setCurtainRadius(5 * view.getResources().getDisplayMetrics().density);
//wheelLayout.setOnOptionSelectedListener(new OnOptionSelectedListener() {
//    @Override
//    public void onOptionSelected(int position, Object item) {
//        picker.getTitleView().setText(picker.getWheelView().formatItem(position));
//    }
//});
picker.show();
DatePicker picker = new DatePicker(this);
//picker.setBodyWidth(240);
//DateWheelLayout wheelLayout = picker.getWheelLayout();
//wheelLayout.setDateMode(DateMode.YEAR_MONTH_DAY);
//wheelLayout.setDateLabel("年", "月", "日");
//wheelLayout.setDateFormatter(new UnitDateFormatter());
//wheelLayout.setRange(DateEntity.target(2021, 1, 1), DateEntity.target(2050, 12, 31), DateEntity.today());
//wheelLayout.setCurtainEnabled(true);
//wheelLayout.setCurtainColor(0xFFCC0000);
//wheelLayout.setIndicatorEnabled(true);
//wheelLayout.setIndicatorColor(0xFFFF0000);
//wheelLayout.setIndicatorSize(view.getResources().getDisplayMetrics().density * 2);
//wheelLayout.setTextColor(0xCCCC0000);
//wheelLayout.setSelectedTextColor(0xFFFF0000);
//wheelLayout.getYearLabelView().setTextColor(0xFF999999);
//wheelLayout.getMonthLabelView().setTextColor(0xFF999999);
picker.getWheelLayout().setResetWhenLinkage(false);
picker.setOnDatePickedListener(this);
picker.show();
AddressPicker picker = new AddressPicker(this);
picker.setAddressMode(AddressMode.PROVINCE_CITY);
//picker.setAddressMode("china_address_guizhou_city.json", AddressMode.PROVINCE_CITY,
//        new AddressJsonParser.Builder()
//                .provinceCodeField("code")
//                .provinceNameField("name")
//                .provinceChildField("city")
//                .cityCodeField("code")
//                .cityNameField("name")
//                .cityChildField("area")
//                .countyCodeField("code")
//                .countyNameField("name")
//                .build());
//picker.setTitle("贵州省地址选择");
//picker.setDefaultValue("贵州省", "毕节市", "纳雍县");
picker.setOnAddressPickedListener(this);
//LinkageWheelLayout wheelLayout = picker.getWheelLayout();
//wheelLayout.setTextSize(15 * view.getResources().getDisplayMetrics().scaledDensity);
//wheelLayout.setSelectedTextBold(true);
//wheelLayout.setIndicatorEnabled(false);
//wheelLayout.setCurtainEnabled(true);
//wheelLayout.setCurtainColor(0xEE0081FF);
//wheelLayout.setCurtainRadius(5 * view.getResources().getDisplayMetrics().density);
//int padding = (int) (10 * view.getResources().getDisplayMetrics().density);
//wheelLayout.setPadding(padding, 0, padding, 0);
//wheelLayout.setOnLinkageSelectedListener(new OnLinkageSelectedListener() {
//    @Override
//    public void onLinkageSelected(Object first, Object second, Object third) {
//        picker.getTitleView().setText(String.format("%s%s%s",
//                picker.getProvinceWheelView().formatItem(first),
//                picker.getCityWheelView().formatItem(second),
//                picker.getCountyWheelView().formatItem(third)));
//    }
//});
//picker.getProvinceWheelView().setCurtainCorner(CurtainCorner.LEFT);
//picker.getCityWheelView().setCurtainCorner(CurtainCorner.RIGHT);
picker.show();

在 XML 中

<com.github.gzuliyujiang.wheelview.widget.WheelView
    android:id="@+id/wheel_view"
    android:layout_width="117dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    app:wheel_atmosphericEnabled="true"
    app:wheel_curvedEnabled="true"
    app:wheel_curvedIndicatorSpace="4dp"
    app:wheel_curvedMaxAngle="60"
    app:wheel_indicatorColor="#FF0081FF"
    app:wheel_itemSpace="50dp"
    app:wheel_itemTextColor="#FF474747"
    app:wheel_itemTextColorSelected="#FF0081FF"
    app:wheel_itemTextSize="20sp" />
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <com.github.gzuliyujiang.wheelpicker.widget.OptionWheelLayout
        android:id="@+id/wheel_option"
        android:layout_width="90dp"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal"
        app:wheel_itemTextAlign="center" />

    <com.github.gzuliyujiang.wheelpicker.widget.DateWheelLayout
        android:layout_width="120dp"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal"
        app:wheel_dateMode="month_day"
        app:wheel_dayLabel="日"
        app:wheel_monthLabel="月" />

    ...

</LinearLayout>

自定义样式(可选)

全局配置所有选择器样式及配色

//4.0.0版本开始内置支持四种弹窗样式(Default、One、Two、Three),效果可运行Demo查看
public class DemoApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        DialogConfig.setDialogStyle(DialogStyle.Default);
        DialogConfig.setDialogColor(new DialogColor()
                .cancelTextColor(0xFF999999)
                .okTextColor(0xFF0099CC));
    }

}

自定义 style

  • 调用setStyle(只作用于当前选择器,推荐)

app/.../res/values/styles.xml中参考WheelDefault写个style,然后设置。

picker.getWheelView().setStyle(R.style.WheelStyleDemo);
  • 重写WheelDefault覆盖 (所有选择器都会生效,不推荐)

app/.../res/values/styles.xml重写WheelDefault覆盖

<style name="WheelDefault">
    <item name="wheel_itemSpace">15dp</item>
    <item name="wheel_itemTextColor">@android:color/darker_gray</item>
    <item name="wheel_itemTextColorSelected">@android:color/holo_blue_dark</item>
    <item name="wheel_itemTextSize">16sp</item>
    <item name="wheel_itemTextSizeSelected">18sp</item>
    <item name="wheel_itemTextBoldSelected">false</item>
    <item name="wheel_sameWidthEnabled">false</item>
    <item name="wheel_atmosphericEnabled">true</item>
    <item name="wheel_curtainEnabled">false</item>
    <item name="wheel_curtainColor">#FFDEDEDE</item>
    <item name="wheel_curvedEnabled">false</item>
    <item name="wheel_curvedMaxAngle">90</item>
    <item name="wheel_cyclicEnabled">false</item>
    <item name="wheel_indicatorEnabled">true</item>
    <item name="wheel_indicatorColor">@android:color/holo_blue_light</item>
    <item name="wheel_indicatorSize">1dp</item>
</style>

在Java中集成重写某一选择器样式及配色

//仿蚂蚁财富APP定投周期选择弹窗样式
public class AntFortuneLikePicker extends LinkagePicker {
    private int lastDialogStyle;

    public AntFortuneLikePicker(@NonNull Activity activity) {
        super(activity);
    }

    @Override
    protected void onInit(@NonNull Context context) {
        super.onInit(context);
        lastDialogStyle = DialogConfig.getDialogStyle();
        DialogConfig.setDialogStyle(DialogStyle.Default);
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        DialogConfig.setDialogStyle(lastDialogStyle);
    }

    @Override
    protected void initData() {
        super.initData();
        setBackgroundColor(0xFFFFFFFF);
        cancelView.setText("取消");
        cancelView.setTextSize(16);
        cancelView.setTextColor(0xFF0081FF);
        okView.setTextColor(0xFF0081FF);
        okView.setText("确定");
        okView.setTextSize(16);
        titleView.setTextColor(0xFF333333);
        titleView.setText("定投周期");
        titleView.setTextSize(16);
        wheelLayout.setData(new AntFortuneLikeProvider());
        wheelLayout.setAtmosphericEnabled(true);
        wheelLayout.setVisibleItemCount(7);
        wheelLayout.setCyclicEnabled(false);
        wheelLayout.setIndicatorEnabled(true);
        wheelLayout.setIndicatorColor(0xFFDDDDDD);
        wheelLayout.setIndicatorSize((int) (contentView.getResources().getDisplayMetrics().density * 1));
        wheelLayout.setTextColor(0xFF999999);
        wheelLayout.setSelectedTextColor(0xFF333333);
        wheelLayout.setCurtainEnabled(false);
        wheelLayout.setCurvedEnabled(false);
    }

}
````

### 和`DialogFragment`结合

`XXXPicker` 都继承自 `android.app.Dialog` ,因此可以直接和`androidx.fragment.app.DialogFragment`结合使用。

```java
public class OptionPickerFragment extends DialogFragment {

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        OptionPicker picker = new OptionPicker(requireActivity());
        picker.setData("土人", "里民子", "羡民", "穿青人", "不在56个民族之内", "未定民族");
        picker.setOnOptionPickedListener(new OnOptionPickedListener() {
            @Override
            public void onOptionPicked(int position, Object item) {
                Toast.makeText(requireContext(), item.toString(), Toast.LENGTH_SHORT).show();
            }
        });
        picker.getWheelView().setStyle(R.style.WheelStyleDemo);
        return picker;
    }

}

效果预览

以下图片显示的效果可能已修改过,实际效果请运行 demo 查看。

  • 效果图
  • 效果图
  • 效果图
  • 效果图
  • 效果图
  • 效果图
  • 效果图
  • 效果图
  • 效果图

特别鸣谢

Extension points exported contracts — how you extend this code

TextProvider (Interface)
提供显示的文本 @author 贵州山野羡民(1032694760@qq.com) @since 2019/5/14 20:01 [13 implementers]
WheelView/src/main/java/com/github/gzuliyujiang/wheelview/contract/TextProvider.java
LinkageProvider (Interface)
提供二级或三级联动数据 @author 贵州山野羡民(1032694760@qq.com) @since 2019/6/17 11:27 [6 implementers]
WheelPicker/src/main/java/com/github/gzuliyujiang/wheelpicker/contract/LinkageProvider.java
FestivalProvider (Interface)
@author 贵州山野羡民(1032694760@qq.com) @since 2021/10/28 9:52 [8 implementers]
CalendarPicker/src/main/java/com/github/gzuliyujiang/calendarpicker/core/FestivalProvider.java
OnColorChangedListener (Interface)
@author 贵州山野羡民(1032694760@qq.com) @since 2015/7/20 [4 implementers]
ColorPicker/src/main/java/com/github/gzuliyujiang/colorpicker/OnColorChangedListener.java
AddressLoader (Interface)
地址数据加载器 @author 贵州山野羡民(1032694760@qq.com) @since 2019/6/17 16:42 [4 implementers]
AddressPicker/src/main/java/com/github/gzuliyujiang/wheelpicker/contract/AddressLoader.java
OnFilePickedListener (Interface)
@author 贵州山野羡民(1032694760@qq.com) @since 2015/9/29 [2 implementers]
FilePicker/src/main/java/com/github/gzuliyujiang/filepicker/contract/OnFilePickedListener.java
CropWindowChangeListener (Interface)
Interface definition for a callback to be invoked when crop window rectangle is changing. [1 implementers]
ImagePicker/src/main/java/com/github/gzuliyujiang/imagepicker/CropOverlayView.java
WheelFormatter (Interface)
滚轮条目显示文本格式化接口 @author 贵州山野羡民(1032694760@qq.com) @since 2019/5/14 20:02 [6 implementers]
WheelView/src/main/java/com/github/gzuliyujiang/wheelview/contract/WheelFormatter.java

Core symbols most depended-on inside this repo

max
called by 80
CalendarPicker/src/main/java/com/github/gzuliyujiang/calendarpicker/core/DateUtils.java
min
called by 80
CalendarPicker/src/main/java/com/github/gzuliyujiang/calendarpicker/core/DateUtils.java
show
called by 60
Common/src/main/java/com/github/gzuliyujiang/dialog/BaseDialog.java
getTime
called by 56
WheelPicker/src/main/java/com/github/gzuliyujiang/wheelpicker/entity/DatimeEntity.java
print
called by 49
Common/src/main/java/com/github/gzuliyujiang/dialog/DialogLog.java
formatItem
called by 29
WheelView/src/main/java/com/github/gzuliyujiang/wheelview/contract/WheelFormatter.java
recycle
called by 28
CalendarPicker/src/main/java/com/github/gzuliyujiang/calendarpicker/core/DayEntity.java
setTextColor
called by 25
WheelView/src/main/java/com/github/gzuliyujiang/wheelview/widget/WheelView.java

Shape

Method 1,438
Class 131
Interface 41
Enum 5

Languages

Java100%

Modules by API surface

WheelView/src/main/java/com/github/gzuliyujiang/wheelview/widget/WheelView.java105 symbols
ImagePicker/src/main/java/com/github/gzuliyujiang/imagepicker/CropImageView.java80 symbols
ImagePicker/src/main/java/com/github/gzuliyujiang/imagepicker/CropOverlayView.java47 symbols
WheelPicker/src/main/java/com/github/gzuliyujiang/wheelpicker/widget/DatimeWheelLayout.java45 symbols
WheelPicker/src/main/java/com/github/gzuliyujiang/wheelpicker/widget/TimeWheelLayout.java42 symbols
ImagePicker/src/main/java/com/github/gzuliyujiang/imagepicker/ActivityBuilder.java37 symbols
WheelPicker/src/main/java/com/github/gzuliyujiang/wheelpicker/widget/BaseWheelLayout.java36 symbols
FilePicker/src/main/java/com/github/gzuliyujiang/filepicker/ExplorerConfig.java36 symbols
WheelPicker/src/main/java/com/github/gzuliyujiang/wheelpicker/widget/DateWheelLayout.java34 symbols
ImagePicker/src/main/java/com/github/gzuliyujiang/imagepicker/BitmapUtils.java32 symbols
Common/src/main/java/com/github/gzuliyujiang/dialog/BaseDialog.java31 symbols
ColorPicker/src/main/java/com/github/gzuliyujiang/colorpicker/ColorGradientView.java30 symbols

For agents

$ claude mcp add AndroidPicker \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact