[
  {
    "path": ".gitignore",
    "content": "# built application files\n*.apk\n*.ap_\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n\n# generated files\nbin/\ngen/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Eclipse project files\n.classpath\n.project\n\n# Android Studio\n.idea/\n.gradle\n/*/local.properties\n/*/out\nbuild\n/*/*/production\n*.iml\n*.iws\n*.ipr\n*~\n*.swp"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README-en.md",
    "content": "\n# Android-PickerView\n\n\n\n[![API](https://img.shields.io/badge/API-9%2B-brightgreen.svg)](https://android-arsenal.com/api?level=9) \n[![license](https://img.shields.io/hexpm/l/plug.svg)](http://www.apache.org/licenses/LICENSE-2.0)\n\n#### Show some :heart: and :stars: the repo to support the project\n[![GitHub stars](https://img.shields.io/github/stars/Bigkoo/Android-PickerView.svg?style=social)](https://github.com/Bigkoo/Android-PickerView/stargazers) [![GitHub forks](https://img.shields.io/github/forks/Bigkoo/Android-PickerView.svg?style=social)](https://github.com/Bigkoo/Android-PickerView/network) [![GitHub watchers](https://img.shields.io/github/watchers/Bigkoo/Android-PickerView.svg?style=social)](https://github.com/Bigkoo/Android-PickerView/watchers)\n\n#### [中文文档](https://github.com/Bigkoo/Android-PickerView/blob/master/README.md)\n\n## Introduction\n\nThis is a library for android to pick date or options like IOS system WheelView widget.\nand support for the linkage, dialog . It's very easy to use ,  you also can customize layout, which make it very customizable.\n\n\n* there are two options called OptionsPickerView and TimePickerView\n\n* OptionsPickerView supports three levels of linkage\n\n* TimePickerView support selection date range\n\n* support \"year, month, day, hour, minute, second\", \"provincial, city, district\" and other options of the unit (label) show or hide and customize label.\n\n* supports custom text, color, text size, etc.\n\n* If Item text length is too long, it will be adapted to the length of the Item to avoid the problem of incomplete display\n\n\n\n# How to use\n\n\n## 1.Add the dependency：\n\n### Gradle\n\n```java\ncompile 'com.contrarywind:Android-PickerView:4.1.9'\n```\n\n### Maven\n\n```\n<dependency>\n<groupId>com.contrarywind</groupId>\n<artifactId>Android-PickerView</artifactId>\n<version>4.1.8</version>\n<type>pom</type>\n</dependency>\n```\n\n## 2.Add the following code in your Activity：\n\n```java\n//TimePicker\n pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {\n            @Override\n            public void onTimeSelect(Date date,View v) {//Callback\n                tvTime.setText(getTime(date));\n            }\n        })\n             .build();\n pvTime.show();\n```\n\n```java\n//OptionsPicker\n pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {\n            @Override\n            public void onOptionsSelect(int options1, int option2, int options3 ,View v) {\n                ////Callback\n                String tx = options1Items.get(options1).getPickerViewText()\n                        + options2Items.get(options1).get(option2)\n                        + options3Items.get(options1).get(option2).get(options3).getPickerViewText();\n                tvOptions.setText(tx);\n            }\n        }).build();\n\n //pvOptions.setPicker(options1Items);\n pvOptions.setPicker(options1Items, options2Items);\n //pvOptions.setPicker(options1Items, options2Items, options3Items);\n pvOptions.show();\n```\n## Just so easy ~\n\n\n### Notes（2017-7-10）\n- when we start setting the date, we need to pay special attention.\n\n- reason: the internal component of the Calendar adds 1 processing, which made the month's number of  count reduced one.\n- error usage case:\n\n>StartDate.set (2013,1,1);\n\n>EndDate.set (2020,12,31);\n\n- correct use case:\n\n>StartDate.set (2013,0,1);\n\n>EndDate.set (2020,11,31);\n</br>\n\n\nIf the default style does not meet your expectations, You can also customize attributes to apply\n\n## Customize Useage：\n```java\n Calendar selectedDate = Calendar.getInstance();\n Calendar startDate = Calendar.getInstance();\n startDate.set(2013,0,1);\n Calendar endDate = Calendar.getInstance();\n endDate.set(2020,11,1);\n\n pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {\n            @Override\n            public void onTimeSelect(Date date,View v) {//callback\n                tvTime.setText(getTime(date));\n            }\n        })\n                .setType(new boolean[]{false, false, false, true, true, false})// type of date \n                .setCancelText(\"Cancel\")\n                .setSubmitText(\"Sure\")\n                .setContentSize(18)\n                .setTitleSize(20)\n                .setTitleText(\"Title\")\n                .setOutSideCancelable(false)// default is true\n                .isCyclic(true)// default is false\n                .setTitleColor(Color.BLACK)\n                .setSubmitColor(Color.BLUE)\n                .setCancelColor(Color.BLUE)\n                .setTitleBgColor(0xFF666666)//night mode\n                .setBgColor(0xFF333333)//night mode\n                .setRangDate(startDate,endDate)\n                .setLabel(\"year\",\"month\",\"day\",\"hours\",\"mins\",\"seconds\")\n                .build();\n```\n\n```java\npvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {\n            @Override\n            public void onOptionsSelect(int options1, int option2, int options3 ,View v) {\n                ////Callback\n                String tx = options1Items.get(options1).getPickerViewText()\n                        + options2Items.get(options1).get(option2)\n                        + options3Items.get(options1).get(option2).get(options3).getPickerViewText();\n                tvOptions.setText(tx);\n            }\n        })\n                .setSubmitText(\"sure\")\n                .setCancelText(\"cancel\")\n                .setTitleText(\"title\")\n                .setSubCalSize(18)\n                .setTitleSize(20)\n                .setTitleColor(Color.BLACK)\n                .setSubmitColor(Color.BLUE)\n                .setCancelColor(Color.BLUE)\n                .setTitleBgColor(0xFF666666)//night mode\n                .setBgColor(0xFF444444)//night mode\n                .setContentTextSize(18)\n                .setLinkage(false)\n                .isCenterLabel(false) //default is true , if you choose false , the label text will add to all item ContentText right\n                .setLabels(\"province\", \"city\", \"district\")\n                .setCyclic(false, false, false)\n                .setSelectOptions(0, 0, 0)  //default options\n                .setOutSideCancelable(false)//dismiss， default is true\n                .isRestoreItem(true)// restore option with first item when select changed。\n                .build();\n\n        pvOptions.setPicker(options1Items, options2Items, options3Items);\n```\n## Customize Layout：\n```java\n  private void initCustomTimePicker() {\n        // be careful：In the custom layout， the layout of the ID for optionspicker\n        // or TimePicker and its child widget must not be modified,\n        // otherwise  will be reported NullPointerException\n        // For more details， Please refer to the two custom layouts in demo\n\n        Calendar selectedDate = Calendar.getInstance();//System current time\n        Calendar startDate = Calendar.getInstance();\n        startDate.set(2013,1,23);\n        Calendar endDate = Calendar.getInstance();\n        endDate.set(2019,2,28);\n\n        pvCustomTime = new TimePickerBuilder(this, new OnTimeSelectListener() {\n            @Override\n            public void onTimeSelect(Date date, View v) {//call back\n                btn_CustomTime.setText(getTime(date));\n            }\n        })       .setType(new boolean[]{true, true, true, false, false, false})// year - month - day\n                .setDate(selectedDate)\n                .setRangDate(startDate,endDate)\n                .setLayoutRes(R.layout.pickerview_custom_time, new CustomListener() {\n\n                    @Override\n                    public void customLayout(View v) {\n                        final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);\n                        ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);\n                        tvSubmit.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomTime.returnData(tvSubmit);\n                            }\n                        });\n                        ivCancel.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomTime.dismiss();\n                            }\n                        });\n                    }\n                })\n                .setDividerColor(Color.BLACK)\n                .build();\n\n    }\n```\n\n## If you need to set the non-linkage data：\n\n```java\npvNoLinkOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {\n\n            @Override\n            public void onOptionsSelect(int options1, int options2, int options3, View v) {\n\n                String str = \"food:\"+food.get(options1)\n                        +\"\\nclothes:\"+clothes.get(options2)\n                        +\"\\ncomputer:\"+computer.get(options3);\n\n                Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();\n            }\n        }).build();\n        pvNoLinkOptions.setNPicker(food,clothes,computer);\n        pvNoLinkOptions.show();\n```\n\n## For more detail, please refer to the Demo code, If there is still doubt about you, please [New Issue](https://github.com/Bigkoo/Android-PickerView/issues) \n\n###  [Here is demo code](https://github.com/Bigkoo/Android-PickerView/blob/master/app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java)\n\n###  [Methods-and-parameters](https://github.com/Bigkoo/Android-PickerView/wiki/Methods-and-parameters)\n\n\n## Thanks\n\n- [WheelView](https://github.com/venshine/WheelView)\n- [androidWheelView](https://github.com/weidongjian/androidWheelView/)\n\n# License\n\n```\nCopyright 2014 Bigkoo\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n"
  },
  {
    "path": "README.md",
    "content": "## 注意⚠️：已停止更新，原有版本jcenter库可以继续使用。建议直接下载源码引入 module 到自己项目改造。\n\n## Android-PickerView\n[![API](https://img.shields.io/badge/API-9%2B-brightgreen.svg)](https://android-arsenal.com/api?level=9) \n[![License](https://img.shields.io/badge/license-Apache%202-green.svg)](https://www.apache.org/licenses/LICENSE-2.0)\n[![Download](https://api.bintray.com/packages/contrarywind/maven/Android-PickerView/images/download.svg) ](https://bintray.com/contrarywind/maven/Android-PickerView/_latestVersion)\n\n[![GitHub stars](https://img.shields.io/github/stars/Bigkoo/Android-PickerView.svg?style=social)](https://github.com/Bigkoo/Android-PickerView/stargazers) [![GitHub forks](https://img.shields.io/github/forks/Bigkoo/Android-PickerView.svg?style=social)](https://github.com/Bigkoo/Android-PickerView/network) [![GitHub watchers](https://img.shields.io/github/watchers/Bigkoo/Android-PickerView.svg?style=social)](https://github.com/Bigkoo/Android-PickerView/watchers)\n\n### [English Document](https://github.com/Bigkoo/Android-PickerView/blob/master/README-en.md)\n\n### 注意事项、详请使用方式、更新日志等，请查看 [Wiki文档](https://github.com/Bigkoo/Android-PickerView/wiki)\n**Wiki文档，Wiki文档，Wiki文档 !~ 重要的事情说三遍**\n\n#### 对于使用上有任何疑问或优化建议等，欢迎加入QQ群讨论交流技术问题。\n\n交流群1： 387051294（已满）\n\n交流群2： 219962328（已满）\n\n## 介绍\n\n这是一款仿iOS的PickerView控件，有时间选择器和选项选择器，新版本的详细特性如下：\n \n——TimePickerView  时间选择器，支持年月日时分，年月日，年月，时分等格式。   \n——OptionsPickerView  选项选择器，支持一，二，三级选项选择，并且可以设置是否联动 。\n\n* 支持三级联动\n* 设置是否联动 \n* 设置循环模式\n* 支持自定义布局。\n* 支持item的分隔线设置。\n* 支持item间距设置。\n* 时间选择器支持起始和终止日期设定。\n* 支持“年，月，日，时，分，秒”，“省，市，区”等选项的单位（label）显示、隐藏和自定义。\n* 支持自定义文字、颜色、文字大小等属性\n* Item的文字长度过长时，文字会自适应缩放到Item的长度，避免显示不完全的问题\n* 支持Dialog 模式。\n* 支持自定义设置容器。\n* 实时回调。\n\n\n![TimePicker.gif](https://github.com/Bigkoo/Android-PickerView/blob/master/preview/timepicker.gif)\n![TimePickerNight.gif](https://github.com/Bigkoo/Android-PickerView/blob/master/preview/timepicker_night.gif)\n![lunar.gif](https://github.com/Bigkoo/Android-PickerView/blob/master/preview/lunar.gif)\n![XOffset.png](https://github.com/Bigkoo/Android-PickerView/blob/master/preview/Screen%20Shot%202017-11-09%20at%204.25.02%20PM.png)\n![Province.gif](https://github.com/Bigkoo/Android-PickerView/blob/master/preview/JsonData.gif)\n![CustomLayout.gif](https://github.com/Bigkoo/Android-PickerView/blob/master/preview/CustomLayout.gif)\n\n\n### 有兴趣研究3D滚轮效果的实现机制，希望把源码研究透彻的可以看看这篇博客：\n### [Android-PickerView系列之源码解析篇（二）](http://blog.csdn.net/qq_22393017/article/details/59488906)\n\n### 使用注意事项\n* 注意：当我们进行设置时间的启始位置时，需要特别注意月份的设定\n* 原因：Calendar组件内部的月份，是从0开始的，即0-11代表1-12月份\n* 错误使用案例： \n  startDate.set(2013,1,1);\n  endDate.set(2020,12,1);\n* 正确使用案例：\n  startDate.set(2013,0,1);\n  endDate.set(2020,11,1);\n\n #### V4.1.9 版本更新说明（2019-10-20）\n   - 修复: 农历 day 偶现越界的问题。\n   - 优化: 显示布局中英文默认大写问题。\n   - 新增: 最大可见项的数目提供API给开发者设置。(setItemVisibleCount())\n   - 新增: 滚轮从中间到两边透明度渐变，提供开关API设置。（isAlphaGradient(true)）\n   - 新增: 选中项圆形分割线样式。（DividerType.CIRCLE）\n\n #### V4.1.8 版本更新说明（2019-4-24）\n -  更新gradle版本， wheelview基础库由 compile 改为 api 依赖，避免gradle 5.0+版本无法引入。\n -  修复 setTextXOffset 赋值问题。\n  \n #### V4.1.7 版本更新说明（2019-1-10）\n -  修复 WheelView在初始化时，数据为空导致height=0，造成一直显示不出来的问题。\n -  新增取消按钮的点击事件监听入口。\n -  参数注解添加，规范数据类型。\n -  废弃setBackgroundId方法， 更新方法命名为 setOutSideColor。\n\n\n#### 更多历史版本详情，请查阅：[更新日志（4.x版本）](https://github.com/Bigkoo/Android-PickerView/wiki/更新日志（4.x版本）) \n\n#### 方法名与参数请查阅：[方法名与参数说明文档](https://github.com/Bigkoo/Android-PickerView/wiki/%E6%96%B9%E6%B3%95%E5%90%8D%E4%B8%8E%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E%EF%BC%883.x%E7%89%88%E6%9C%AC%EF%BC%89)\n\n</br>\n\n### **如何使用：**\n\n#### Android-PickerView 库使用示例：\n\n#### 1.添加Jcenter仓库 Gradle依赖：\n```java\ncompile 'com.contrarywind:Android-PickerView:4.1.9'\n```\n或者\n\n#### Maven\n```\n<dependency>\n<groupId>com.contrarywind</groupId>\n<artifactId>Android-PickerView</artifactId>\n<version>4.1.9</version>\n<type>pom</type>\n</dependency>\n```\n\n#### 2.在项目中添加如下代码：\n\n```java\n//时间选择器\nTimePickerView pvTime = new TimePickerBuilder(MainActivity.this, new OnTimeSelectListener() {\n                           @Override\n                           public void onTimeSelect(Date date, View v) {\n                               Toast.makeText(MainActivity.this, getTime(date), Toast.LENGTH_SHORT).show();\n                           }\n                       }).build();\n```\n\n```java\n//条件选择器\n OptionsPickerView pvOptions = new OptionsPickerBuilder(MainActivity.this, new OnOptionsSelectListener() {\n            @Override\n            public void onOptionsSelect(int options1, int option2, int options3 ,View v) {\n                //返回的分别是三个级别的选中位置\n                String tx = options1Items.get(options1).getPickerViewText()\n                        + options2Items.get(options1).get(option2)\n                        + options3Items.get(options1).get(option2).get(options3).getPickerViewText();\n                tvOptions.setText(tx);\n            }\n        }).build();\n pvOptions.setPicker(options1Items, options2Items, options3Items);\n pvOptions.show(); \n```\n#### 大功告成~\n\n#### 3.如果默认样式不符合你的口味，可以自定义各种属性：\n```java\n Calendar selectedDate = Calendar.getInstance();\n Calendar startDate = Calendar.getInstance();\n //startDate.set(2013,1,1);\n Calendar endDate = Calendar.getInstance();\n //endDate.set(2020,1,1);\n \n  //正确设置方式 原因：注意事项有说明\n  startDate.set(2013,0,1);\n  endDate.set(2020,11,31);\n\n pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {\n            @Override\n            public void onTimeSelect(Date date,View v) {//选中事件回调\n                tvTime.setText(getTime(date));\n            }\n        })\n                .setType(new boolean[]{true, true, true, true, true, true})// 默认全部显示\n                .setCancelText(\"Cancel\")//取消按钮文字\n                .setSubmitText(\"Sure\")//确认按钮文字\n                .setContentSize(18)//滚轮文字大小\n                .setTitleSize(20)//标题文字大小\n                .setTitleText(\"Title\")//标题文字\n                .setOutSideCancelable(false)//点击屏幕，点在控件外部范围时，是否取消显示\n                .isCyclic(true)//是否循环滚动\n                .setTitleColor(Color.BLACK)//标题文字颜色\n                .setSubmitColor(Color.BLUE)//确定按钮文字颜色\n                .setCancelColor(Color.BLUE)//取消按钮文字颜色\n                .setTitleBgColor(0xFF666666)//标题背景颜色 Night mode\n                .setBgColor(0xFF333333)//滚轮背景颜色 Night mode\n                .setDate(selectedDate)// 如果不设置的话，默认是系统时间*/\n                .setRangDate(startDate,endDate)//起始终止年月日设定\n                .setLabel(\"年\",\"月\",\"日\",\"时\",\"分\",\"秒\")//默认设置为年月日时分秒\n                .isCenterLabel(false) //是否只显示中间选中项的label文字，false则每项item全部都带有label。\n                .isDialog(true)//是否显示为对话框样式\n                .build();\n```\n\n```java\npvOptions = new  OptionsPickerBuilder(this, new OptionsPickerView.OnOptionsSelectListener() {\n            @Override\n            public void onOptionsSelect(int options1, int option2, int options3 ,View v) {\n                //返回的分别是三个级别的选中位置\n                String tx = options1Items.get(options1).getPickerViewText()\n                        + options2Items.get(options1).get(option2)\n                        + options3Items.get(options1).get(option2).get(options3).getPickerViewText();\n                tvOptions.setText(tx);\n            }\n        }) .setOptionsSelectChangeListener(new OnOptionsSelectChangeListener() {\n                              @Override\n                              public void onOptionsSelectChanged(int options1, int options2, int options3) {\n                                  String str = \"options1: \" + options1 + \"\\noptions2: \" + options2 + \"\\noptions3: \" + options3;\n                                  Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();\n                              }\n                          })\n                .setSubmitText(\"确定\")//确定按钮文字\n                .setCancelText(\"取消\")//取消按钮文字\n                .setTitleText(\"城市选择\")//标题\n                .setSubCalSize(18)//确定和取消文字大小\n                .setTitleSize(20)//标题文字大小\n                .setTitleColor(Color.BLACK)//标题文字颜色\n                .setSubmitColor(Color.BLUE)//确定按钮文字颜色\n                .setCancelColor(Color.BLUE)//取消按钮文字颜色\n                .setTitleBgColor(0xFF333333)//标题背景颜色 Night mode\n                .setBgColor(0xFF000000)//滚轮背景颜色 Night mode\n                .setContentTextSize(18)//滚轮文字大小\n                .setLinkage(false)//设置是否联动，默认true\n                .setLabels(\"省\", \"市\", \"区\")//设置选择的三级单位\n                .isCenterLabel(false) //是否只显示中间选中项的label文字，false则每项item全部都带有label。\n                .setCyclic(false, false, false)//循环与否\n                .setSelectOptions(1, 1, 1)  //设置默认选中项\n                .setOutSideCancelable(false)//点击外部dismiss default true\n                .isDialog(true)//是否显示为对话框样式\n                .isRestoreItem(true)//切换时是否还原，设置默认选中第一项。\n                .build();\n\n        pvOptions.setPicker(options1Items, options2Items, options3Items);//添加数据源\n```\n#### 4.如果需要自定义布局：\n\n```java\n        // 注意：自定义布局中，id为 optionspicker 或者 timepicker 的布局以及其子控件必须要有，否则会报空指针\n        // 具体可参考demo 里面的两个自定义布局\n        pvCustomOptions = new OptionsPickerBuilder(this, new OptionsPickerView.OnOptionsSelectListener() {\n            @Override\n            public void onOptionsSelect(int options1, int option2, int options3, View v) {\n                //返回的分别是三个级别的选中位置\n                String tx = cardItem.get(options1).getPickerViewText();\n                btn_CustomOptions.setText(tx);\n            }\n        })\n                .setLayoutRes(R.layout.pickerview_custom_options, new CustomListener() {\n                    @Override\n                    public void customLayout(View v) {\n                        //自定义布局中的控件初始化及事件处理\n                        final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);\n                        final TextView tvAdd = (TextView) v.findViewById(R.id.tv_add);\n                        ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);\n                        tvSubmit.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomOptions.returnData(tvSubmit);\n                            }\n                        });\n                        ivCancel.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomOptions.dismiss();\n                            }\n                        });\n\n                        tvAdd.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                getData();\n                                pvCustomOptions.setPicker(cardItem);\n                            }\n                        });\n\n                    }\n                })\n                .build();\n        pvCustomOptions.setPicker(cardItem);//添加数据\n```\n\n#### 5.对使用还有疑问的话，可参考demo代码\n[请戳我查看demo代码](https://github.com/Bigkoo/Android-PickerView/blob/master/app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java)\n\n\n\n#### 6.若只需要WheelView基础控件自行扩展实现逻辑，可直接添加基础控件库，Gradle 依赖：\n \n```java\ncompile 'com.contrarywind:wheelview:4.1.0'\n```\n\n#### WheelView 使用代码示例：\n\nxml布局：\n```xml\n <com.contrarywind.view.WheelView\n            android:id=\"@+id/wheelview\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n```\n\nJava 代码：\n```java\nWheelView wheelView = findViewById(R.id.wheelview);\n\n        wheelView.setCyclic(false);\n\n        final List<String> mOptionsItems = new ArrayList<>();\n        mOptionsItems.add(\"item0\");\n        mOptionsItems.add(\"item1\");\n        mOptionsItems.add(\"item2\");\n  \n        wheelView.setAdapter(new ArrayWheelAdapter(mOptionsItems));\n        wheelView.setOnItemSelectedListener(new OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(int index) {\n                Toast.makeText(MainActivity.this, \"\" + mOptionsItems.get(index), Toast.LENGTH_SHORT).show();\n            }\n        });\n```\n\n\n### 效果图（招行信用卡的“掌上生活”里面条件选择器他们用的就是我这个库，大家可以当实际项目参考）\n![](https://github.com/saiwu-bigkoo/Android-PickerView/blob/master/preview/pickerdemo_zhangshangshenghuo.gif)\n\n\n### Thanks\n\n- WheelView\n- [androidWheelView](https://github.com/weidongjian/androidWheelView/)\n\n## License\n\n```\nCopyright 2014 Bigkoo\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 26\n\n    defaultConfig {\n        applicationId \"com.bigkoo.pickerviewdemo\"\n        minSdkVersion 14\n        targetSdkVersion 26\n        versionCode 1\n        versionName \"1.0\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    lintOptions{\n        checkReleaseBuilds false\n        abortOnError false\n    }\n}\n\ndependencies {\n//    compile fileTree(dir: 'libs', include: ['*.jar'])\n    implementation project(':pickerview')\n//   implementation 'com.contrarywind:Android-PickerView:4.1.9'\n//    implementation 'com.contrarywind:wheelview:4.1.0'\n    implementation 'com.android.support:appcompat-v7:26.1.0'\n    implementation 'com.google.code.gson:gson:2.7'\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/Sai/Documents/software/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "app/src/androidTest/java/com/bigkoo/pickerviewdemo/ApplicationTest.java",
    "content": "package com.bigkoo.pickerviewdemo;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bigkoo.pickerviewdemo\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\">\n        <activity\n            android:name=\".MainActivity\"\n            android:label=\"@string/app_name\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\".JsonDataActivity\"/>\n        <activity android:name=\".FragmentTestActivity\">\n\n\n        </activity>\n        <activity android:name=\".TestCircleWheelViewActivity\" />\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/assets/province.json",
    "content": "[\n  {\n    \"name\": \"北京市\",\n    \"city\": [\n      {\n        \"name\": \"北京市\",\n        \"area\": [\n          \"东城区\",\n          \"西城区\",\n          \"崇文区\",\n          \"宣武区\",\n          \"朝阳区\",\n          \"丰台区\",\n          \"石景山区\",\n          \"海淀区\",\n          \"门头沟区\",\n          \"房山区\",\n          \"通州区\",\n          \"顺义区\",\n          \"昌平区\",\n          \"大兴区\",\n          \"平谷区\",\n          \"怀柔区\",\n          \"密云县\",\n          \"延庆县\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"天津市\",\n    \"city\": [\n      {\n        \"name\": \"天津市\",\n        \"area\": [\n          \"和平区\",\n          \"河东区\",\n          \"河西区\",\n          \"南开区\",\n          \"河北区\",\n          \"红桥区\",\n          \"塘沽区\",\n          \"汉沽区\",\n          \"大港区\",\n          \"东丽区\",\n          \"西青区\",\n          \"津南区\",\n          \"北辰区\",\n          \"武清区\",\n          \"宝坻区\",\n          \"宁河县\",\n          \"静海县\",\n          \"蓟  县\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"河北省\",\n    \"city\": [\n      {\n        \"name\": \"石家庄市\",\n        \"area\": [\n          \"长安区\",\n          \"桥东区\",\n          \"桥西区\",\n          \"新华区\",\n          \"郊  区\",\n          \"井陉矿区\",\n          \"井陉县\",\n          \"正定县\",\n          \"栾城县\",\n          \"行唐县\",\n          \"灵寿县\",\n          \"高邑县\",\n          \"深泽县\",\n          \"赞皇县\",\n          \"无极县\",\n          \"平山县\",\n          \"元氏县\",\n          \"赵  县\",\n          \"辛集市\",\n          \"藁\",\n          \"晋州市\",\n          \"新乐市\",\n          \"鹿泉市\"\n        ]\n      },\n      {\n        \"name\": \"唐山市\",\n        \"area\": [\n          \"路南区\",\n          \"路北区\",\n          \"古冶区\",\n          \"开平区\",\n          \"新  区\",\n          \"丰润县\",\n          \"滦  县\",\n          \"滦南县\",\n          \"乐亭县\",\n          \"迁西县\",\n          \"玉田县\",\n          \"唐海县\",\n          \"遵化市\",\n          \"丰南市\",\n          \"迁安市\"\n        ]\n      },\n      {\n        \"name\": \"秦皇岛市\",\n        \"area\": [\n          \"海港区\",\n          \"山海关区\",\n          \"北戴河区\",\n          \"青龙满族自治县\",\n          \"昌黎县\",\n          \"抚宁县\",\n          \"卢龙县\"\n        ]\n      },\n      {\n        \"name\": \"邯郸市\",\n        \"area\": [\n          \"邯山区\",\n          \"丛台区\",\n          \"复兴区\",\n          \"峰峰矿区\",\n          \"邯郸县\",\n          \"临漳县\",\n          \"成安县\",\n          \"大名县\",\n          \"涉  县\",\n          \"磁  县\",\n          \"肥乡县\",\n          \"永年县\",\n          \"邱  县\",\n          \"鸡泽县\",\n          \"广平县\",\n          \"馆陶县\",\n          \"魏  县\",\n          \"曲周县\",\n          \"武安市\"\n        ]\n      },\n      {\n        \"name\": \"邢台市\",\n        \"area\": [\n          \"桥东区\",\n          \"桥西区\",\n          \"邢台县\",\n          \"临城县\",\n          \"内丘县\",\n          \"柏乡县\",\n          \"隆尧县\",\n          \"任  县\",\n          \"南和县\",\n          \"宁晋县\",\n          \"巨鹿县\",\n          \"新河县\",\n          \"广宗县\",\n          \"平乡县\",\n          \"威  县\",\n          \"清河县\",\n          \"临西县\",\n          \"南宫市\",\n          \"沙河市\"\n        ]\n      },\n      {\n        \"name\": \"保定市\",\n        \"area\": [\n          \"新市区\",\n          \"北市区\",\n          \"南市区\",\n          \"满城县\",\n          \"清苑县\",\n          \"涞水县\",\n          \"阜平县\",\n          \"徐水县\",\n          \"定兴县\",\n          \"唐  县\",\n          \"高阳县\",\n          \"容城县\",\n          \"涞源县\",\n          \"望都县\",\n          \"安新县\",\n          \"易  县\",\n          \"曲阳县\",\n          \"蠡  县\",\n          \"顺平县\",\n          \"博野\",\n          \"雄县\",\n          \"涿州市\",\n          \"定州市\",\n          \"安国市\",\n          \"高碑店市\"\n        ]\n      },\n      {\n        \"name\": \"张家口\",\n        \"area\": [\n          \"桥东区\",\n          \"桥西区\",\n          \"宣化区\",\n          \"下花园区\",\n          \"宣化县\",\n          \"张北县\",\n          \"康保县\",\n          \"沽源县\",\n          \"尚义县\",\n          \"蔚  县\",\n          \"阳原县\",\n          \"怀安县\",\n          \"万全县\",\n          \"怀来县\",\n          \"涿鹿县\",\n          \"赤城县\",\n          \"崇礼县\"\n        ]\n      },\n      {\n        \"name\": \"承德市\",\n        \"area\": [\n          \"双桥区\",\n          \"双滦区\",\n          \"鹰手营子矿区\",\n          \"承德县\",\n          \"兴隆县\",\n          \"平泉县\",\n          \"滦平县\",\n          \"隆化县\",\n          \"丰宁满族自治县\",\n          \"宽城满族自治县\",\n          \"围场满族蒙古族自治县\"\n        ]\n      },\n      {\n        \"name\": \"沧州市\",\n        \"area\": [\n          \"新华区\",\n          \"运河区\",\n          \"沧  县\",\n          \"青  县\",\n          \"东光县\",\n          \"海兴县\",\n          \"盐山县\",\n          \"肃宁县\",\n          \"南皮县\",\n          \"吴桥县\",\n          \"献  县\",\n          \"孟村回族自治县\",\n          \"泊头市\",\n          \"任丘市\",\n          \"黄骅市\",\n          \"河间市\"\n        ]\n      },\n      {\n        \"name\": \"廊坊市\",\n        \"area\": [\n          \"安次区\",\n          \"固安县\",\n          \"永清县\",\n          \"香河县\",\n          \"大城县\",\n          \"文安县\",\n          \"大厂回族自治县\",\n          \"霸州市\",\n          \"三河市\"\n        ]\n      },\n      {\n        \"name\": \"衡水市\",\n        \"area\": [\n          \"桃城区\",\n          \"枣强县\",\n          \"武邑县\",\n          \"武强县\",\n          \"饶阳县\",\n          \"安平县\",\n          \"故城县\",\n          \"景  县\",\n          \"阜城县\",\n          \"冀州市\",\n          \"深州市\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"山西省\",\n    \"city\": [\n      {\n        \"name\": \"太原市\",\n        \"area\": [\n          \"小店区\",\n          \"迎泽区\",\n          \"杏花岭区\",\n          \"尖草坪区\",\n          \"万柏林区\",\n          \"晋源区\",\n          \"清徐县\",\n          \"阳曲县\",\n          \"娄烦县\",\n          \"古交市\"\n        ]\n      },\n      {\n        \"name\": \"大同市\",\n        \"area\": [\n          \"城  区\",\n          \"矿  区\",\n          \"南郊区\",\n          \"新荣区\",\n          \"阳高县\",\n          \"天镇县\",\n          \"广灵县\",\n          \"灵丘县\",\n          \"浑源县\",\n          \"左云县\",\n          \"大同县\"\n        ]\n      },\n      {\n        \"name\": \"阳泉市\",\n        \"area\": [\n          \"城  区\",\n          \"矿  区\",\n          \"郊  区\",\n          \"平定县\",\n          \"盂  县\"\n        ]\n      },\n      {\n        \"name\": \"长治市\",\n        \"area\": [\n          \"城  区\",\n          \"郊  区\",\n          \"长治县\",\n          \"襄垣县\",\n          \"屯留县\",\n          \"平顺县\",\n          \"黎城县\",\n          \"壶关县\",\n          \"长子县\",\n          \"武乡县\",\n          \"沁  县\",\n          \"沁源县\",\n          \"潞城市\"\n        ]\n      },\n      {\n        \"name\": \"晋城市\",\n        \"area\": [\n          \"城  区\",\n          \"沁水县\",\n          \"阳城县\",\n          \"陵川县\",\n          \"泽州县\",\n          \"高平市\"\n        ]\n      },\n      {\n        \"name\": \"朔州市\",\n        \"area\": [\n          \"朔城区\",\n          \"平鲁区\",\n          \"山阴县\",\n          \"应  县\",\n          \"右玉县\",\n          \"怀仁县\"\n        ]\n      },\n      {\n        \"name\": \"忻州市\",\n        \"area\": [\n          \"忻府区\",\n          \"原平市\",\n          \"定襄县\",\n          \"五台县\",\n          \"代  县\",\n          \"繁峙县\",\n          \"宁武县\",\n          \"静乐县\",\n          \"神池县\",\n          \"五寨县\",\n          \"岢岚县\",\n          \"河曲县\",\n          \"保德县\",\n          \"偏关县\"\n        ]\n      },\n      {\n        \"name\": \"吕梁市\",\n        \"area\": [\n          \"离石区\",\n          \"孝义市\",\n          \"汾阳市\",\n          \"文水县\",\n          \"交城县\",\n          \"兴  县\",\n          \"临  县\",\n          \"柳林县\",\n          \"石楼县\",\n          \"岚  县\",\n          \"方山县\",\n          \"中阳县\",\n          \"交口县\"\n        ]\n      },\n      {\n        \"name\": \"晋中市\",\n        \"area\": [\n          \"榆次市\",\n          \"介休市\",\n          \"榆社县\",\n          \"左权县\",\n          \"和顺县\",\n          \"昔阳县\",\n          \"寿阳县\",\n          \"太谷县\",\n          \"祁  县\",\n          \"平遥县\",\n          \"灵石县\"\n        ]\n      },\n      {\n        \"name\": \"临汾市\",\n        \"area\": [\n          \"临汾市\",\n          \"侯马市\",\n          \"霍州市\",\n          \"曲沃县\",\n          \"翼城县\",\n          \"襄汾县\",\n          \"洪洞县\",\n          \"古  县\",\n          \"安泽县\",\n          \"浮山县\",\n          \"吉  县\",\n          \"乡宁县\",\n          \"蒲  县\",\n          \"大宁县\",\n          \"永和县\",\n          \"隰  县\",\n          \"汾西县\"\n        ]\n      },\n      {\n        \"name\": \"运城市\",\n        \"area\": [\n          \"运城市\",\n          \"永济市\",\n          \"河津市\",\n          \"芮城县\",\n          \"临猗县\",\n          \"万荣县\",\n          \"新绛县\",\n          \"稷山县\",\n          \"闻喜县\",\n          \"夏  县\",\n          \"绛  县\",\n          \"平陆县\",\n          \"垣曲县\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"内蒙古\",\n    \"city\": [\n      {\n        \"name\": \"呼和浩特市\",\n        \"area\": [\n          \"新城区\",\n          \"回民区\",\n          \"玉泉区\",\n          \"郊  区\",\n          \"土默特左旗\",\n          \"托克托县\",\n          \"和林格尔县\",\n          \"清水河县\",\n          \"武川县\"\n        ]\n      },\n      {\n        \"name\": \"包头市\",\n        \"area\": [\n          \"东河区\",\n          \"昆都伦区\",\n          \"青山区\",\n          \"石拐矿区\",\n          \"白云矿区\",\n          \"郊  区\",\n          \"土默特右旗\",\n          \"固阳县\",\n          \"达尔罕茂明安联合旗\"\n        ]\n      },\n      {\n        \"name\": \"乌海市\",\n        \"area\": [\n          \"海勃湾区\",\n          \"海南区\",\n          \"乌达区\"\n        ]\n      },\n      {\n        \"name\": \"赤峰市\",\n        \"area\": [\n          \"红山区\",\n          \"元宝山区\",\n          \"松山区\",\n          \"阿鲁科尔沁旗\",\n          \"巴林左旗\",\n          \"巴林右旗\",\n          \"林西县\",\n          \"克什克腾旗\",\n          \"翁牛特旗\",\n          \"喀喇沁旗\",\n          \"宁城县\",\n          \"敖汉旗\"\n        ]\n      },\n      {\n        \"name\": \"呼伦贝尔市\",\n        \"area\": [\n          \"海拉尔市\",\n          \"满洲里市\",\n          \"扎兰屯市\",\n          \"牙克石市\",\n          \"根河市\",\n          \"额尔古纳市\",\n          \"阿荣旗\",\n          \"莫力达瓦达斡尔族自治旗\",\n          \"鄂伦春自治旗\",\n          \"鄂温克族自治旗\",\n          \"新巴尔虎右旗\",\n          \"新巴尔虎左旗\",\n          \"陈巴尔虎旗\"\n        ]\n      },\n      {\n        \"name\": \"兴安盟\",\n        \"area\": [\n          \"乌兰浩特市\",\n          \"阿尔山市\",\n          \"科尔沁右翼前旗\",\n          \"科尔沁右翼中旗\",\n          \"扎赉特旗\",\n          \"突泉县\"\n        ]\n      },\n      {\n        \"name\": \"通辽市\",\n        \"area\": [\n          \"科尔沁区\",\n          \"霍林郭勒市\",\n          \"科尔沁左翼中旗\",\n          \"科尔沁左翼后旗\",\n          \"开鲁县\",\n          \"库伦旗\",\n          \"奈曼旗\",\n          \"扎鲁特旗\"\n        ]\n      },\n      {\n        \"name\": \"锡林郭勒盟\",\n        \"area\": [\n          \"二连浩特市\",\n          \"锡林浩特市\",\n          \"阿巴嘎旗\",\n          \"苏尼特左旗\",\n          \"苏尼特右旗\",\n          \"东乌珠穆沁旗\",\n          \"西乌珠穆沁旗\",\n          \"太仆寺旗\",\n          \"镶黄旗\",\n          \"正镶白旗\",\n          \"正蓝旗\",\n          \"多伦县\"\n        ]\n      },\n      {\n        \"name\": \"乌兰察布盟\",\n        \"area\": [\n          \"集宁市\",\n          \"丰镇市\",\n          \"卓资县\",\n          \"化德县\",\n          \"商都县\",\n          \"兴和县\",\n          \"凉城县\",\n          \"察哈尔右翼前旗\",\n          \"察哈尔右翼中旗\",\n          \"察哈尔右翼后旗\",\n          \"四子王旗\"\n        ]\n      },\n      {\n        \"name\": \"伊克昭盟\",\n        \"area\": [\n          \"东胜市\",\n          \"达拉特旗\",\n          \"准格尔旗\",\n          \"鄂托克前旗\",\n          \"鄂托克旗\",\n          \"杭锦旗\",\n          \"乌审旗\",\n          \"伊金霍洛旗\"\n        ]\n      },\n      {\n        \"name\": \"巴彦淖尔盟\",\n        \"area\": [\n          \"临河市\",\n          \"五原县\",\n          \"磴口县\",\n          \"乌拉特前旗\",\n          \"乌拉特中旗\",\n          \"乌拉特后旗\",\n          \"杭锦后旗\"\n        ]\n      },\n      {\n        \"name\": \"阿拉善盟\",\n        \"area\": [\n          \"阿拉善左旗\",\n          \"阿拉善右旗\",\n          \"额济纳旗\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"辽宁省\",\n    \"city\": [\n      {\n        \"name\": \"沈阳市\",\n        \"area\": [\n          \"沈河区\",\n          \"皇姑区\",\n          \"和平区\",\n          \"大东区\",\n          \"铁西区\",\n          \"苏家屯区\",\n          \"东陵区\",\n          \"于洪区\",\n          \"新民市\",\n          \"法库县\",\n          \"辽中县\",\n          \"康平县\",\n          \"新城子区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"大连市\",\n        \"area\": [\n          \"西岗区\",\n          \"中山区\",\n          \"沙河口区\",\n          \"甘井子区\",\n          \"旅顺口区\",\n          \"金州区\",\n          \"瓦房店市\",\n          \"普兰店市\",\n          \"庄河市\",\n          \"长海县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"鞍山市\",\n        \"area\": [\n          \"铁东区\",\n          \"铁西区\",\n          \"立山区\",\n          \"千山区\",\n          \"海城市\",\n          \"台安县\",\n          \"岫岩满族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"抚顺市\",\n        \"area\": [\n          \"顺城区\",\n          \"新抚区\",\n          \"东洲区\",\n          \"望花区\",\n          \"抚顺县\",\n          \"清原满族自治县\",\n          \"新宾满族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"本溪市\",\n        \"area\": [\n          \"平山区\",\n          \"明山区\",\n          \"溪湖区\",\n          \"南芬区\",\n          \"本溪满族自治县\",\n          \"桓仁满族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"丹东市\",\n        \"area\": [\n          \"振兴区\",\n          \"元宝区\",\n          \"振安区\",\n          \"东港市\",\n          \"凤城市\",\n          \"宽甸满族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"锦州市\",\n        \"area\": [\n          \"太和区\",\n          \"古塔区\",\n          \"凌河区\",\n          \"凌海市\",\n          \"黑山县\",\n          \"义县\",\n          \"北宁市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"营口市\",\n        \"area\": [\n          \"站前区\",\n          \"西市区\",\n          \"鲅鱼圈区\",\n          \"老边区\",\n          \"大石桥市\",\n          \"盖州市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"阜新市\",\n        \"area\": [\n          \"海州区\",\n          \"新邱区\",\n          \"太平区\",\n          \"清河门区\",\n          \"细河区\",\n          \"彰武县\",\n          \"阜新蒙古族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"辽阳市\",\n        \"area\": [\n          \"白塔区\",\n          \"文圣区\",\n          \"宏伟区\",\n          \"太子河区\",\n          \"弓长岭区\",\n          \"灯塔市\",\n          \"辽阳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"盘锦\",\n        \"area\": [\n          \"双台子区\",\n          \"兴隆台区\",\n          \"盘山县\",\n          \"大洼县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"铁岭市\",\n        \"area\": [\n          \"银州区\",\n          \"清河区\",\n          \"调兵山市\",\n          \"开原市\",\n          \"铁岭县\",\n          \"昌图县\",\n          \"西丰县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"朝阳市\",\n        \"area\": [\n          \"双塔区\",\n          \"龙城区\",\n          \"凌源市\",\n          \"北票市\",\n          \"朝阳县\",\n          \"建平县\",\n          \"喀喇沁左翼蒙古族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"葫芦岛市\",\n        \"area\": [\n          \"龙港区\",\n          \"南票区\",\n          \"连山区\",\n          \"兴城市\",\n          \"绥中县\",\n          \"建昌县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"吉林省\",\n    \"city\": [\n      {\n        \"name\": \"长春市\",\n        \"area\": [\n          \"朝阳区\",\n          \"宽城区\",\n          \"二道区\",\n          \"南关区\",\n          \"绿园区\",\n          \"双阳区\",\n          \"九台市\",\n          \"榆树市\",\n          \"德惠市\",\n          \"农安县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"吉林市\",\n        \"area\": [\n          \"船营区\",\n          \"昌邑区\",\n          \"龙潭区\",\n          \"丰满区\",\n          \"舒兰市\",\n          \"桦甸市\",\n          \"蛟河市\",\n          \"磐石市\",\n          \"永吉县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"四平\",\n        \"area\": [\n          \"铁西区\",\n          \"铁东区\",\n          \"公主岭市\",\n          \"双辽市\",\n          \"梨树县\",\n          \"伊通满族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"辽源市\",\n        \"area\": [\n          \"龙山区\",\n          \"西安区\",\n          \"东辽县\",\n          \"东丰县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"通化市\",\n        \"area\": [\n          \"东昌区\",\n          \"二道江区\",\n          \"梅河口市\",\n          \"集安市\",\n          \"通化县\",\n          \"辉南县\",\n          \"柳河县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"白山市\",\n        \"area\": [\n          \"八道江区\",\n          \"江源区\",\n          \"临江市\",\n          \"靖宇县\",\n          \"抚松县\",\n          \"长白朝鲜族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"松原市\",\n        \"area\": [\n          \"宁江区\",\n          \"乾安县\",\n          \"长岭县\",\n          \"扶余县\",\n          \"前郭尔罗斯蒙古族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"白城市\",\n        \"area\": [\n          \"洮北区\",\n          \"大安市\",\n          \"洮南市\",\n          \"镇赉县\",\n          \"通榆县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"延边朝鲜族自治州\",\n        \"area\": [\n          \"延吉市\",\n          \"图们市\",\n          \"敦化市\",\n          \"龙井市\",\n          \"珲春市\",\n          \"和龙市\",\n          \"安图县\",\n          \"汪清县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"黑龙江省\",\n    \"city\": [\n      {\n        \"name\": \"哈尔滨市\",\n        \"area\": [\n          \"松北区\",\n          \"道里区\",\n          \"南岗区\",\n          \"平房区\",\n          \"香坊区\",\n          \"道外区\",\n          \"呼兰区\",\n          \"阿城区\",\n          \"双城市\",\n          \"尚志市\",\n          \"五常市\",\n          \"宾县\",\n          \"方正县\",\n          \"通河县\",\n          \"巴彦县\",\n          \"延寿县\",\n          \"木兰县\",\n          \"依兰县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"齐齐哈尔市\",\n        \"area\": [\n          \"龙沙区\",\n          \"昂昂溪区\",\n          \"铁锋区\",\n          \"建华区\",\n          \"富拉尔基区\",\n          \"碾子山区\",\n          \"梅里斯达斡尔族区\",\n          \"讷河市\",\n          \"富裕县\",\n          \"拜泉县\",\n          \"甘南县\",\n          \"依安县\",\n          \"克山县\",\n          \"泰来县\",\n          \"克东县\",\n          \"龙江县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"鹤岗市\",\n        \"area\": [\n          \"兴山区\",\n          \"工农区\",\n          \"南山区\",\n          \"兴安区\",\n          \"向阳区\",\n          \"东山区\",\n          \"萝北县\",\n          \"绥滨县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"双鸭山\",\n        \"area\": [\n          \"尖山区\",\n          \"岭东区\",\n          \"四方台区\",\n          \"宝山区\",\n          \"集贤县\",\n          \"宝清县\",\n          \"友谊县\",\n          \"饶河县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"鸡西市\",\n        \"area\": [\n          \"鸡冠区\",\n          \"恒山区\",\n          \"城子河区\",\n          \"滴道区\",\n          \"梨树区\",\n          \"麻山区\",\n          \"密山市\",\n          \"虎林市\",\n          \"鸡东县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"大庆市\",\n        \"area\": [\n          \"萨尔图区\",\n          \"红岗区\",\n          \"龙凤区\",\n          \"让胡路区\",\n          \"大同区\",\n          \"林甸县\",\n          \"肇州县\",\n          \"肇源县\",\n          \"杜尔伯特蒙古族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"伊春市\",\n        \"area\": [\n          \"伊春区\",\n          \"带岭区\",\n          \"南岔区\",\n          \"金山屯区\",\n          \"西林区\",\n          \"美溪区\",\n          \"乌马河区\",\n          \"翠峦区\",\n          \"友好区\",\n          \"上甘岭区\",\n          \"五营区\",\n          \"红星区\",\n          \"新青区\",\n          \"汤旺河区\",\n          \"乌伊岭区\",\n          \"铁力市\",\n          \"嘉荫县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"牡丹江市\",\n        \"area\": [\n          \"爱民区\",\n          \"东安区\",\n          \"阳明区\",\n          \"西安区\",\n          \"绥芬河市\",\n          \"宁安市\",\n          \"海林市\",\n          \"穆棱市\",\n          \"林口县\",\n          \"东宁县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"佳木斯市\",\n        \"area\": [\n          \"向阳区\",\n          \"前进区\",\n          \"东风区\",\n          \"郊区\",\n          \"同江市\",\n          \"富锦市\",\n          \"桦川县\",\n          \"抚远县\",\n          \"桦南县\",\n          \"汤原县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"七台河市\",\n        \"area\": [\n          \"桃山区\",\n          \"新兴区\",\n          \"茄子河区\",\n          \"勃利县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"黑河市\",\n        \"area\": [\n          \"爱辉区\",\n          \"北安市\",\n          \"五大连池市\",\n          \"逊克县\",\n          \"嫩江县\",\n          \"孙吴县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"绥化市\",\n        \"area\": [\n          \"北林区\",\n          \"安达市\",\n          \"肇东市\",\n          \"海伦市\",\n          \"绥棱县\",\n          \"兰西县\",\n          \"明水县\",\n          \"青冈县\",\n          \"庆安县\",\n          \"望奎县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"大兴安岭地区\",\n        \"area\": [\n          \"呼玛县\",\n          \"塔河县\",\n          \"漠河县\",\n          \"大兴安岭辖区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"上海市\",\n    \"city\": [\n      {\n        \"name\": \"上海市\",\n        \"area\": [\n          \"黄浦区\",\n          \"卢湾区\",\n          \"徐汇区\",\n          \"长宁区\",\n          \"静安区\",\n          \"普陀区\",\n          \"闸北区\",\n          \"虹口区\",\n          \"杨浦区\",\n          \"宝山区\",\n          \"闵行区\",\n          \"嘉定区\",\n          \"松江区\",\n          \"金山区\",\n          \"青浦区\",\n          \"南汇区\",\n          \"奉贤区\",\n          \"浦东新区\",\n          \"崇明县\",\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"江苏省\",\n    \"city\": [\n      {\n        \"name\": \"南京市\",\n        \"area\": [\n          \"玄武区\",\n          \"白下区\",\n          \"秦淮区\",\n          \"建邺区\",\n          \"鼓楼区\",\n          \"下关区\",\n          \"栖霞区\",\n          \"雨花台区\",\n          \"浦口区\",\n          \"江宁区\",\n          \"六合区\",\n          \"溧水县\",\n          \"高淳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"苏州市\",\n        \"area\": [\n          \"金阊区\",\n          \"平江区\",\n          \"沧浪区\",\n          \"虎丘区\",\n          \"吴中区\",\n          \"相城区\",\n          \"常熟市\",\n          \"张家港市\",\n          \"昆山市\",\n          \"吴江市\",\n          \"太仓市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"无锡市\",\n        \"area\": [\n          \"崇安区\",\n          \"南长区\",\n          \"北塘区\",\n          \"滨湖区\",\n          \"锡山区\",\n          \"惠山区\",\n          \"江阴市\",\n          \"宜兴市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"常州市\",\n        \"area\": [\n          \"钟楼区\",\n          \"天宁区\",\n          \"戚墅堰区\",\n          \"新北区\",\n          \"武进区\",\n          \"金坛市\",\n          \"溧阳市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"镇江市\",\n        \"area\": [\n          \"京口区\",\n          \"润州区\",\n          \"丹徒区\",\n          \"丹阳市\",\n          \"扬中市\",\n          \"句容市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"南通市\",\n        \"area\": [\n          \"崇川区\",\n          \"港闸区\",\n          \"通州市\",\n          \"如皋市\",\n          \"海门市\",\n          \"启东市\",\n          \"海安县\",\n          \"如东县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"泰州市\",\n        \"area\": [\n          \"海陵区\",\n          \"高港区\",\n          \"姜堰市\",\n          \"泰兴市\",\n          \"靖江市\",\n          \"兴化市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"扬州市\",\n        \"area\": [\n          \"广陵区\",\n          \"维扬区\",\n          \"邗江区\",\n          \"江都市\",\n          \"仪征市\",\n          \"高邮市\",\n          \"宝应县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"盐城市\",\n        \"area\": [\n          \"亭湖区\",\n          \"盐都区\",\n          \"大丰市\",\n          \"东台市\",\n          \"建湖县\",\n          \"射阳县\",\n          \"阜宁县\",\n          \"滨海县\",\n          \"响水县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"连云港市\",\n        \"area\": [\n          \"新浦区\",\n          \"海州区\",\n          \"连云区\",\n          \"东海县\",\n          \"灌云县\",\n          \"赣榆县\",\n          \"灌南县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"徐州市\",\n        \"area\": [\n          \"云龙区\",\n          \"鼓楼区\",\n          \"九里区\",\n          \"泉山区\",\n          \"贾汪区\",\n          \"邳州市\",\n          \"新沂市\",\n          \"铜山县\",\n          \"睢宁县\",\n          \"沛县\",\n          \"丰县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"淮安市\",\n        \"area\": [\n          \"清河区\",\n          \"清浦区\",\n          \"楚州区\",\n          \"淮阴区\",\n          \"涟水县\",\n          \"洪泽县\",\n          \"金湖县\",\n          \"盱眙县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"宿迁市\",\n        \"area\": [\n          \"宿城区\",\n          \"宿豫区\",\n          \"沭阳县\",\n          \"泗阳县\",\n          \"泗洪县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"浙江省\",\n    \"city\": [\n      {\n        \"name\": \"杭州市\",\n        \"area\": [\n          \"拱墅区\",\n          \"西湖区\",\n          \"上城区\",\n          \"下城区\",\n          \"江干区\",\n          \"滨江区\",\n          \"余杭区\",\n          \"萧山区\",\n          \"建德市\",\n          \"富阳市\",\n          \"临安市\",\n          \"桐庐县\",\n          \"淳安县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"宁波市\",\n        \"area\": [\n          \"海曙区\",\n          \"江东区\",\n          \"江北区\",\n          \"镇海区\",\n          \"北仑区\",\n          \"鄞州区\",\n          \"余姚市\",\n          \"慈溪市\",\n          \"奉化市\",\n          \"宁海县\",\n          \"象山县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"温州市\",\n        \"area\": [\n          \"鹿城区\",\n          \"龙湾区\",\n          \"瓯海区\",\n          \"瑞安市\",\n          \"乐清市\",\n          \"永嘉县\",\n          \"洞头县\",\n          \"平阳县\",\n          \"苍南县\",\n          \"文成县\",\n          \"泰顺县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"嘉兴市\",\n        \"area\": [\n          \"秀城区\",\n          \"秀洲区\",\n          \"海宁市\",\n          \"平湖市\",\n          \"桐乡市\",\n          \"嘉善县\",\n          \"海盐县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"湖州市\",\n        \"area\": [\n          \"吴兴区\",\n          \"南浔区\",\n          \"长兴县\",\n          \"德清县\",\n          \"安吉县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"绍兴市\",\n        \"area\": [\n          \"越城区\",\n          \"诸暨市\",\n          \"上虞市\",\n          \"嵊州市\",\n          \"绍兴县\",\n          \"新昌县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"金华市\",\n        \"area\": [\n          \"婺城区\",\n          \"金东区\",\n          \"兰溪市\",\n          \"义乌市\",\n          \"东阳市\",\n          \"永康市\",\n          \"武义县\",\n          \"浦江县\",\n          \"磐安县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"衢州市\",\n        \"area\": [\n          \"柯城区\",\n          \"衢江区\",\n          \"江山市\",\n          \"龙游县\",\n          \"常山县\",\n          \"开化县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"舟山市\",\n        \"area\": [\n          \"定海区\",\n          \"普陀区\",\n          \"岱山县\",\n          \"嵊泗县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"台州市\",\n        \"area\": [\n          \"椒江区\",\n          \"黄岩区\",\n          \"路桥区\",\n          \"临海市\",\n          \"温岭市\",\n          \"玉环县\",\n          \"天台县\",\n          \"仙居县\",\n          \"三门县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"丽水市\",\n        \"area\": [\n          \"莲都区\",\n          \"龙泉市\",\n          \"缙云县\",\n          \"青田县\",\n          \"云和县\",\n          \"遂昌县\",\n          \"松阳县\",\n          \"庆元县\",\n          \"景宁畲族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他市\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"安徽省\",\n    \"city\": [\n      {\n        \"name\": \"合肥市\",\n        \"area\": [\n          \"庐阳区\",\n          \"瑶海区\",\n          \"蜀山区\",\n          \"包河区\",\n          \"长丰县\",\n          \"肥东县\",\n          \"肥西县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"芜湖市\",\n        \"area\": [\n          \"镜湖区\",\n          \"弋江区\",\n          \"鸠江区\",\n          \"三山区\",\n          \"芜湖县\",\n          \"南陵县\",\n          \"繁昌县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"蚌埠市\",\n        \"area\": [\n          \"蚌山区\",\n          \"龙子湖区\",\n          \"禹会区\",\n          \"淮上区\",\n          \"怀远县\",\n          \"固镇县\",\n          \"五河县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"淮南市\",\n        \"area\": [\n          \"田家庵区\",\n          \"大通区\",\n          \"谢家集区\",\n          \"八公山区\",\n          \"潘集区\",\n          \"凤台县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"马鞍山市\",\n        \"area\": [\n          \"雨山区\",\n          \"花山区\",\n          \"金家庄区\",\n          \"当涂县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"淮北市\",\n        \"area\": [\n          \"相山区\",\n          \"杜集区\",\n          \"烈山区\",\n          \"濉溪县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"铜陵市\",\n        \"area\": [\n          \"铜官山区\",\n          \"狮子山区\",\n          \"郊区\",\n          \"铜陵县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"安庆市\",\n        \"area\": [\n          \"迎江区\",\n          \"大观区\",\n          \"宜秀区\",\n          \"桐城市\",\n          \"宿松县\",\n          \"枞阳县\",\n          \"太湖县\",\n          \"怀宁县\",\n          \"岳西县\",\n          \"望江县\",\n          \"潜山县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"黄山市\",\n        \"area\": [\n          \"屯溪区\",\n          \"黄山区\",\n          \"徽州区\",\n          \"休宁县\",\n          \"歙县\",\n          \"祁门县\",\n          \"黟县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"滁州市\",\n        \"area\": [\n          \"琅琊区\",\n          \"南谯区\",\n          \"天长市\",\n          \"明光市\",\n          \"全椒县\",\n          \"来安县\",\n          \"定远县\",\n          \"凤阳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"阜阳市\",\n        \"area\": [\n          \"颍州区\",\n          \"颍东区\",\n          \"颍泉区\",\n          \"界首市\",\n          \"临泉县\",\n          \"颍上县\",\n          \"阜南县\",\n          \"太和县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"宿州市\",\n        \"area\": [\n          \"埇桥区\",\n          \"萧县\",\n          \"泗县\",\n          \"砀山县\",\n          \"灵璧县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"巢湖市\",\n        \"area\": [\n          \"居巢区\",\n          \"含山县\",\n          \"无为县\",\n          \"庐江县\",\n          \"和县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"六安市\",\n        \"area\": [\n          \"金安区\",\n          \"裕安区\",\n          \"寿县\",\n          \"霍山县\",\n          \"霍邱县\",\n          \"舒城县\",\n          \"金寨县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"亳州市\",\n        \"area\": [\n          \"谯城区\",\n          \"利辛县\",\n          \"涡阳县\",\n          \"蒙城县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"池州市\",\n        \"area\": [\n          \"贵池区\",\n          \"东至县\",\n          \"石台县\",\n          \"青阳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"宣城市\",\n        \"area\": [\n          \"宣州区\",\n          \"宁国市\",\n          \"广德县\",\n          \"郎溪县\",\n          \"泾县\",\n          \"旌德县\",\n          \"绩溪县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他市\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"福建省\",\n    \"city\": [\n      {\n        \"name\": \"福州市\",\n        \"area\": [\n          \"鼓楼区\",\n          \"台江区\",\n          \"仓山区\",\n          \"马尾区\",\n          \"晋安区\",\n          \"福清市\",\n          \"长乐市\",\n          \"闽侯县\",\n          \"闽清县\",\n          \"永泰县\",\n          \"连江县\",\n          \"罗源县\",\n          \"平潭县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"厦门市\",\n        \"area\": [\n          \"思明区\",\n          \"海沧区\",\n          \"湖里区\",\n          \"集美区\",\n          \"同安区\",\n          \"翔安区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"莆田市\",\n        \"area\": [\n          \"城厢区\",\n          \"涵江区\",\n          \"荔城区\",\n          \"秀屿区\",\n          \"仙游县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"三明市\",\n        \"area\": [\n          \"梅列区\",\n          \"三元区\",\n          \"永安市\",\n          \"明溪县\",\n          \"将乐县\",\n          \"大田县\",\n          \"宁化县\",\n          \"建宁县\",\n          \"沙县\",\n          \"尤溪县\",\n          \"清流县\",\n          \"泰宁县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"泉州市\",\n        \"area\": [\n          \"鲤城区\",\n          \"丰泽区\",\n          \"洛江区\",\n          \"泉港区\",\n          \"石狮市\",\n          \"晋江市\",\n          \"南安市\",\n          \"惠安县\",\n          \"永春县\",\n          \"安溪县\",\n          \"德化县\",\n          \"金门县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"漳州市\",\n        \"area\": [\n          \"芗城区\",\n          \"龙文区\",\n          \"龙海市\",\n          \"平和县\",\n          \"南靖县\",\n          \"诏安县\",\n          \"漳浦县\",\n          \"华安县\",\n          \"东山县\",\n          \"长泰县\",\n          \"云霄县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"南平市\",\n        \"area\": [\n          \"延平区\",\n          \"建瓯市\",\n          \"邵武市\",\n          \"武夷山市\",\n          \"建阳市\",\n          \"松溪县\",\n          \"光泽县\",\n          \"顺昌县\",\n          \"浦城县\",\n          \"政和县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"龙岩市\",\n        \"area\": [\n          \"新罗区\",\n          \"漳平市\",\n          \"长汀县\",\n          \"武平县\",\n          \"上杭县\",\n          \"永定县\",\n          \"连城县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"宁德市\",\n        \"area\": [\n          \"蕉城区\",\n          \"福安市\",\n          \"福鼎市\",\n          \"寿宁县\",\n          \"霞浦县\",\n          \"柘荣县\",\n          \"屏南县\",\n          \"古田县\",\n          \"周宁县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"江西省\",\n    \"city\": [\n      {\n        \"name\": \"南昌市\",\n        \"area\": [\n          \"东湖区\",\n          \"西湖区\",\n          \"青云谱区\",\n          \"湾里区\",\n          \"青山湖区\",\n          \"新建县\",\n          \"南昌县\",\n          \"进贤县\",\n          \"安义县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"景德镇市\",\n        \"area\": [\n          \"珠山区\",\n          \"昌江区\",\n          \"乐平市\",\n          \"浮梁县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"萍乡市\",\n        \"area\": [\n          \"安源区\",\n          \"湘东区\",\n          \"莲花县\",\n          \"上栗县\",\n          \"芦溪县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"九江市\",\n        \"area\": [\n          \"浔阳区\",\n          \"庐山区\",\n          \"瑞昌市\",\n          \"九江县\",\n          \"星子县\",\n          \"武宁县\",\n          \"彭泽县\",\n          \"永修县\",\n          \"修水县\",\n          \"湖口县\",\n          \"德安县\",\n          \"都昌县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"新余市\",\n        \"area\": [\n          \"渝水区\",\n          \"分宜县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"鹰潭市\",\n        \"area\": [\n          \"月湖区\",\n          \"贵溪市\",\n          \"余江县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"赣州市\",\n        \"area\": [\n          \"章贡区\",\n          \"瑞金市\",\n          \"南康市\",\n          \"石城县\",\n          \"安远县\",\n          \"赣县\",\n          \"宁都县\",\n          \"寻乌县\",\n          \"兴国县\",\n          \"定南县\",\n          \"上犹县\",\n          \"于都县\",\n          \"龙南县\",\n          \"崇义县\",\n          \"信丰县\",\n          \"全南县\",\n          \"大余县\",\n          \"会昌县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"吉安市\",\n        \"area\": [\n          \"吉州区\",\n          \"青原区\",\n          \"井冈山市\",\n          \"吉安县\",\n          \"永丰县\",\n          \"永新县\",\n          \"新干县\",\n          \"泰和县\",\n          \"峡江县\",\n          \"遂川县\",\n          \"安福县\",\n          \"吉水县\",\n          \"万安县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"宜春市\",\n        \"area\": [\n          \"袁州区\",\n          \"丰城市\",\n          \"樟树市\",\n          \"高安市\",\n          \"铜鼓县\",\n          \"靖安县\",\n          \"宜丰县\",\n          \"奉新县\",\n          \"万载县\",\n          \"上高县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"抚州市\",\n        \"area\": [\n          \"临川区\",\n          \"南丰县\",\n          \"乐安县\",\n          \"金溪县\",\n          \"南城县\",\n          \"东乡县\",\n          \"资溪县\",\n          \"宜黄县\",\n          \"广昌县\",\n          \"黎川县\",\n          \"崇仁县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"上饶市\",\n        \"area\": [\n          \"信州区\",\n          \"德兴市\",\n          \"上饶县\",\n          \"广丰县\",\n          \"鄱阳县\",\n          \"婺源县\",\n          \"铅山县\",\n          \"余干县\",\n          \"横峰县\",\n          \"弋阳县\",\n          \"玉山县\",\n          \"万年县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"山东省\",\n    \"city\": [\n      {\n        \"name\": \"济南市\",\n        \"area\": [\n          \"市中区\",\n          \"历下区\",\n          \"天桥区\",\n          \"槐荫区\",\n          \"历城区\",\n          \"长清区\",\n          \"章丘市\",\n          \"平阴县\",\n          \"济阳县\",\n          \"商河县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"青岛市\",\n        \"area\": [\n          \"市南区\",\n          \"市北区\",\n          \"城阳区\",\n          \"四方区\",\n          \"李沧区\",\n          \"黄岛区\",\n          \"崂山区\",\n          \"胶南市\",\n          \"胶州市\",\n          \"平度市\",\n          \"莱西市\",\n          \"即墨市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"淄博市\",\n        \"area\": [\n          \"张店区\",\n          \"临淄区\",\n          \"淄川区\",\n          \"博山区\",\n          \"周村区\",\n          \"桓台县\",\n          \"高青县\",\n          \"沂源县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"枣庄市\",\n        \"area\": [\n          \"市中区\",\n          \"山亭区\",\n          \"峄城区\",\n          \"台儿庄区\",\n          \"薛城区\",\n          \"滕州市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"东营市\",\n        \"area\": [\n          \"东营区\",\n          \"河口区\",\n          \"垦利县\",\n          \"广饶县\",\n          \"利津县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"烟台市\",\n        \"area\": [\n          \"芝罘区\",\n          \"福山区\",\n          \"牟平区\",\n          \"莱山区\",\n          \"龙口市\",\n          \"莱阳市\",\n          \"莱州市\",\n          \"招远市\",\n          \"蓬莱市\",\n          \"栖霞市\",\n          \"海阳市\",\n          \"长岛县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"潍坊市\",\n        \"area\": [\n          \"潍城区\",\n          \"寒亭区\",\n          \"坊子区\",\n          \"奎文区\",\n          \"青州市\",\n          \"诸城市\",\n          \"寿光市\",\n          \"安丘市\",\n          \"高密市\",\n          \"昌邑市\",\n          \"昌乐县\",\n          \"临朐县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"济宁市\",\n        \"area\": [\n          \"市中区\",\n          \"任城区\",\n          \"曲阜市\",\n          \"兖州市\",\n          \"邹城市\",\n          \"鱼台县\",\n          \"金乡县\",\n          \"嘉祥县\",\n          \"微山县\",\n          \"汶上县\",\n          \"泗水县\",\n          \"梁山县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"泰安市\",\n        \"area\": [\n          \"泰山区\",\n          \"岱岳区\",\n          \"新泰市\",\n          \"肥城市\",\n          \"宁阳县\",\n          \"东平县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"威海市\",\n        \"area\": [\n          \"环翠区\",\n          \"乳山市\",\n          \"文登市\",\n          \"荣成市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"日照市\",\n        \"area\": [\n          \"东港区\",\n          \"岚山区\",\n          \"五莲县\",\n          \"莒县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"莱芜市\",\n        \"area\": [\n          \"莱城区\",\n          \"钢城区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"临沂市\",\n        \"area\": [\n          \"兰山区\",\n          \"罗庄区\",\n          \"河东区\",\n          \"沂南县\",\n          \"郯城县\",\n          \"沂水县\",\n          \"苍山县\",\n          \"费县\",\n          \"平邑县\",\n          \"莒南县\",\n          \"蒙阴县\",\n          \"临沭县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"德州市\",\n        \"area\": [\n          \"德城区\",\n          \"乐陵市\",\n          \"禹城市\",\n          \"陵县\",\n          \"宁津县\",\n          \"齐河县\",\n          \"武城县\",\n          \"庆云县\",\n          \"平原县\",\n          \"夏津县\",\n          \"临邑县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"聊城市\",\n        \"area\": [\n          \"东昌府区\",\n          \"临清市\",\n          \"高唐县\",\n          \"阳谷县\",\n          \"茌平县\",\n          \"莘县\",\n          \"东阿县\",\n          \"冠县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"滨州市\",\n        \"area\": [\n          \"滨城区\",\n          \"邹平县\",\n          \"沾化县\",\n          \"惠民县\",\n          \"博兴县\",\n          \"阳信县\",\n          \"无棣县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"菏泽市\",\n        \"area\": [\n          \"牡丹区\",\n          \"鄄城县\",\n          \"单县\",\n          \"郓城县\",\n          \"曹县\",\n          \"定陶县\",\n          \"巨野县\",\n          \"东明县\",\n          \"成武县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"河南省\",\n    \"city\": [\n      {\n        \"name\": \"郑州市\",\n        \"area\": [\n          \"中原区\",\n          \"金水区\",\n          \"二七区\",\n          \"管城回族区\",\n          \"上街区\",\n          \"惠济区\",\n          \"巩义市\",\n          \"新郑市\",\n          \"新密市\",\n          \"登封市\",\n          \"荥阳市\",\n          \"中牟县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"开封市\",\n        \"area\": [\n          \"鼓楼区\",\n          \"龙亭区\",\n          \"顺河回族区\",\n          \"禹王台区\",\n          \"金明区\",\n          \"开封县\",\n          \"尉氏县\",\n          \"兰考县\",\n          \"杞县\",\n          \"通许县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"洛阳市\",\n        \"area\": [\n          \"西工区\",\n          \"老城区\",\n          \"涧西区\",\n          \"瀍河回族区\",\n          \"洛龙区\",\n          \"吉利区\",\n          \"偃师市\",\n          \"孟津县\",\n          \"汝阳县\",\n          \"伊川县\",\n          \"洛宁县\",\n          \"嵩县\",\n          \"宜阳县\",\n          \"新安县\",\n          \"栾川县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"平顶山市\",\n        \"area\": [\n          \"新华区\",\n          \"卫东区\",\n          \"湛河区\",\n          \"石龙区\",\n          \"汝州市\",\n          \"舞钢市\",\n          \"宝丰县\",\n          \"叶县\",\n          \"郏县\",\n          \"鲁山县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"安阳市\",\n        \"area\": [\n          \"北关区\",\n          \"文峰区\",\n          \"殷都区\",\n          \"龙安区\",\n          \"林州市\",\n          \"安阳县\",\n          \"滑县\",\n          \"内黄县\",\n          \"汤阴县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"鹤壁市\",\n        \"area\": [\n          \"淇滨区\",\n          \"山城区\",\n          \"鹤山区\",\n          \"浚县\",\n          \"淇县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"新乡市\",\n        \"area\": [\n          \"卫滨区\",\n          \"红旗区\",\n          \"凤泉区\",\n          \"牧野区\",\n          \"卫辉市\",\n          \"辉县市\",\n          \"新乡县\",\n          \"获嘉县\",\n          \"原阳县\",\n          \"长垣县\",\n          \"封丘县\",\n          \"延津县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"焦作市\",\n        \"area\": [\n          \"解放区\",\n          \"中站区\",\n          \"马村区\",\n          \"山阳区\",\n          \"沁阳市\",\n          \"孟州市\",\n          \"修武县\",\n          \"温县\",\n          \"武陟县\",\n          \"博爱县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"濮阳市\",\n        \"area\": [\n          \"华龙区\",\n          \"濮阳县\",\n          \"南乐县\",\n          \"台前县\",\n          \"清丰县\",\n          \"范县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"许昌市\",\n        \"area\": [\n          \"魏都区\",\n          \"禹州市\",\n          \"长葛市\",\n          \"许昌县\",\n          \"鄢陵县\",\n          \"襄城县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"漯河市\",\n        \"area\": [\n          \"源汇区\",\n          \"郾城区\",\n          \"召陵区\",\n          \"临颍县\",\n          \"舞阳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"三门峡市\",\n        \"area\": [\n          \"湖滨区\",\n          \"义马市\",\n          \"灵宝市\",\n          \"渑池县\",\n          \"卢氏县\",\n          \"陕县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"南阳市\",\n        \"area\": [\n          \"卧龙区\",\n          \"宛城区\",\n          \"邓州市\",\n          \"桐柏县\",\n          \"方城县\",\n          \"淅川县\",\n          \"镇平县\",\n          \"唐河县\",\n          \"南召县\",\n          \"内乡县\",\n          \"新野县\",\n          \"社旗县\",\n          \"西峡县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"商丘市\",\n        \"area\": [\n          \"梁园区\",\n          \"睢阳区\",\n          \"永城市\",\n          \"宁陵县\",\n          \"虞城县\",\n          \"民权县\",\n          \"夏邑县\",\n          \"柘城县\",\n          \"睢县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"信阳市\",\n        \"area\": [\n          \"浉河区\",\n          \"平桥区\",\n          \"潢川县\",\n          \"淮滨县\",\n          \"息县\",\n          \"新县\",\n          \"商城县\",\n          \"固始县\",\n          \"罗山县\",\n          \"光山县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"周口市\",\n        \"area\": [\n          \"川汇区\",\n          \"项城市\",\n          \"商水县\",\n          \"淮阳县\",\n          \"太康县\",\n          \"鹿邑县\",\n          \"西华县\",\n          \"扶沟县\",\n          \"沈丘县\",\n          \"郸城县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"驻马店市\",\n        \"area\": [\n          \"驿城区\",\n          \"确山县\",\n          \"新蔡县\",\n          \"上蔡县\",\n          \"西平县\",\n          \"泌阳县\",\n          \"平舆县\",\n          \"汝南县\",\n          \"遂平县\",\n          \"正阳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"焦作市\",\n        \"area\": [\n          \"济源市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"湖北省\",\n    \"city\": [\n      {\n        \"name\": \"武汉市\",\n        \"area\": [\n          \"江岸区\",\n          \"武昌区\",\n          \"江汉区\",\n          \"硚口区\",\n          \"汉阳区\",\n          \"青山区\",\n          \"洪山区\",\n          \"东西湖区\",\n          \"汉南区\",\n          \"蔡甸区\",\n          \"江夏区\",\n          \"黄陂区\",\n          \"新洲区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"黄石市\",\n        \"area\": [\n          \"黄石港区\",\n          \"西塞山区\",\n          \"下陆区\",\n          \"铁山区\",\n          \"大冶市\",\n          \"阳新县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"十堰市\",\n        \"area\": [\n          \"张湾区\",\n          \"茅箭区\",\n          \"丹江口市\",\n          \"郧县\",\n          \"竹山县\",\n          \"房县\",\n          \"郧西县\",\n          \"竹溪县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"荆州市\",\n        \"area\": [\n          \"沙市区\",\n          \"荆州区\",\n          \"洪湖市\",\n          \"石首市\",\n          \"松滋市\",\n          \"监利县\",\n          \"公安县\",\n          \"江陵县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"宜昌市\",\n        \"area\": [\n          \"西陵区\",\n          \"伍家岗区\",\n          \"点军区\",\n          \"猇亭区\",\n          \"夷陵区\",\n          \"宜都市\",\n          \"当阳市\",\n          \"枝江市\",\n          \"秭归县\",\n          \"远安县\",\n          \"兴山县\",\n          \"五峰土家族自治县\",\n          \"长阳土家族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"襄樊市\",\n        \"area\": [\n          \"襄城区\",\n          \"樊城区\",\n          \"襄阳区\",\n          \"老河口市\",\n          \"枣阳市\",\n          \"宜城市\",\n          \"南漳县\",\n          \"谷城县\",\n          \"保康县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"鄂州市\",\n        \"area\": [\n          \"鄂城区\",\n          \"华容区\",\n          \"梁子湖区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"荆门市\",\n        \"area\": [\n          \"东宝区\",\n          \"掇刀区\",\n          \"钟祥市\",\n          \"京山县\",\n          \"沙洋县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"孝感市\",\n        \"area\": [\n          \"孝南区\",\n          \"应城市\",\n          \"安陆市\",\n          \"汉川市\",\n          \"云梦县\",\n          \"大悟县\",\n          \"孝昌县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"黄冈市\",\n        \"area\": [\n          \"黄州区\",\n          \"麻城市\",\n          \"武穴市\",\n          \"红安县\",\n          \"罗田县\",\n          \"浠水县\",\n          \"蕲春县\",\n          \"黄梅县\",\n          \"英山县\",\n          \"团风县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"咸宁市\",\n        \"area\": [\n          \"咸安区\",\n          \"赤壁市\",\n          \"嘉鱼县\",\n          \"通山县\",\n          \"崇阳县\",\n          \"通城县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"随州市\",\n        \"area\": [\n          \"曾都区\",\n          \"广水市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"恩施土家族苗族自治州\",\n        \"area\": [\n          \"恩施市\",\n          \"利川市\",\n          \"建始县\",\n          \"来凤县\",\n          \"巴东县\",\n          \"鹤峰县\",\n          \"宣恩县\",\n          \"咸丰县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"仙桃市\",\n        \"area\": [\n          \"仙桃\"\n        ]\n      },\n      {\n        \"name\": \"天门市\",\n        \"area\": [\n          \"天门\"\n        ]\n      },\n      {\n        \"name\": \"潜江市\",\n        \"area\": [\n          \"潜江\"\n        ]\n      },\n      {\n        \"name\": \"神农架林区\",\n        \"area\": [\n          \"神农架林区\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"湖南省\",\n    \"city\": [\n      {\n        \"name\": \"长沙市\",\n        \"area\": [\n          \"岳麓区\",\n          \"芙蓉区\",\n          \"天心区\",\n          \"开福区\",\n          \"雨花区\",\n          \"浏阳市\",\n          \"长沙县\",\n          \"望城县\",\n          \"宁乡县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"株洲市\",\n        \"area\": [\n          \"天元区\",\n          \"荷塘区\",\n          \"芦淞区\",\n          \"石峰区\",\n          \"醴陵市\",\n          \"株洲县\",\n          \"炎陵县\",\n          \"茶陵县\",\n          \"攸县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"湘潭市\",\n        \"area\": [\n          \"岳塘区\",\n          \"雨湖区\",\n          \"湘乡市\",\n          \"韶山市\",\n          \"湘潭县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"衡阳市\",\n        \"area\": [\n          \"雁峰区\",\n          \"珠晖区\",\n          \"石鼓区\",\n          \"蒸湘区\",\n          \"南岳区\",\n          \"耒阳市\",\n          \"常宁市\",\n          \"衡阳县\",\n          \"衡东县\",\n          \"衡山县\",\n          \"衡南县\",\n          \"祁东县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"邵阳市\",\n        \"area\": [\n          \"双清区\",\n          \"大祥区\",\n          \"北塔区\",\n          \"武冈市\",\n          \"邵东县\",\n          \"洞口县\",\n          \"新邵县\",\n          \"绥宁县\",\n          \"新宁县\",\n          \"邵阳县\",\n          \"隆回县\",\n          \"城步苗族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"岳阳市\",\n        \"area\": [\n          \"岳阳楼区\",\n          \"云溪区\",\n          \"君山区\",\n          \"临湘市\",\n          \"汨罗市\",\n          \"岳阳县\",\n          \"湘阴县\",\n          \"平江县\",\n          \"华容县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"常德市\",\n        \"area\": [\n          \"武陵区\",\n          \"鼎城区\",\n          \"津市市\",\n          \"澧县\",\n          \"临澧县\",\n          \"桃源县\",\n          \"汉寿县\",\n          \"安乡县\",\n          \"石门县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"张家界市\",\n        \"area\": [\n          \"永定区\",\n          \"武陵源区\",\n          \"慈利县\",\n          \"桑植县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"益阳市\",\n        \"area\": [\n          \"赫山区\",\n          \"资阳区\",\n          \"沅江市\",\n          \"桃江县\",\n          \"南县\",\n          \"安化县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"郴州市\",\n        \"area\": [\n          \"北湖区\",\n          \"苏仙区\",\n          \"资兴市\",\n          \"宜章县\",\n          \"汝城县\",\n          \"安仁县\",\n          \"嘉禾县\",\n          \"临武县\",\n          \"桂东县\",\n          \"永兴县\",\n          \"桂阳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"永州市\",\n        \"area\": [\n          \"冷水滩区\",\n          \"零陵区\",\n          \"祁阳县\",\n          \"蓝山县\",\n          \"宁远县\",\n          \"新田县\",\n          \"东安县\",\n          \"江永县\",\n          \"道县\",\n          \"双牌县\",\n          \"江华瑶族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"怀化市\",\n        \"area\": [\n          \"鹤城区\",\n          \"洪江市\",\n          \"会同县\",\n          \"沅陵县\",\n          \"辰溪县\",\n          \"溆浦县\",\n          \"中方县\",\n          \"新晃侗族自治县\",\n          \"芷江侗族自治县\",\n          \"通道侗族自治县\",\n          \"靖州苗族侗族自治县\",\n          \"麻阳苗族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"娄底市\",\n        \"area\": [\n          \"娄星区\",\n          \"冷水江市\",\n          \"涟源市\",\n          \"新化县\",\n          \"双峰县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"湘西土家族苗族自治州\",\n        \"area\": [\n          \"吉首市\",\n          \"古丈县\",\n          \"龙山县\",\n          \"永顺县\",\n          \"凤凰县\",\n          \"泸溪县\",\n          \"保靖县\",\n          \"花垣县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"广东省\",\n    \"city\": [\n      {\n        \"name\": \"广州市\",\n        \"area\": [\n          \"越秀区\",\n          \"荔湾区\",\n          \"海珠区\",\n          \"天河区\",\n          \"白云区\",\n          \"黄埔区\",\n          \"番禺区\",\n          \"花都区\",\n          \"南沙区\",\n          \"萝岗区\",\n          \"增城市\",\n          \"从化市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"深圳市\",\n        \"area\": [\n          \"福田区\",\n          \"罗湖区\",\n          \"南山区\",\n          \"宝安区\",\n          \"龙岗区\",\n          \"盐田区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"东莞市\",\n        \"area\": [\n          \"莞城\",\n          \"常平\",\n          \"塘厦\",\n          \"塘厦\",\n          \"塘厦\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"中山市\",\n        \"area\": [\n          \"中山\"\n        ]\n      },\n      {\n        \"name\": \"潮州市\",\n        \"area\": [\n          \"湘桥区\",\n          \"潮安县\",\n          \"饶平县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"揭阳市\",\n        \"area\": [\n          \"榕城区\",\n          \"揭东县\",\n          \"揭西县\",\n          \"惠来县\",\n          \"普宁市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"云浮市\",\n        \"area\": [\n          \"云城区\",\n          \"新兴县\",\n          \"郁南县\",\n          \"云安县\",\n          \"罗定市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"珠海市\",\n        \"area\": [\n          \"香洲区\",\n          \"斗门区\",\n          \"金湾区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"汕头市\",\n        \"area\": [\n          \"金平区\",\n          \"濠江区\",\n          \"龙湖区\",\n          \"潮阳区\",\n          \"潮南区\",\n          \"澄海区\",\n          \"南澳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"韶关市\",\n        \"area\": [\n          \"浈江区\",\n          \"武江区\",\n          \"曲江区\",\n          \"乐昌市\",\n          \"南雄市\",\n          \"始兴县\",\n          \"仁化县\",\n          \"翁源县\",\n          \"新丰县\",\n          \"乳源瑶族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"佛山市\",\n        \"area\": [\n          \"禅城区\",\n          \"南海区\",\n          \"顺德区\",\n          \"三水区\",\n          \"高明区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"江门市\",\n        \"area\": [\n          \"蓬江区\",\n          \"江海区\",\n          \"新会区\",\n          \"恩平市\",\n          \"台山市\",\n          \"开平市\",\n          \"鹤山市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"湛江市\",\n        \"area\": [\n          \"赤坎区\",\n          \"霞山区\",\n          \"坡头区\",\n          \"麻章区\",\n          \"吴川市\",\n          \"廉江市\",\n          \"雷州市\",\n          \"遂溪县\",\n          \"徐闻县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"茂名市\",\n        \"area\": [\n          \"茂南区\",\n          \"茂港区\",\n          \"化州市\",\n          \"信宜市\",\n          \"高州市\",\n          \"电白县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"肇庆市\",\n        \"area\": [\n          \"端州区\",\n          \"鼎湖区\",\n          \"高要市\",\n          \"四会市\",\n          \"广宁县\",\n          \"怀集县\",\n          \"封开县\",\n          \"德庆县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"惠州市\",\n        \"area\": [\n          \"惠城区\",\n          \"惠阳区\",\n          \"博罗县\",\n          \"惠东县\",\n          \"龙门县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"梅州市\",\n        \"area\": [\n          \"梅江区\",\n          \"兴宁市\",\n          \"梅县\",\n          \"大埔县\",\n          \"丰顺县\",\n          \"五华县\",\n          \"平远县\",\n          \"蕉岭县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"汕尾市\",\n        \"area\": [\n          \"城区\",\n          \"陆丰市\",\n          \"海丰县\",\n          \"陆河县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"河源市\",\n        \"area\": [\n          \"源城区\",\n          \"紫金县\",\n          \"龙川县\",\n          \"连平县\",\n          \"和平县\",\n          \"东源县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"阳江市\",\n        \"area\": [\n          \"江城区\",\n          \"阳春市\",\n          \"阳西县\",\n          \"阳东县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"清远市\",\n        \"area\": [\n          \"清城区\",\n          \"英德市\",\n          \"连州市\",\n          \"佛冈县\",\n          \"阳山县\",\n          \"清新县\",\n          \"连山壮族瑶族自治县\",\n          \"连南瑶族自治县\",\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"广西\",\n    \"city\": [\n      {\n        \"name\": \"南宁市\",\n        \"area\": [\n          \"青秀区\",\n          \"兴宁区\",\n          \"西乡塘区\",\n          \"良庆区\",\n          \"江南区\",\n          \"邕宁区\",\n          \"武鸣县\",\n          \"隆安县\",\n          \"马山县\",\n          \"上林县\",\n          \"宾阳县\",\n          \"横县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"柳州市\",\n        \"area\": [\n          \"城中区\",\n          \"鱼峰区\",\n          \"柳北区\",\n          \"柳南区\",\n          \"柳江县\",\n          \"柳城县\",\n          \"鹿寨县\",\n          \"融安县\",\n          \"融水苗族自治县\",\n          \"三江侗族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"桂林市\",\n        \"area\": [\n          \"象山区\",\n          \"秀峰区\",\n          \"叠彩区\",\n          \"七星区\",\n          \"雁山区\",\n          \"阳朔县\",\n          \"临桂县\",\n          \"灵川县\",\n          \"全州县\",\n          \"平乐县\",\n          \"兴安县\",\n          \"灌阳县\",\n          \"荔浦县\",\n          \"资源县\",\n          \"永福县\",\n          \"龙胜各族自治县\",\n          \"恭城瑶族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"梧州市\",\n        \"area\": [\n          \"万秀区\",\n          \"蝶山区\",\n          \"长洲区\",\n          \"岑溪市\",\n          \"苍梧县\",\n          \"藤县\",\n          \"蒙山县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"北海市\",\n        \"area\": [\n          \"海城区\",\n          \"银海区\",\n          \"铁山港区\",\n          \"合浦县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"防城港市\",\n        \"area\": [\n          \"港口区\",\n          \"防城区\",\n          \"东兴市\",\n          \"上思县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"钦州市\",\n        \"area\": [\n          \"钦南区\",\n          \"钦北区\",\n          \"灵山县\",\n          \"浦北县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"贵港市\",\n        \"area\": [\n          \"港北区\",\n          \"港南区\",\n          \"覃塘区\",\n          \"桂平市\",\n          \"平南县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"玉林市\",\n        \"area\": [\n          \"玉州区\",\n          \"北流市\",\n          \"容县\",\n          \"陆川县\",\n          \"博白县\",\n          \"兴业县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"百色市\",\n        \"area\": [\n          \"右江区\",\n          \"凌云县\",\n          \"平果县\",\n          \"西林县\",\n          \"乐业县\",\n          \"德保县\",\n          \"田林县\",\n          \"田阳县\",\n          \"靖西县\",\n          \"田东县\",\n          \"那坡县\",\n          \"隆林各族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"贺州市\",\n        \"area\": [\n          \"八步区\",\n          \"钟山县\",\n          \"昭平县\",\n          \"富川瑶族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"河池市\",\n        \"area\": [\n          \"金城江区\",\n          \"宜州市\",\n          \"天峨县\",\n          \"凤山县\",\n          \"南丹县\",\n          \"东兰县\",\n          \"都安瑶族自治县\",\n          \"罗城仫佬族自治县\",\n          \"巴马瑶族自治县\",\n          \"环江毛南族自治县\",\n          \"大化瑶族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"来宾市\",\n        \"area\": [\n          \"兴宾区\",\n          \"合山市\",\n          \"象州县\",\n          \"武宣县\",\n          \"忻城县\",\n          \"金秀瑶族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"崇左市\",\n        \"area\": [\n          \"江州区\",\n          \"凭祥市\",\n          \"宁明县\",\n          \"扶绥县\",\n          \"龙州县\",\n          \"大新县\",\n          \"天等县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他市\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"海南省\",\n    \"city\": [\n      {\n        \"name\": \"海口市\",\n        \"area\": [\n          \"龙华区\",\n          \"秀英区\",\n          \"琼山区\",\n          \"美兰区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"三亚市\",\n        \"area\": [\n          \"三亚市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"五指山市\",\n        \"area\": [\n          \"五指山\"\n        ]\n      },\n      {\n        \"name\": \"琼海市\",\n        \"area\": [\n          \"琼海\"\n        ]\n      },\n      {\n        \"name\": \"儋州市\",\n        \"area\": [\n          \"儋州\"\n        ]\n      },\n      {\n        \"name\": \"文昌市\",\n        \"area\": [\n          \"文昌\"\n        ]\n      },\n      {\n        \"name\": \"万宁市\",\n        \"area\": [\n          \"万宁\"\n        ]\n      },\n      {\n        \"name\": \"东方市\",\n        \"area\": [\n          \"东方\"\n        ]\n      },\n      {\n        \"name\": \"澄迈县\",\n        \"area\": [\n          \"澄迈县\"\n        ]\n      },\n      {\n        \"name\": \"定安县\",\n        \"area\": [\n          \"定安县\"\n        ]\n      },\n      {\n        \"name\": \"屯昌县\",\n        \"area\": [\n          \"屯昌县\"\n        ]\n      },\n      {\n        \"name\": \"临高县\",\n        \"area\": [\n          \"临高县\"\n        ]\n      },\n      {\n        \"name\": \"白沙黎族自治县\",\n        \"area\": [\n          \"白沙黎族自治县\"\n        ]\n      },\n      {\n        \"name\": \"昌江黎族自治县\",\n        \"area\": [\n          \"昌江黎族自治县\"\n        ]\n      },\n      {\n        \"name\": \"乐东黎族自治县\",\n        \"area\": [\n          \"乐东黎族自治县\"\n        ]\n      },\n      {\n        \"name\": \"陵水黎族自治县\",\n        \"area\": [\n          \"陵水黎族自治县\"\n        ]\n      },\n      {\n        \"name\": \"保亭黎族苗族自治县\",\n        \"area\": [\n          \"保亭黎族苗族自治县\"\n        ]\n      },\n      {\n        \"name\": \"琼中黎族苗族自治县\",\n        \"area\": [\n          \"琼中黎族苗族自治县\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"重庆市\",\n    \"city\": [\n      {\n        \"name\": \"重庆市\",\n        \"area\": [\n          \"渝中区\",\n          \"大渡口区\",\n          \"江北区\",\n          \"南岸区\",\n          \"北碚区\",\n          \"渝北区\",\n          \"巴南区\",\n          \"长寿区\",\n          \"双桥区\",\n          \"沙坪坝区\",\n          \"万盛区\",\n          \"万州区\",\n          \"涪陵区\",\n          \"黔江区\",\n          \"永川区\",\n          \"合川区\",\n          \"江津区\",\n          \"九龙坡区\",\n          \"南川区\",\n          \"綦江县\",\n          \"潼南县\",\n          \"荣昌县\",\n          \"璧山县\",\n          \"大足县\",\n          \"铜梁县\",\n          \"梁平县\",\n          \"开县\",\n          \"忠县\",\n          \"城口县\",\n          \"垫江县\",\n          \"武隆县\",\n          \"丰都县\",\n          \"奉节县\",\n          \"云阳县\",\n          \"巫溪县\",\n          \"巫山县\",\n          \"石柱土家族自治县\",\n          \"秀山土家族苗族自治县\",\n          \"酉阳土家族苗族自治县\",\n          \"彭水苗族土家族自治县\",\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"四川省\",\n    \"city\": [\n      {\n        \"name\": \"成都市\",\n        \"area\": [\n          \"青羊区\",\n          \"锦江区\",\n          \"金牛区\",\n          \"武侯区\",\n          \"成华区\",\n          \"龙泉驿区\",\n          \"青白江区\",\n          \"新都区\",\n          \"温江区\",\n          \"都江堰市\",\n          \"彭州市\",\n          \"邛崃市\",\n          \"崇州市\",\n          \"金堂县\",\n          \"郫县\",\n          \"新津县\",\n          \"双流县\",\n          \"蒲江县\",\n          \"大邑县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"自贡市\",\n        \"area\": [\n          \"大安区\",\n          \"自流井区\",\n          \"贡井区\",\n          \"沿滩区\",\n          \"荣县\",\n          \"富顺县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"攀枝花市\",\n        \"area\": [\n          \"仁和区\",\n          \"米易县\",\n          \"盐边县\",\n          \"东区\",\n          \"西区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"泸州市\",\n        \"area\": [\n          \"江阳区\",\n          \"纳溪区\",\n          \"龙马潭区\",\n          \"泸县\",\n          \"合江县\",\n          \"叙永县\",\n          \"古蔺县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"德阳市\",\n        \"area\": [\n          \"旌阳区\",\n          \"广汉市\",\n          \"什邡市\",\n          \"绵竹市\",\n          \"罗江县\",\n          \"中江县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"绵阳市\",\n        \"area\": [\n          \"涪城区\",\n          \"游仙区\",\n          \"江油市\",\n          \"盐亭县\",\n          \"三台县\",\n          \"平武县\",\n          \"安县\",\n          \"梓潼县\",\n          \"北川羌族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"广元市\",\n        \"area\": [\n          \"元坝区\",\n          \"朝天区\",\n          \"青川县\",\n          \"旺苍县\",\n          \"剑阁县\",\n          \"苍溪县\",\n          \"市中区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"遂宁市\",\n        \"area\": [\n          \"船山区\",\n          \"安居区\",\n          \"射洪县\",\n          \"蓬溪县\",\n          \"大英县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"内江市\",\n        \"area\": [\n          \"市中区\",\n          \"东兴区\",\n          \"资中县\",\n          \"隆昌县\",\n          \"威远县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"乐山市\",\n        \"area\": [\n          \"市中区\",\n          \"五通桥区\",\n          \"沙湾区\",\n          \"金口河区\",\n          \"峨眉山市\",\n          \"夹江县\",\n          \"井研县\",\n          \"犍为县\",\n          \"沐川县\",\n          \"马边彝族自治县\",\n          \"峨边彝族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"南充\",\n        \"area\": [\n          \"顺庆区\",\n          \"高坪区\",\n          \"嘉陵区\",\n          \"阆中市\",\n          \"营山县\",\n          \"蓬安县\",\n          \"仪陇县\",\n          \"南部县\",\n          \"西充县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"眉山市\",\n        \"area\": [\n          \"东坡区\",\n          \"仁寿县\",\n          \"彭山县\",\n          \"洪雅县\",\n          \"丹棱县\",\n          \"青神县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"宜宾市\",\n        \"area\": [\n          \"翠屏区\",\n          \"宜宾县\",\n          \"兴文县\",\n          \"南溪县\",\n          \"珙县\",\n          \"长宁县\",\n          \"高县\",\n          \"江安县\",\n          \"筠连县\",\n          \"屏山县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"广安市\",\n        \"area\": [\n          \"广安区\",\n          \"华蓥市\",\n          \"岳池县\",\n          \"邻水县\",\n          \"武胜县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"达州市\",\n        \"area\": [\n          \"通川区\",\n          \"万源市\",\n          \"达县\",\n          \"渠县\",\n          \"宣汉县\",\n          \"开江县\",\n          \"大竹县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"雅安市\",\n        \"area\": [\n          \"雨城区\",\n          \"芦山县\",\n          \"石棉县\",\n          \"名山县\",\n          \"天全县\",\n          \"荥经县\",\n          \"宝兴县\",\n          \"汉源县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"巴中市\",\n        \"area\": [\n          \"巴州区\",\n          \"南江县\",\n          \"平昌县\",\n          \"通江县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"资阳市\",\n        \"area\": [\n          \"雁江区\",\n          \"简阳市\",\n          \"安岳县\",\n          \"乐至县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"阿坝藏族羌族自治州\",\n        \"area\": [\n          \"马尔康县\",\n          \"九寨沟县\",\n          \"红原县\",\n          \"汶川县\",\n          \"阿坝县\",\n          \"理县\",\n          \"若尔盖县\",\n          \"小金县\",\n          \"黑水县\",\n          \"金川县\",\n          \"松潘县\",\n          \"壤塘县\",\n          \"茂县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"甘孜藏族自治州\",\n        \"area\": [\n          \"康定县\",\n          \"丹巴县\",\n          \"炉霍县\",\n          \"九龙县\",\n          \"甘孜县\",\n          \"雅江县\",\n          \"新龙县\",\n          \"道孚县\",\n          \"白玉县\",\n          \"理塘县\",\n          \"德格县\",\n          \"乡城县\",\n          \"石渠县\",\n          \"稻城县\",\n          \"色达县\",\n          \"巴塘县\",\n          \"泸定县\",\n          \"得荣县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"凉山彝族自治州\",\n        \"area\": [\n          \"西昌市\",\n          \"美姑县\",\n          \"昭觉县\",\n          \"金阳县\",\n          \"甘洛县\",\n          \"布拖县\",\n          \"雷波县\",\n          \"普格县\",\n          \"宁南县\",\n          \"喜德县\",\n          \"会东县\",\n          \"越西县\",\n          \"会理县\",\n          \"盐源县\",\n          \"德昌县\",\n          \"冕宁县\",\n          \"木里藏族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"贵州省\",\n    \"city\": [\n      {\n        \"name\": \"贵阳市\",\n        \"area\": [\n          \"南明区\",\n          \"云岩区\",\n          \"花溪区\",\n          \"乌当区\",\n          \"白云区\",\n          \"小河区\",\n          \"清镇市\",\n          \"开阳县\",\n          \"修文县\",\n          \"息烽县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"六盘水市\",\n        \"area\": [\n          \"钟山区\",\n          \"水城县\",\n          \"盘县\",\n          \"六枝特区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"遵义市\",\n        \"area\": [\n          \"红花岗区\",\n          \"汇川区\",\n          \"赤水市\",\n          \"仁怀市\",\n          \"遵义县\",\n          \"绥阳县\",\n          \"桐梓县\",\n          \"习水县\",\n          \"凤冈县\",\n          \"正安县\",\n          \"余庆县\",\n          \"湄潭县\",\n          \"道真仡佬族苗族自治县\",\n          \"务川仡佬族苗族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"安顺市\",\n        \"area\": [\n          \"西秀区\",\n          \"普定县\",\n          \"平坝县\",\n          \"镇宁布依族苗族自治县\",\n          \"紫云苗族布依族自治县\",\n          \"关岭布依族苗族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"铜仁地区\",\n        \"area\": [\n          \"铜仁市\",\n          \"德江县\",\n          \"江口县\",\n          \"思南县\",\n          \"石阡县\",\n          \"玉屏侗族自治县\",\n          \"松桃苗族自治县\",\n          \"印江土家族苗族自治县\",\n          \"沿河土家族自治县\",\n          \"万山特区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"毕节地区\",\n        \"area\": [\n          \"毕节市\",\n          \"黔西县\",\n          \"大方县\",\n          \"织金县\",\n          \"金沙县\",\n          \"赫章县\",\n          \"纳雍县\",\n          \"威宁彝族回族苗族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"黔西南布依族苗族自治州\",\n        \"area\": [\n          \"兴义市\",\n          \"望谟县\",\n          \"兴仁县\",\n          \"普安县\",\n          \"册亨县\",\n          \"晴隆县\",\n          \"贞丰县\",\n          \"安龙县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"黔东南苗族侗族自治州\",\n        \"area\": [\n          \"凯里市\",\n          \"施秉县\",\n          \"从江县\",\n          \"锦屏县\",\n          \"镇远县\",\n          \"麻江县\",\n          \"台江县\",\n          \"天柱县\",\n          \"黄平县\",\n          \"榕江县\",\n          \"剑河县\",\n          \"三穗县\",\n          \"雷山县\",\n          \"黎平县\",\n          \"岑巩县\",\n          \"丹寨县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"黔南布依族苗族自治州\",\n        \"area\": [\n          \"都匀市\",\n          \"福泉市\",\n          \"贵定县\",\n          \"惠水县\",\n          \"罗甸县\",\n          \"瓮安县\",\n          \"荔波县\",\n          \"龙里县\",\n          \"平塘县\",\n          \"长顺县\",\n          \"独山县\",\n          \"三都水族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"云南省\",\n    \"city\": [\n      {\n        \"name\": \"昆明市\",\n        \"area\": [\n          \"盘龙区\",\n          \"五华区\",\n          \"官渡区\",\n          \"西山区\",\n          \"东川区\",\n          \"安宁市\",\n          \"呈贡县\",\n          \"晋宁县\",\n          \"富民县\",\n          \"宜良县\",\n          \"嵩明县\",\n          \"石林彝族自治县\",\n          \"禄劝彝族苗族自治县\",\n          \"寻甸回族彝族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"曲靖市\",\n        \"area\": [\n          \"麒麟区\",\n          \"宣威市\",\n          \"马龙县\",\n          \"沾益县\",\n          \"富源县\",\n          \"罗平县\",\n          \"师宗县\",\n          \"陆良县\",\n          \"会泽县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"玉溪市\",\n        \"area\": [\n          \"红塔区\",\n          \"江川县\",\n          \"澄江县\",\n          \"通海县\",\n          \"华宁县\",\n          \"易门县\",\n          \"峨山彝族自治县\",\n          \"新平彝族傣族自治县\",\n          \"元江哈尼族彝族傣族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"保山市\",\n        \"area\": [\n          \"隆阳区\",\n          \"施甸县\",\n          \"腾冲县\",\n          \"龙陵县\",\n          \"昌宁县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"昭通市\",\n        \"area\": [\n          \"昭阳区\",\n          \"鲁甸县\",\n          \"巧家县\",\n          \"盐津县\",\n          \"大关县\",\n          \"永善县\",\n          \"绥江县\",\n          \"镇雄县\",\n          \"彝良县\",\n          \"威信县\",\n          \"水富县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"丽江市\",\n        \"area\": [\n          \"古城区\",\n          \"永胜县\",\n          \"华坪县\",\n          \"玉龙纳西族自治县\",\n          \"宁蒗彝族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"普洱市\",\n        \"area\": [\n          \"思茅区\",\n          \"普洱哈尼族彝族自治县\",\n          \"墨江哈尼族自治县\",\n          \"景东彝族自治县\",\n          \"景谷傣族彝族自治县\",\n          \"镇沅彝族哈尼族拉祜族自治县\",\n          \"江城哈尼族彝族自治县\",\n          \"孟连傣族拉祜族佤族自治县\",\n          \"澜沧拉祜族自治县\",\n          \"西盟佤族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"临沧市\",\n        \"area\": [\n          \"临翔区\",\n          \"凤庆县\",\n          \"云县\",\n          \"永德县\",\n          \"镇康县\",\n          \"双江拉祜族佤族布朗族傣族自治县\",\n          \"耿马傣族佤族自治县\",\n          \"沧源佤族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"德宏傣族景颇族自治州\",\n        \"area\": [\n          \"潞西市\",\n          \"瑞丽市\",\n          \"梁河县\",\n          \"盈江县\",\n          \"陇川县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"怒江傈僳族自治州\",\n        \"area\": [\n          \"泸水县\",\n          \"福贡县\",\n          \"贡山独龙族怒族自治县\",\n          \"兰坪白族普米族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"迪庆藏族自治州\",\n        \"area\": [\n          \"香格里拉县\",\n          \"德钦县\",\n          \"维西傈僳族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"大理白族自治州\",\n        \"area\": [\n          \"大理市\",\n          \"祥云县\",\n          \"宾川县\",\n          \"弥渡县\",\n          \"永平县\",\n          \"云龙县\",\n          \"洱源县\",\n          \"剑川县\",\n          \"鹤庆县\",\n          \"漾濞彝族自治县\",\n          \"南涧彝族自治县\",\n          \"巍山彝族回族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"楚雄彝族自治州\",\n        \"area\": [\n          \"楚雄市\",\n          \"双柏县\",\n          \"牟定县\",\n          \"南华县\",\n          \"姚安县\",\n          \"大姚县\",\n          \"永仁县\",\n          \"元谋县\",\n          \"武定县\",\n          \"禄丰县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"红河哈尼族彝族自治州\",\n        \"area\": [\n          \"蒙自县\",\n          \"个旧市\",\n          \"开远市\",\n          \"绿春县\",\n          \"建水县\",\n          \"石屏县\",\n          \"弥勒县\",\n          \"泸西县\",\n          \"元阳县\",\n          \"红河县\",\n          \"金平苗族瑶族傣族自治县\",\n          \"河口瑶族自治县\",\n          \"屏边苗族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"文山壮族苗族自治州\",\n        \"area\": [\n          \"文山县\",\n          \"砚山县\",\n          \"西畴县\",\n          \"麻栗坡县\",\n          \"马关县\",\n          \"丘北县\",\n          \"广南县\",\n          \"富宁县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"西双版纳傣族自治州\",\n        \"area\": [\n          \"景洪市\",\n          \"勐海县\",\n          \"勐腊县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"西藏\",\n    \"city\": [\n      {\n        \"name\": \"拉萨市\",\n        \"area\": [\n          \"城关区\",\n          \"林周县\",\n          \"当雄县\",\n          \"尼木县\",\n          \"曲水县\",\n          \"堆龙德庆县\",\n          \"达孜县\",\n          \"墨竹工卡县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"那曲地区\",\n        \"area\": [\n          \"那曲县\",\n          \"嘉黎县\",\n          \"比如县\",\n          \"聂荣县\",\n          \"安多县\",\n          \"申扎县\",\n          \"索县\",\n          \"班戈县\",\n          \"巴青县\",\n          \"尼玛县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"昌都地区\",\n        \"area\": [\n          \"昌都县\",\n          \"江达县\",\n          \"贡觉县\",\n          \"类乌齐县\",\n          \"丁青县\",\n          \"察雅县\",\n          \"八宿县\",\n          \"左贡县\",\n          \"芒康县\",\n          \"洛隆县\",\n          \"边坝县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"林芝地区\",\n        \"area\": [\n          \"林芝县\",\n          \"工布江达县\",\n          \"米林县\",\n          \"墨脱县\",\n          \"波密县\",\n          \"察隅县\",\n          \"朗县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"山南地区\",\n        \"area\": [\n          \"乃东县\",\n          \"扎囊县\",\n          \"贡嘎县\",\n          \"桑日县\",\n          \"琼结县\",\n          \"曲松县\",\n          \"措美县\",\n          \"洛扎县\",\n          \"加查县\",\n          \"隆子县\",\n          \"错那县\",\n          \"浪卡子县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"日喀则地区\",\n        \"area\": [\n          \"日喀则市\",\n          \"南木林县\",\n          \"江孜县\",\n          \"定日县\",\n          \"萨迦县\",\n          \"拉孜县\",\n          \"昂仁县\",\n          \"谢通门县\",\n          \"白朗县\",\n          \"仁布县\",\n          \"康马县\",\n          \"定结县\",\n          \"仲巴县\",\n          \"亚东县\",\n          \"吉隆县\",\n          \"聂拉木县\",\n          \"萨嘎县\",\n          \"岗巴县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"阿里地区\",\n        \"area\": [\n          \"噶尔县\",\n          \"普兰县\",\n          \"札达县\",\n          \"日土县\",\n          \"革吉县\",\n          \"改则县\",\n          \"措勤县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"陕西省\",\n    \"city\": [\n      {\n        \"name\": \"西安市\",\n        \"area\": [\n          \"莲湖区\",\n          \"新城区\",\n          \"碑林区\",\n          \"雁塔区\",\n          \"灞桥区\",\n          \"未央区\",\n          \"阎良区\",\n          \"临潼区\",\n          \"长安区\",\n          \"高陵县\",\n          \"蓝田县\",\n          \"户县\",\n          \"周至县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"铜川市\",\n        \"area\": [\n          \"耀州区\",\n          \"王益区\",\n          \"印台区\",\n          \"宜君县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"宝鸡市\",\n        \"area\": [\n          \"渭滨区\",\n          \"金台区\",\n          \"陈仓区\",\n          \"岐山县\",\n          \"凤翔县\",\n          \"陇县\",\n          \"太白县\",\n          \"麟游县\",\n          \"扶风县\",\n          \"千阳县\",\n          \"眉县\",\n          \"凤县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"咸阳市\",\n        \"area\": [\n          \"秦都区\",\n          \"渭城区\",\n          \"杨陵区\",\n          \"兴平市\",\n          \"礼泉县\",\n          \"泾阳县\",\n          \"永寿县\",\n          \"三原县\",\n          \"彬县\",\n          \"旬邑县\",\n          \"长武县\",\n          \"乾县\",\n          \"武功县\",\n          \"淳化县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"渭南市\",\n        \"area\": [\n          \"临渭区\",\n          \"韩城市\",\n          \"华阴市\",\n          \"蒲城县\",\n          \"潼关县\",\n          \"白水县\",\n          \"澄城县\",\n          \"华县\",\n          \"合阳县\",\n          \"富平县\",\n          \"大荔县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"延安市\",\n        \"area\": [\n          \"宝塔区\",\n          \"安塞县\",\n          \"洛川县\",\n          \"子长县\",\n          \"黄陵县\",\n          \"延川县\",\n          \"富县\",\n          \"延长县\",\n          \"甘泉县\",\n          \"宜川县\",\n          \"志丹县\",\n          \"黄龙县\",\n          \"吴起县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"汉中市\",\n        \"area\": [\n          \"汉台区\",\n          \"留坝县\",\n          \"镇巴县\",\n          \"城固县\",\n          \"南郑县\",\n          \"洋县\",\n          \"宁强县\",\n          \"佛坪县\",\n          \"勉县\",\n          \"西乡县\",\n          \"略阳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"榆林市\",\n        \"area\": [\n          \"榆阳区\",\n          \"清涧县\",\n          \"绥德县\",\n          \"神木县\",\n          \"佳县\",\n          \"府谷县\",\n          \"子洲县\",\n          \"靖边县\",\n          \"横山县\",\n          \"米脂县\",\n          \"吴堡县\",\n          \"定边县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"安康市\",\n        \"area\": [\n          \"汉滨区\",\n          \"紫阳县\",\n          \"岚皋县\",\n          \"旬阳县\",\n          \"镇坪县\",\n          \"平利县\",\n          \"石泉县\",\n          \"宁陕县\",\n          \"白河县\",\n          \"汉阴县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"商洛市\",\n        \"area\": [\n          \"商州区\",\n          \"镇安县\",\n          \"山阳县\",\n          \"洛南县\",\n          \"商南县\",\n          \"丹凤县\",\n          \"柞水县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"甘肃省\",\n    \"city\": [\n      {\n        \"name\": \"兰州市\",\n        \"area\": [\n          \"城关区\",\n          \"七里河区\",\n          \"西固区\",\n          \"安宁区\",\n          \"红古区\",\n          \"永登县\",\n          \"皋兰县\",\n          \"榆中县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"嘉峪关市\",\n        \"area\": [\n          \"嘉峪关市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"金昌市\",\n        \"area\": [\n          \"金川区\",\n          \"永昌县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"白银市\",\n        \"area\": [\n          \"白银区\",\n          \"平川区\",\n          \"靖远县\",\n          \"会宁县\",\n          \"景泰县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"天水市\",\n        \"area\": [\n          \"清水县\",\n          \"秦安县\",\n          \"甘谷县\",\n          \"武山县\",\n          \"张家川回族自治县\",\n          \"北道区\",\n          \"秦城区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"武威市\",\n        \"area\": [\n          \"凉州区\",\n          \"民勤县\",\n          \"古浪县\",\n          \"天祝藏族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"酒泉市\",\n        \"area\": [\n          \"肃州区\",\n          \"玉门市\",\n          \"敦煌市\",\n          \"金塔县\",\n          \"肃北蒙古族自治县\",\n          \"阿克塞哈萨克族自治县\",\n          \"安西县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"张掖市\",\n        \"area\": [\n          \"甘州区\",\n          \"民乐县\",\n          \"临泽县\",\n          \"高台县\",\n          \"山丹县\",\n          \"肃南裕固族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"庆阳市\",\n        \"area\": [\n          \"西峰区\",\n          \"庆城县\",\n          \"环县\",\n          \"华池县\",\n          \"合水县\",\n          \"正宁县\",\n          \"宁县\",\n          \"镇原县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"平凉市\",\n        \"area\": [\n          \"崆峒区\",\n          \"泾川县\",\n          \"灵台县\",\n          \"崇信县\",\n          \"华亭县\",\n          \"庄浪县\",\n          \"静宁县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"定西市\",\n        \"area\": [\n          \"安定区\",\n          \"通渭县\",\n          \"临洮县\",\n          \"漳县\",\n          \"岷县\",\n          \"渭源县\",\n          \"陇西县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"陇南市\",\n        \"area\": [\n          \"武都区\",\n          \"成县\",\n          \"宕昌县\",\n          \"康县\",\n          \"文县\",\n          \"西和县\",\n          \"礼县\",\n          \"两当县\",\n          \"徽县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"临夏回族自治州\",\n        \"area\": [\n          \"临夏市\",\n          \"临夏县\",\n          \"康乐县\",\n          \"永靖县\",\n          \"广河县\",\n          \"和政县\",\n          \"东乡族自治县\",\n          \"积石山保安族东乡族撒拉族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"甘南藏族自治州\",\n        \"area\": [\n          \"合作市\",\n          \"临潭县\",\n          \"卓尼县\",\n          \"舟曲县\",\n          \"迭部县\",\n          \"玛曲县\",\n          \"碌曲县\",\n          \"夏河县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"青海省\",\n    \"city\": [\n      {\n        \"name\": \"西宁市\",\n        \"area\": [\n          \"城中区\",\n          \"城东区\",\n          \"城西区\",\n          \"城北区\",\n          \"湟源县\",\n          \"湟中县\",\n          \"大通回族土族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"海东地区\",\n        \"area\": [\n          \"平安县\",\n          \"乐都县\",\n          \"民和回族土族自治县\",\n          \"互助土族自治县\",\n          \"化隆回族自治县\",\n          \"循化撒拉族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"海北藏族自治州\",\n        \"area\": [\n          \"海晏县\",\n          \"祁连县\",\n          \"刚察县\",\n          \"门源回族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"海南藏族自治州\",\n        \"area\": [\n          \"共和县\",\n          \"同德县\",\n          \"贵德县\",\n          \"兴海县\",\n          \"贵南县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"黄南藏族自治州\",\n        \"area\": [\n          \"同仁县\",\n          \"尖扎县\",\n          \"泽库县\",\n          \"河南蒙古族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"果洛藏族自治州\",\n        \"area\": [\n          \"玛沁县\",\n          \"班玛县\",\n          \"甘德县\",\n          \"达日县\",\n          \"久治县\",\n          \"玛多县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"玉树藏族自治州\",\n        \"area\": [\n          \"玉树县\",\n          \"杂多县\",\n          \"称多县\",\n          \"治多县\",\n          \"囊谦县\",\n          \"曲麻莱县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"海西蒙古族藏族自治州\",\n        \"area\": [\n          \"德令哈市\",\n          \"格尔木市\",\n          \"乌兰县\",\n          \"都兰县\",\n          \"天峻县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"宁夏\",\n    \"city\": [\n      {\n        \"name\": \"银川市\",\n        \"area\": [\n          \"兴庆区\",\n          \"西夏区\",\n          \"金凤区\",\n          \"灵武市\",\n          \"永宁县\",\n          \"贺兰县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"石嘴山市\",\n        \"area\": [\n          \"大武口区\",\n          \"惠农区\",\n          \"平罗县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"吴忠市\",\n        \"area\": [\n          \"利通区\",\n          \"青铜峡市\",\n          \"盐池县\",\n          \"同心县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"固原市\",\n        \"area\": [\n          \"原州区\",\n          \"西吉县\",\n          \"隆德县\",\n          \"泾源县\",\n          \"彭阳县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"中卫市\",\n        \"area\": [\n          \"沙坡头区\",\n          \"中宁县\",\n          \"海原县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"新疆\",\n    \"city\": [\n      {\n        \"name\": \"乌鲁木齐市\",\n        \"area\": [\n          \"天山区\",\n          \"沙依巴克区\",\n          \"新市区\",\n          \"水磨沟区\",\n          \"头屯河区\",\n          \"达坂城区\",\n          \"东山区\",\n          \"乌鲁木齐县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"克拉玛依市\",\n        \"area\": [\n          \"克拉玛依区\",\n          \"独山子区\",\n          \"白碱滩区\",\n          \"乌尔禾区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"吐鲁番地区\",\n        \"area\": [\n          \"吐鲁番市\",\n          \"托克逊县\",\n          \"鄯善县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"哈密地区\",\n        \"area\": [\n          \"哈密市\",\n          \"伊吾县\",\n          \"巴里坤哈萨克自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"和田地区\",\n        \"area\": [\n          \"和田市\",\n          \"和田县\",\n          \"洛浦县\",\n          \"民丰县\",\n          \"皮山县\",\n          \"策勒县\",\n          \"于田县\",\n          \"墨玉县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"阿克苏地区\",\n        \"area\": [\n          \"阿克苏市\",\n          \"温宿县\",\n          \"沙雅县\",\n          \"拜城县\",\n          \"阿瓦提县\",\n          \"库车县\",\n          \"柯坪县\",\n          \"新和县\",\n          \"乌什县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"喀什地区\",\n        \"area\": [\n          \"喀什市\",\n          \"巴楚县\",\n          \"泽普县\",\n          \"伽师县\",\n          \"叶城县\",\n          \"岳普湖县\",\n          \"疏勒县\",\n          \"麦盖提县\",\n          \"英吉沙县\",\n          \"莎车县\",\n          \"疏附县\",\n          \"塔什库尔干塔吉克自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"克孜勒苏柯尔克孜自治州\",\n        \"area\": [\n          \"阿图什市\",\n          \"阿合奇县\",\n          \"乌恰县\",\n          \"阿克陶县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"巴音郭楞蒙古自治州\",\n        \"area\": [\n          \"库尔勒市\",\n          \"和静县\",\n          \"尉犁县\",\n          \"和硕县\",\n          \"且末县\",\n          \"博湖县\",\n          \"轮台县\",\n          \"若羌县\",\n          \"焉耆回族自治县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"昌吉回族自治州\",\n        \"area\": [\n          \"昌吉市\",\n          \"阜康市\",\n          \"奇台县\",\n          \"玛纳斯县\",\n          \"吉木萨尔县\",\n          \"呼图壁县\",\n          \"木垒哈萨克自治县\",\n          \"米泉市\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"博尔塔拉蒙古自治州\",\n        \"area\": [\n          \"博乐市\",\n          \"精河县\",\n          \"温泉县\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"石河子\",\n        \"area\": [\n          \"石河子\"\n        ]\n      },\n      {\n        \"name\": \"阿拉尔\",\n        \"area\": [\n          \"阿拉尔\"\n        ]\n      },\n      {\n        \"name\": \"图木舒克\",\n        \"area\": [\n          \"图木舒克\"\n        ]\n      },\n      {\n        \"name\": \"五家渠\",\n        \"area\": [\n          \"五家渠\"\n        ]\n      },\n      {\n        \"name\": \"伊犁哈萨克自治州\",\n        \"area\": [\n          \"伊宁市\",\n          \"奎屯市\",\n          \"伊宁县\",\n          \"特克斯县\",\n          \"尼勒克县\",\n          \"昭苏县\",\n          \"新源县\",\n          \"霍城县\",\n          \"巩留县\",\n          \"察布查尔锡伯自治县\",\n          \"塔城地区\",\n          \"阿勒泰地区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"其他\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"台湾省\",\n    \"city\": [\n      {\n        \"name\": \"台北市\",\n        \"area\": [\n          \"内湖区\",\n          \"南港区\",\n          \"中正区\",\n          \"万华区\",\n          \"大同区\",\n          \"中山区\",\n          \"松山区\",\n          \"大安区\",\n          \"信义区\",\n          \"文山区\",\n          \"士林区\",\n          \"北投区\"\n        ]\n      },\n      {\n        \"name\": \"新北市\",\n        \"area\": [\n          \"板桥区\",\n          \"汐止区\",\n          \"新店区\",\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"桃园市\",\n        \"area\": [\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"台中市\",\n        \"area\": [\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"台南市\",\n        \"area\": [\n          \"其他\"\n        ]\n      },\n      {\n        \"name\": \"高雄市\",\n        \"area\": [\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"澳门\",\n    \"city\": [\n      {\n        \"name\": \"澳门\",\n        \"area\": [\n          \"花地玛堂区\",\n          \"圣安多尼堂区\",\n          \"大堂区\",\n          \"望德堂区\",\n          \"风顺堂区\",\n          \"嘉模堂区\",\n          \"圣方济各堂区\",\n          \"路凼\",\n          \"其他\"\n        ]\n      }\n    ]\n  },\n  {\n    \"name\": \"香港\",\n    \"city\": [\n      {\n        \"name\": \"香港\",\n        \"area\": [\n          \"深水埗区\",\n          \"油尖旺区\",\n          \"九龙城区\",\n          \"黄大仙区\",\n          \"观塘区\",\n          \"北区\",\n          \"大埔区\",\n          \"沙田区\",\n          \"西贡区\",\n          \"元朗区\",\n          \"屯门区\",\n          \"荃湾区\",\n          \"葵青区\",\n          \"离岛区\",\n          \"中西区\",\n          \"湾仔区\",\n          \"东区\",\n          \"南区\",\n          \"其他\"\n        ]\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "app/src/main/java/com/bigkoo/pickerviewdemo/FragmentTestActivity.java",
    "content": "package com.bigkoo.pickerviewdemo;\n\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentTransaction;\nimport android.support.v7.app.AppCompatActivity;\n\npublic class FragmentTestActivity extends AppCompatActivity {\n    private FragmentManager mFragmentManager;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_fragmenttest);\n        mFragmentManager = getSupportFragmentManager();\n        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();\n        fragmentTransaction.replace(R.id.frame_activity_main, new TestFragment());\n        fragmentTransaction.commitAllowingStateLoss();\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bigkoo/pickerviewdemo/GetJsonDataUtil.java",
    "content": "package com.bigkoo.pickerviewdemo;\n\nimport android.content.Context;\nimport android.content.res.AssetManager;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\n\n/**\n * <读取Json文件的工具类>\n *\n * @author: 小嵩\n * @date: 2017/3/16 16:22\n\n */\n\npublic class GetJsonDataUtil {\n\n\n    public String getJson(Context context,String fileName) {\n\n        StringBuilder stringBuilder = new StringBuilder();\n        try {\n            AssetManager assetManager = context.getAssets();\n            BufferedReader bf = new BufferedReader(new InputStreamReader(\n                    assetManager.open(fileName)));\n            String line;\n            while ((line = bf.readLine()) != null) {\n                stringBuilder.append(line);\n            }\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        return stringBuilder.toString();\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/bigkoo/pickerviewdemo/JsonDataActivity.java",
    "content": "package com.bigkoo.pickerviewdemo;\n\nimport android.annotation.SuppressLint;\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\nimport android.widget.Toast;\n\nimport com.bigkoo.pickerview.builder.OptionsPickerBuilder;\nimport com.bigkoo.pickerview.listener.OnOptionsSelectListener;\nimport com.bigkoo.pickerview.view.OptionsPickerView;\nimport com.bigkoo.pickerviewdemo.bean.JsonBean;\nimport com.google.gson.Gson;\n\nimport org.json.JSONArray;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 解析省市区数据示例\n *\n * @author 小嵩\n * @date 2017-3-16\n */\npublic class JsonDataActivity extends AppCompatActivity implements View.OnClickListener {\n\n\n    private List<JsonBean> options1Items = new ArrayList<>();\n    private ArrayList<ArrayList<String>> options2Items = new ArrayList<>();\n    private ArrayList<ArrayList<ArrayList<String>>> options3Items = new ArrayList<>();\n    private Thread thread;\n    private static final int MSG_LOAD_DATA = 0x0001;\n    private static final int MSG_LOAD_SUCCESS = 0x0002;\n    private static final int MSG_LOAD_FAILED = 0x0003;\n\n    private static boolean isLoaded = false;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_json_data);\n        initView();\n    }\n\n    @SuppressLint(\"HandlerLeak\")\n    private Handler mHandler = new Handler() {\n        public void handleMessage(Message msg) {\n            switch (msg.what) {\n                case MSG_LOAD_DATA:\n                    if (thread == null) {//如果已创建就不再重新创建子线程了\n\n                        Toast.makeText(JsonDataActivity.this, \"Begin Parse Data\", Toast.LENGTH_SHORT).show();\n                        thread = new Thread(new Runnable() {\n                            @Override\n                            public void run() {\n                                // 子线程中解析省市区数据\n                                initJsonData();\n                            }\n                        });\n                        thread.start();\n                    }\n                    break;\n\n                case MSG_LOAD_SUCCESS:\n                    Toast.makeText(JsonDataActivity.this, \"Parse Succeed\", Toast.LENGTH_SHORT).show();\n                    isLoaded = true;\n                    break;\n\n                case MSG_LOAD_FAILED:\n                    Toast.makeText(JsonDataActivity.this, \"Parse Failed\", Toast.LENGTH_SHORT).show();\n                    break;\n            }\n        }\n    };\n\n    private void initView() {\n        findViewById(R.id.btn_data).setOnClickListener(this);\n        findViewById(R.id.btn_show).setOnClickListener(this);\n    }\n\n    @Override\n    public void onClick(View v) {\n        switch (v.getId()) {\n            case R.id.btn_data:\n                mHandler.sendEmptyMessage(MSG_LOAD_DATA);\n                break;\n            case R.id.btn_show:\n                if (isLoaded) {\n                    showPickerView();\n                } else {\n                    Toast.makeText(JsonDataActivity.this, \"Please waiting until the data is parsed\", Toast.LENGTH_SHORT).show();\n                }\n                break;\n        }\n    }\n\n\n    private void showPickerView() {// 弹出选择器\n\n        OptionsPickerView pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {\n            @Override\n            public void onOptionsSelect(int options1, int options2, int options3, View v) {\n                //返回的分别是三个级别的选中位置\n                String opt1tx = options1Items.size() > 0 ?\n                        options1Items.get(options1).getPickerViewText() : \"\";\n\n                String opt2tx = options2Items.size() > 0\n                        && options2Items.get(options1).size() > 0 ?\n                        options2Items.get(options1).get(options2) : \"\";\n\n                String opt3tx = options2Items.size() > 0\n                        && options3Items.get(options1).size() > 0\n                        && options3Items.get(options1).get(options2).size() > 0 ?\n                        options3Items.get(options1).get(options2).get(options3) : \"\";\n\n                String tx = opt1tx + opt2tx + opt3tx;\n                Toast.makeText(JsonDataActivity.this, tx, Toast.LENGTH_SHORT).show();\n            }\n        })\n\n                .setTitleText(\"城市选择\")\n                .setDividerColor(Color.BLACK)\n                .setTextColorCenter(Color.BLACK) //设置选中项文字颜色\n                .setContentTextSize(20)\n                .build();\n\n        /*pvOptions.setPicker(options1Items);//一级选择器\n        pvOptions.setPicker(options1Items, options2Items);//二级选择器*/\n        pvOptions.setPicker(options1Items, options2Items, options3Items);//三级选择器\n        pvOptions.show();\n    }\n\n    private void initJsonData() {//解析数据\n\n        /**\n         * 注意：assets 目录下的Json文件仅供参考，实际使用可自行替换文件\n         * 关键逻辑在于循环体\n         *\n         * */\n        String JsonData = new GetJsonDataUtil().getJson(this, \"province.json\");//获取assets目录下的json文件数据\n\n        ArrayList<JsonBean> jsonBean = parseData(JsonData);//用Gson 转成实体\n\n        /**\n         * 添加省份数据\n         *\n         * 注意：如果是添加的JavaBean实体，则实体类需要实现 IPickerViewData 接口，\n         * PickerView会通过getPickerViewText方法获取字符串显示出来。\n         */\n        options1Items = jsonBean;\n\n        for (int i = 0; i < jsonBean.size(); i++) {//遍历省份\n            ArrayList<String> cityList = new ArrayList<>();//该省的城市列表（第二级）\n            ArrayList<ArrayList<String>> province_AreaList = new ArrayList<>();//该省的所有地区列表（第三极）\n\n            for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍历该省份的所有城市\n                String cityName = jsonBean.get(i).getCityList().get(c).getName();\n                cityList.add(cityName);//添加城市\n                ArrayList<String> city_AreaList = new ArrayList<>();//该城市的所有地区列表\n\n                //如果无地区数据，建议添加空字符串，防止数据为null 导致三个选项长度不匹配造成崩溃\n                /*if (jsonBean.get(i).getCityList().get(c).getArea() == null\n                        || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) {\n                    city_AreaList.add(\"\");\n                } else {\n                    city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());\n                }*/\n                city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());\n                province_AreaList.add(city_AreaList);//添加该省所有地区数据\n            }\n\n            /**\n             * 添加城市数据\n             */\n            options2Items.add(cityList);\n\n            /**\n             * 添加地区数据\n             */\n            options3Items.add(province_AreaList);\n        }\n\n        mHandler.sendEmptyMessage(MSG_LOAD_SUCCESS);\n\n    }\n\n\n    public ArrayList<JsonBean> parseData(String result) {//Gson 解析\n        ArrayList<JsonBean> detail = new ArrayList<>();\n        try {\n            JSONArray data = new JSONArray(result);\n            Gson gson = new Gson();\n            for (int i = 0; i < data.length(); i++) {\n                JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class);\n                detail.add(entity);\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n            mHandler.sendEmptyMessage(MSG_LOAD_FAILED);\n        }\n        return detail;\n    }\n\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        if (mHandler != null) {\n            mHandler.removeCallbacksAndMessages(null);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java",
    "content": "package com.bigkoo.pickerviewdemo;\n\nimport android.app.Dialog;\nimport android.content.Intent;\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.util.Log;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.Window;\nimport android.widget.Button;\nimport android.widget.CheckBox;\nimport android.widget.CompoundButton;\nimport android.widget.FrameLayout;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.bigkoo.pickerview.builder.OptionsPickerBuilder;\nimport com.bigkoo.pickerview.builder.TimePickerBuilder;\nimport com.bigkoo.pickerview.listener.CustomListener;\nimport com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;\nimport com.bigkoo.pickerview.listener.OnOptionsSelectListener;\nimport com.bigkoo.pickerview.listener.OnTimeSelectChangeListener;\nimport com.bigkoo.pickerview.listener.OnTimeSelectListener;\nimport com.bigkoo.pickerview.view.OptionsPickerView;\nimport com.bigkoo.pickerview.view.TimePickerView;\nimport com.bigkoo.pickerviewdemo.bean.CardBean;\nimport com.bigkoo.pickerviewdemo.bean.ProvinceBean;\n\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Calendar;\nimport java.util.Date;\n\n\npublic class MainActivity extends AppCompatActivity implements View.OnClickListener {\n\n    private ArrayList<ProvinceBean> options1Items = new ArrayList<>();\n    private ArrayList<ArrayList<String>> options2Items = new ArrayList<>();\n\n    private Button btn_Options;\n    private Button btn_CustomOptions;\n    private Button btn_CustomTime;\n\n    private TimePickerView pvTime, pvCustomTime, pvCustomLunar;\n    private OptionsPickerView pvOptions, pvCustomOptions, pvNoLinkOptions;\n    private ArrayList<CardBean> cardItem = new ArrayList<>();\n\n    private ArrayList<String> food = new ArrayList<>();\n    private ArrayList<String> clothes = new ArrayList<>();\n    private ArrayList<String> computer = new ArrayList<>();\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        //等数据加载完毕再初始化并显示Picker,以免还未加载完数据就显示,造成APP崩溃。\n        getOptionData();\n\n        initTimePicker();\n        initCustomTimePicker();\n        initLunarPicker();\n        initOptionPicker();\n        initCustomOptionPicker();\n        initNoLinkOptionsPicker();\n\n        Button btn_Time = (Button) findViewById(R.id.btn_Time);\n        btn_Options = (Button) findViewById(R.id.btn_Options);\n        btn_CustomOptions = (Button) findViewById(R.id.btn_CustomOptions);\n        btn_CustomTime = (Button) findViewById(R.id.btn_CustomTime);\n        Button btn_no_linkage = (Button) findViewById(R.id.btn_no_linkage);\n        Button btn_to_Fragment = (Button) findViewById(R.id.btn_fragment);\n        Button btn_circle = (Button) findViewById(R.id.btn_circle);\n\n\n        btn_Time.setOnClickListener(this);\n        btn_Options.setOnClickListener(this);\n        btn_CustomOptions.setOnClickListener(this);\n        btn_CustomTime.setOnClickListener(this);\n        btn_no_linkage.setOnClickListener(this);\n        btn_to_Fragment.setOnClickListener(this);\n        btn_circle.setOnClickListener(this);\n\n        findViewById(R.id.btn_GotoJsonData).setOnClickListener(this);\n        findViewById(R.id.btn_lunar).setOnClickListener(this);\n    }\n\n\n    @Override\n    public void onClick(View v) {\n        if (v.getId() == R.id.btn_Time && pvTime != null) {\n            // pvTime.setDate(Calendar.getInstance());\n            /* pvTime.show(); //show timePicker*/\n            pvTime.show(v);//弹出时间选择器，传递参数过去，回调的时候则可以绑定此view\n        } else if (v.getId() == R.id.btn_Options && pvOptions != null) {\n            pvOptions.show(); //弹出条件选择器\n        } else if (v.getId() == R.id.btn_CustomOptions && pvCustomOptions != null) {\n            pvCustomOptions.show(); //弹出自定义条件选择器\n        } else if (v.getId() == R.id.btn_CustomTime && pvCustomTime != null) {\n            pvCustomTime.show(); //弹出自定义时间选择器\n        } else if (v.getId() == R.id.btn_no_linkage && pvNoLinkOptions != null) {//不联动数据选择器\n            pvNoLinkOptions.show();\n        } else if (v.getId() == R.id.btn_GotoJsonData) {//跳转到 省市区解析示例页面\n            startActivity(new Intent(MainActivity.this, JsonDataActivity.class));\n        } else if (v.getId() == R.id.btn_fragment) {//跳转到 fragment\n            startActivity(new Intent(MainActivity.this, FragmentTestActivity.class));\n        } else if (v.getId() == R.id.btn_lunar) {\n            pvCustomLunar.show();\n        } else if (v.getId() == R.id.btn_circle) {\n            startActivity(new Intent(MainActivity.this, TestCircleWheelViewActivity.class));\n        }\n    }\n\n    /**\n     * 农历时间已扩展至 ： 1900 - 2100年\n     */\n    private void initLunarPicker() {\n        Calendar selectedDate = Calendar.getInstance();//系统当前时间\n        Calendar startDate = Calendar.getInstance();\n        startDate.set(2014, 1, 23);\n        Calendar endDate = Calendar.getInstance();\n        endDate.set(2069, 2, 28);\n        //时间选择器 ，自定义布局\n        pvCustomLunar = new TimePickerBuilder(this, new OnTimeSelectListener() {\n            @Override\n            public void onTimeSelect(Date date, View v) {//选中事件回调\n                Toast.makeText(MainActivity.this, getTime(date), Toast.LENGTH_SHORT).show();\n            }\n        })\n                .setDate(selectedDate)\n                .setRangDate(startDate, endDate)\n                .setLayoutRes(R.layout.pickerview_custom_lunar, new CustomListener() {\n\n                    @Override\n                    public void customLayout(final View v) {\n                        final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);\n                        ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);\n                        tvSubmit.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomLunar.returnData();\n                                pvCustomLunar.dismiss();\n                            }\n                        });\n                        ivCancel.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomLunar.dismiss();\n                            }\n                        });\n                        //公农历切换\n                        CheckBox cb_lunar = (CheckBox) v.findViewById(R.id.cb_lunar);\n                        cb_lunar.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\n                            @Override\n                            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n                                pvCustomLunar.setLunarCalendar(!pvCustomLunar.isLunarCalendar());\n                                //自适应宽\n                                setTimePickerChildWeight(v, isChecked ? 0.8f : 1f, isChecked ? 1f : 1.1f);\n                            }\n                        });\n\n                    }\n\n                    /**\n                     * 公农历切换后调整宽\n                     * @param v\n                     * @param yearWeight\n                     * @param weight\n                     */\n                    private void setTimePickerChildWeight(View v, float yearWeight, float weight) {\n                        ViewGroup timePicker = (ViewGroup) v.findViewById(R.id.timepicker);\n                        View year = timePicker.getChildAt(0);\n                        LinearLayout.LayoutParams lp = ((LinearLayout.LayoutParams) year.getLayoutParams());\n                        lp.weight = yearWeight;\n                        year.setLayoutParams(lp);\n                        for (int i = 1; i < timePicker.getChildCount(); i++) {\n                            View childAt = timePicker.getChildAt(i);\n                            LinearLayout.LayoutParams childLp = ((LinearLayout.LayoutParams) childAt.getLayoutParams());\n                            childLp.weight = weight;\n                            childAt.setLayoutParams(childLp);\n                        }\n                    }\n                })\n                .setType(new boolean[]{true, true, true, false, false, false})\n                .isCenterLabel(false) //是否只显示中间选中项的label文字，false则每项item全部都带有label。\n                .setDividerColor(Color.RED)\n                .build();\n    }\n\n\n    private void initTimePicker() {//Dialog 模式下，在底部弹出\n        pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {\n            @Override\n            public void onTimeSelect(Date date, View v) {\n                Toast.makeText(MainActivity.this, getTime(date), Toast.LENGTH_SHORT).show();\n                Log.i(\"pvTime\", \"onTimeSelect\");\n\n            }\n        })\n                .setTimeSelectChangeListener(new OnTimeSelectChangeListener() {\n                    @Override\n                    public void onTimeSelectChanged(Date date) {\n                        Log.i(\"pvTime\", \"onTimeSelectChanged\");\n                    }\n                })\n                .setType(new boolean[]{true, true, true, true, true, true})\n                .isDialog(true) //默认设置false ，内部实现将DecorView 作为它的父控件。\n                .addOnCancelClickListener(new View.OnClickListener() {\n                    @Override\n                    public void onClick(View view) {\n                        Log.i(\"pvTime\", \"onCancelClickListener\");\n                    }\n                })\n                .setItemVisibleCount(5) //若设置偶数，实际值会加1（比如设置6，则最大可见条目为7）\n                .setLineSpacingMultiplier(2.0f)\n                .isAlphaGradient(true)\n                .build();\n\n        Dialog mDialog = pvTime.getDialog();\n        if (mDialog != null) {\n\n            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(\n                    ViewGroup.LayoutParams.MATCH_PARENT,\n                    ViewGroup.LayoutParams.WRAP_CONTENT,\n                    Gravity.BOTTOM);\n\n            params.leftMargin = 0;\n            params.rightMargin = 0;\n            pvTime.getDialogContainerLayout().setLayoutParams(params);\n\n            Window dialogWindow = mDialog.getWindow();\n            if (dialogWindow != null) {\n                dialogWindow.setWindowAnimations(com.bigkoo.pickerview.R.style.picker_view_slide_anim);//修改动画样式\n                dialogWindow.setGravity(Gravity.BOTTOM);//改成Bottom,底部显示\n                dialogWindow.setDimAmount(0.3f);\n            }\n        }\n    }\n\n    private void initCustomTimePicker() {\n        /**\n         * @description\n         *\n         * 注意事项：\n         * 1.自定义布局中，id为 optionspicker 或者 timepicker 的布局以及其子控件必须要有，否则会报空指针.\n         * 具体可参考demo 里面的两个自定义layout布局。\n         * 2.因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11\n         * setRangDate方法控制起始终止时间(如果不设置范围，则使用默认时间1900-2100年，此段代码可注释)\n         */\n        Calendar selectedDate = Calendar.getInstance();//系统当前时间\n        Calendar startDate = Calendar.getInstance();\n        startDate.set(2014, 1, 23);\n        Calendar endDate = Calendar.getInstance();\n        endDate.set(2027, 2, 28);\n        //时间选择器 ，自定义布局\n        pvCustomTime = new TimePickerBuilder(this, new OnTimeSelectListener() {\n            @Override\n            public void onTimeSelect(Date date, View v) {//选中事件回调\n                btn_CustomTime.setText(getTime(date));\n            }\n        })\n                /*.setType(TimePickerView.Type.ALL)//default is all\n                .setCancelText(\"Cancel\")\n                .setSubmitText(\"Sure\")\n                .setContentTextSize(18)\n                .setTitleSize(20)\n                .setTitleText(\"Title\")\n                .setTitleColor(Color.BLACK)\n               /*.setDividerColor(Color.WHITE)//设置分割线的颜色\n                .setTextColorCenter(Color.LTGRAY)//设置选中项的颜色\n                .setLineSpacingMultiplier(1.6f)//设置两横线之间的间隔倍数\n                .setTitleBgColor(Color.DKGRAY)//标题背景颜色 Night mode\n                .setBgColor(Color.BLACK)//滚轮背景颜色 Night mode\n                .setSubmitColor(Color.WHITE)\n                .setCancelColor(Color.WHITE)*/\n                /*.animGravity(Gravity.RIGHT)// default is center*/\n                .setDate(selectedDate)\n                .setRangDate(startDate, endDate)\n                .setLayoutRes(R.layout.pickerview_custom_time, new CustomListener() {\n\n                    @Override\n                    public void customLayout(View v) {\n                        final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);\n                        ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);\n                        tvSubmit.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomTime.returnData();\n                                pvCustomTime.dismiss();\n                            }\n                        });\n                        ivCancel.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomTime.dismiss();\n                            }\n                        });\n                    }\n                })\n                .setContentTextSize(18)\n                .setType(new boolean[]{false, false, false, true, true, true})\n                .setLabel(\"年\", \"月\", \"日\", \"时\", \"分\", \"秒\")\n                .setLineSpacingMultiplier(1.2f)\n                .setTextXOffset(0, 0, 0, 40, 0, -40)\n                .isCenterLabel(false) //是否只显示中间选中项的label文字，false则每项item全部都带有label。\n                .setDividerColor(0xFF24AD9D)\n                .build();\n    }\n\n    private void initOptionPicker() {//条件选择器初始化\n\n        /**\n         * 注意 ：如果是三级联动的数据(省市区等)，请参照 JsonDataActivity 类里面的写法。\n         */\n\n        pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {\n            @Override\n            public void onOptionsSelect(int options1, int options2, int options3, View v) {\n                //返回的分别是三个级别的选中位置\n                String tx = options1Items.get(options1).getPickerViewText()\n                        + options2Items.get(options1).get(options2)\n                        /* + options3Items.get(options1).get(options2).get(options3).getPickerViewText()*/;\n                btn_Options.setText(tx);\n            }\n        })\n                .setTitleText(\"城市选择\")\n                .setContentTextSize(20)//设置滚轮文字大小\n                .setDividerColor(Color.LTGRAY)//设置分割线的颜色\n                .setSelectOptions(0, 1)//默认选中项\n                .setBgColor(Color.BLACK)\n                .setTitleBgColor(Color.DKGRAY)\n                .setTitleColor(Color.LTGRAY)\n                .setCancelColor(Color.YELLOW)\n                .setSubmitColor(Color.YELLOW)\n                .setTextColorCenter(Color.LTGRAY)\n                .isRestoreItem(true)//切换时是否还原，设置默认选中第一项。\n                .isCenterLabel(false) //是否只显示中间选中项的label文字，false则每项item全部都带有label。\n                .setLabels(\"省\", \"市\", \"区\")\n                .setOutSideColor(0x00000000) //设置外部遮罩颜色\n                .setOptionsSelectChangeListener(new OnOptionsSelectChangeListener() {\n                    @Override\n                    public void onOptionsSelectChanged(int options1, int options2, int options3) {\n                        String str = \"options1: \" + options1 + \"\\noptions2: \" + options2 + \"\\noptions3: \" + options3;\n                        Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();\n                    }\n                })\n                .build();\n\n//        pvOptions.setSelectOptions(1,1);\n        /*pvOptions.setPicker(options1Items);//一级选择器*/\n        pvOptions.setPicker(options1Items, options2Items);//二级选择器\n        /*pvOptions.setPicker(options1Items, options2Items,options3Items);//三级选择器*/\n    }\n\n    private void initCustomOptionPicker() {//条件选择器初始化，自定义布局\n        /**\n         * @description\n         *\n         * 注意事项：\n         * 自定义布局中，id为 optionspicker 或者 timepicker 的布局以及其子控件必须要有，否则会报空指针。\n         * 具体可参考demo 里面的两个自定义layout布局。\n         */\n        pvCustomOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {\n            @Override\n            public void onOptionsSelect(int options1, int option2, int options3, View v) {\n                //返回的分别是三个级别的选中位置\n                String tx = cardItem.get(options1).getPickerViewText();\n                btn_CustomOptions.setText(tx);\n            }\n        })\n                .setLayoutRes(R.layout.pickerview_custom_options, new CustomListener() {\n                    @Override\n                    public void customLayout(View v) {\n                        final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);\n                        final TextView tvAdd = (TextView) v.findViewById(R.id.tv_add);\n                        ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);\n                        tvSubmit.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomOptions.returnData();\n                                pvCustomOptions.dismiss();\n                            }\n                        });\n\n                        ivCancel.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvCustomOptions.dismiss();\n                            }\n                        });\n\n                        tvAdd.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                getCardData();\n                                pvCustomOptions.setPicker(cardItem);\n                            }\n                        });\n\n                    }\n                })\n                .isDialog(true)\n                .setOutSideCancelable(false)\n                .build();\n\n        pvCustomOptions.setPicker(cardItem);//添加数据\n\n\n    }\n\n    private void initNoLinkOptionsPicker() {// 不联动的多级选项\n        pvNoLinkOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {\n\n            @Override\n            public void onOptionsSelect(int options1, int options2, int options3, View v) {\n\n                String str = \"food:\" + food.get(options1)\n                        + \"\\nclothes:\" + clothes.get(options2)\n                        + \"\\ncomputer:\" + computer.get(options3);\n\n                Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();\n            }\n        })\n                .setOptionsSelectChangeListener(new OnOptionsSelectChangeListener() {\n                    @Override\n                    public void onOptionsSelectChanged(int options1, int options2, int options3) {\n                        String str = \"options1: \" + options1 + \"\\noptions2: \" + options2 + \"\\noptions3: \" + options3;\n                        Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();\n                    }\n                })\n                .setItemVisibleCount(5)\n                // .setSelectOptions(0, 1, 1)\n                .build();\n        pvNoLinkOptions.setNPicker(food, clothes, computer);\n        pvNoLinkOptions.setSelectOptions(0, 1, 1);\n\n\n    }\n\n    private String getTime(Date date) {//可根据需要自行截取数据显示\n        Log.d(\"getTime()\", \"choice date millis: \" + date.getTime());\n        SimpleDateFormat format = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n        return format.format(date);\n    }\n\n    private void getOptionData() {\n        /*\n         * 注意：如果是添加JavaBean实体数据，则实体类需要实现 IPickerViewData 接口，\n         * PickerView会通过getPickerViewText方法获取字符串显示出来。\n         */\n        getCardData();\n        getNoLinkData();\n\n        //选项1\n        options1Items.add(new ProvinceBean(0, \"广东\", \"描述部分\", \"其他数据\"));\n        options1Items.add(new ProvinceBean(1, \"湖南\", \"描述部分\", \"其他数据\"));\n        options1Items.add(new ProvinceBean(2, \"广西\", \"描述部分\", \"其他数据\"));\n\n        //选项2\n        ArrayList<String> options2Items_01 = new ArrayList<>();\n        options2Items_01.add(\"广州\");\n        options2Items_01.add(\"佛山\");\n        options2Items_01.add(\"东莞\");\n        options2Items_01.add(\"珠海\");\n        ArrayList<String> options2Items_02 = new ArrayList<>();\n        options2Items_02.add(\"长沙\");\n        options2Items_02.add(\"岳阳\");\n        options2Items_02.add(\"株洲\");\n        options2Items_02.add(\"衡阳\");\n        ArrayList<String> options2Items_03 = new ArrayList<>();\n        options2Items_03.add(\"桂林\");\n        options2Items_03.add(\"玉林\");\n        options2Items.add(options2Items_01);\n        options2Items.add(options2Items_02);\n        options2Items.add(options2Items_03);\n        /*--------数据源添加完毕---------*/\n    }\n\n    private void getCardData() {\n        for (int i = 0; i < 5; i++) {\n            cardItem.add(new CardBean(i, \"No.ABC12345 \" + i));\n        }\n\n        for (int i = 0; i < cardItem.size(); i++) {\n            if (cardItem.get(i).getCardNo().length() > 6) {\n                String str_item = cardItem.get(i).getCardNo().substring(0, 6) + \"...\";\n                cardItem.get(i).setCardNo(str_item);\n            }\n        }\n    }\n\n    private void getNoLinkData() {\n        food.add(\"KFC\");\n        food.add(\"MacDonald\");\n        food.add(\"Pizza hut\");\n\n        clothes.add(\"Nike\");\n        clothes.add(\"Adidas\");\n        clothes.add(\"Armani\");\n\n        computer.add(\"ASUS\");\n        computer.add(\"Lenovo\");\n        computer.add(\"Apple\");\n        computer.add(\"HP\");\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/bigkoo/pickerviewdemo/TestCircleWheelViewActivity.java",
    "content": "package com.bigkoo.pickerviewdemo;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AppCompatActivity;\nimport android.widget.Toast;\n\nimport com.bigkoo.pickerview.adapter.ArrayWheelAdapter;\nimport com.contrarywind.listener.OnItemSelectedListener;\nimport com.contrarywind.view.WheelView;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * desc:\n * author: Created by lixiaotong on 2019-07-30\n * e-mail: 516030811@qq.com\n */\npublic class TestCircleWheelViewActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_test_circle_wheelview);\n\n        WheelView wheelView = findViewById(R.id.wheelview);\n        wheelView.setTextSize(20);\n        wheelView.setLineSpacingMultiplier(2f);\n        // wheelView.setDividerWidth(6);\n        wheelView.setDividerType(WheelView.DividerType.CIRCLE);\n\n        final List<String> mOptionsItems = new ArrayList<>();\n        mOptionsItems.add(\"10\");\n        mOptionsItems.add(\"20\");\n        mOptionsItems.add(\"30\");\n        mOptionsItems.add(\"40\");\n        mOptionsItems.add(\"50\");\n        mOptionsItems.add(\"60\");\n        mOptionsItems.add(\"70\");\n\n        wheelView.setAdapter(new ArrayWheelAdapter(mOptionsItems));\n        wheelView.setOnItemSelectedListener(new OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(int index) {\n                Toast.makeText(TestCircleWheelViewActivity.this, \"\" + mOptionsItems.get(index), Toast.LENGTH_SHORT).show();\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bigkoo/pickerviewdemo/TestFragment.java",
    "content": "package com.bigkoo.pickerviewdemo;\n\n\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.FrameLayout;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.bigkoo.pickerview.builder.TimePickerBuilder;\nimport com.bigkoo.pickerview.listener.CustomListener;\nimport com.bigkoo.pickerview.listener.OnTimeSelectListener;\nimport com.bigkoo.pickerview.view.TimePickerView;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Calendar;\nimport java.util.Date;\n\npublic class TestFragment extends Fragment implements View.OnClickListener {\n    private View mView;\n    private Button btnShow;\n    private TimePickerView pvTime;\n    private FrameLayout mFrameLayout;\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        mView = inflater.inflate(R.layout.fragment_test, null);\n        return mView;\n    }\n\n\n    @Override\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        btnShow = (Button) mView.findViewById(R.id.btn_show);\n        btnShow.setOnClickListener(this);\n        mFrameLayout = (FrameLayout) mView.findViewById(R.id.fragmen_fragment);\n        initTimePicker();\n    }\n\n    private void initTimePicker() {\n        //控制时间范围(如果不设置范围，则使用默认时间1900-2100年，此段代码可注释)\n        //因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11\n        Calendar selectedDate = Calendar.getInstance();\n\n        Calendar startDate = Calendar.getInstance();\n        startDate.set(2013, 0, 23);\n\n        Calendar endDate = Calendar.getInstance();\n        endDate.set(2019, 11, 28);\n        //时间选择器\n        pvTime = new TimePickerBuilder(getActivity(), new OnTimeSelectListener() {\n            @Override\n            public void onTimeSelect(Date date, View v) {//选中事件回调\n                // 这里回调过来的v,就是show()方法里面所添加的 View 参数，如果show的时候没有添加参数，v则为null\n                /*btn_Time.setText(getTime(date));*/\n                Button btn = (Button) v;\n                btn.setText(getTime(date));\n            }\n        })\n                .setLayoutRes(R.layout.pickerview_custom_time, new CustomListener() {\n\n                    @Override\n                    public void customLayout(View v) {\n                        final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);\n                        ImageView ivCancel = (ImageView) v.findViewById(R.id.iv_cancel);\n                        tvSubmit.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                pvTime.returnData();\n                                /*pvTime.dismiss();*/\n                            }\n                        });\n                        ivCancel.setOnClickListener(new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                /*pvTime.dismiss();*/\n                            }\n                        });\n                    }\n                })\n                .setType(new boolean[]{true, true, true, false, false, false})\n                .setLabel(\"\", \"\", \"\", \"\", \"\", \"\") //设置空字符串以隐藏单位提示   hide label\n                .setDividerColor(Color.DKGRAY)\n                .setContentTextSize(20)\n                .setDate(selectedDate)\n                .setRangDate(startDate, selectedDate)\n                .setDecorView(mFrameLayout)//非dialog模式下,设置ViewGroup, pickerView将会添加到这个ViewGroup中\n                .setOutSideColor(0x00000000)\n                .setOutSideCancelable(false)\n                .build();\n\n        pvTime.setKeyBackCancelable(false);//系统返回键监听屏蔽掉\n    }\n\n    @Override\n    public void onClick(View v) {\n        pvTime.show(v, false);//弹出时间选择器，传递参数过去，回调的时候则可以绑定此view\n    }\n\n    private String getTime(Date date) {//可根据需要自行截取数据显示\n        SimpleDateFormat format = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n        return format.format(date);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bigkoo/pickerviewdemo/bean/CardBean.java",
    "content": "package com.bigkoo.pickerviewdemo.bean;\n\n\nimport com.contrarywind.interfaces.IPickerViewData;\n\n/**\n * Created by KyuYi on 2017/3/2.\n * E-Mail:kyu_yi@sina.com\n * 功能：\n */\n\npublic class CardBean implements IPickerViewData {\n    int id;\n    String cardNo;\n\n    public CardBean(int id, String cardNo) {\n        this.id = id;\n        this.cardNo = cardNo;\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getCardNo() {\n        return cardNo;\n    }\n\n    public void setCardNo(String cardNo) {\n        this.cardNo = cardNo;\n    }\n\n    @Override\n    public String getPickerViewText() {\n        return cardNo;\n    }\n\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/bigkoo/pickerviewdemo/bean/JsonBean.java",
    "content": "package com.bigkoo.pickerviewdemo.bean;\n\n\nimport com.contrarywind.interfaces.IPickerViewData;\n\nimport java.util.List;\n\n/**\n * TODO<json数据源>\n *\n * @author: 小嵩\n * @date: 2017/3/16 15:36\n */\n\npublic class JsonBean implements IPickerViewData {\n\n\n    /**\n     * name : 省份\n     * city : [{\"name\":\"北京市\",\"area\":[\"东城区\",\"西城区\",\"崇文区\",\"宣武区\",\"朝阳区\"]}]\n     */\n\n    private String name;\n    private List<CityBean> city;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public List<CityBean> getCityList() {\n        return city;\n    }\n\n    public void setCityList(List<CityBean> city) {\n        this.city = city;\n    }\n\n    // 实现 IPickerViewData 接口，\n    // 这个用来显示在PickerView上面的字符串，\n    // PickerView会通过IPickerViewData获取getPickerViewText方法显示出来。\n    @Override\n    public String getPickerViewText() {\n        return this.name;\n    }\n\n\n    public static class CityBean {\n        /**\n         * name : 城市\n         * area : [\"东城区\",\"西城区\",\"崇文区\",\"昌平区\"]\n         */\n\n        private String name;\n        private List<String> area;\n\n        public String getName() {\n            return name;\n        }\n\n        public void setName(String name) {\n            this.name = name;\n        }\n\n        public List<String> getArea() {\n            return area;\n        }\n\n        public void setArea(List<String> area) {\n            this.area = area;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/bigkoo/pickerviewdemo/bean/ProvinceBean.java",
    "content": "package com.bigkoo.pickerviewdemo.bean;\n\n\nimport com.contrarywind.interfaces.IPickerViewData;\n\n/**\n * Created by Sai on 15/11/22.\n */\npublic class ProvinceBean implements IPickerViewData {\n    private long id;\n    private String name;\n    private String description;\n    private String others;\n\n    public ProvinceBean(long id,String name,String description,String others){\n        this.id = id;\n        this.name = name;\n        this.description = description;\n        this.others = others;\n    }\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public String getOthers() {\n        return others;\n    }\n\n    public void setOthers(String others) {\n        this.others = others;\n    }\n\n    //这个用来显示在PickerView上面的字符串,PickerView会通过getPickerViewText方法获取字符串显示出来。\n    @Override\n    public String getPickerViewText() {\n        return name;\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/layout/activity_fragmenttest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n             android:id=\"@+id/frame_activity_main\"\n             android:layout_width=\"match_parent\"\n             android:layout_height=\"match_parent\">\n\n</FrameLayout>\n\n"
  },
  {
    "path": "app/src/main/res/layout/activity_json_data.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/activity_json_data\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:gravity=\"center\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n    <Button\n        android:id=\"@+id/btn_data\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/picker_text_parse\"/>\n\n    <Button\n        android:id=\"@+id/btn_show\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/picker_text_show\"\n        android:layout_marginTop=\"@dimen/activity_horizontal_margin\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n\n    android:orientation=\"vertical\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\">\n\n\n            <Button\n                android:id=\"@+id/btn_lunar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:layout_margin=\"10dp\"\n                android:text=\"@string/picker_custom_lunar\" />\n\n            <Button\n                android:id=\"@+id/btn_Time\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:layout_margin=\"10dp\"\n                android:text=\"@string/picker_time\" />\n\n            <Button\n                android:id=\"@+id/btn_Options\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:layout_below=\"@+id/tvTime\"\n                android:layout_margin=\"10dp\"\n                android:text=\"@string/picker_province\" />\n\n            <Button\n                android:id=\"@+id/btn_CustomTime\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:layout_below=\"@+id/tvTime\"\n                android:layout_margin=\"10dp\"\n                android:text=\"@string/picker_custom_time\" />\n\n            <Button\n                android:id=\"@+id/btn_CustomOptions\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:layout_below=\"@+id/tvTime\"\n                android:layout_margin=\"10dp\"\n                android:text=\"@string/picker_custom_province\" />\n\n            <Button\n                android:id=\"@+id/btn_no_linkage\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:layout_below=\"@+id/tvTime\"\n                android:layout_margin=\"10dp\"\n                android:text=\"@string/picker_non_linkage\" />\n\n            <Button\n                android:id=\"@+id/btn_GotoJsonData\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:layout_below=\"@+id/tvTime\"\n                android:layout_margin=\"10dp\"\n                android:text=\"@string/picker_json_parse_sample\" />\n\n            <Button\n                android:id=\"@+id/btn_fragment\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:layout_below=\"@+id/tvTime\"\n                android:layout_margin=\"10dp\"\n                android:text=\"@string/picker_custom_parent\" />\n\n            <Button\n                android:id=\"@+id/btn_circle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:layout_margin=\"10dp\"\n                android:text=\"@string/picker_use_circle_divider\" />\n        </LinearLayout>\n\n    </ScrollView>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_test_circle_wheelview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <com.contrarywind.view.WheelView xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/wheelview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerInParent=\"true\"\n        app:wheelview_dividerWidth=\"2dp\" />\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:orientation=\"vertical\"\n              android:layout_height=\"match_parent\">\n\n\n    <Button\n        android:id=\"@+id/btn_show\"\n        android:layout_margin=\"10dp\"\n        android:layout_below=\"@+id/tvTime\"\n        android:text=\"显示时间选择器\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"50dp\"/>\n\n\n    <FrameLayout\n        android:id=\"@+id/fragmen_fragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"/>\n\n\n\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/pickerview_custom_lunar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"50dp\"\n        android:background=\"#EEEEEE\">\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.5dp\"\n            android:background=\"#aaa\" />\n\n        <ImageView\n            android:id=\"@+id/iv_cancel\"\n            android:layout_width=\"35dp\"\n            android:layout_height=\"35dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"17dp\"\n            android:padding=\"8dp\"\n            android:src=\"@drawable/to_down\" />\n\n        <CheckBox\n            android:id=\"@+id/cb_lunar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerInParent=\"true\"\n            android:layout_marginRight=\"17dp\"\n            android:text=\"农历\"\n            android:textColor=\"#24AD9D\"\n            android:textSize=\"18sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_finish\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"17dp\"\n            android:padding=\"8dp\"\n            android:text=\"完成\"\n            android:textColor=\"#24AD9D\"\n            android:textSize=\"18sp\" />\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.5dp\"\n            android:background=\"#aaa\" />\n    </RelativeLayout>\n\n\n    <!--此部分需要完整复制过去，删减或者更改ID会导致初始化找不到内容而报空-->\n    <LinearLayout\n        android:id=\"@+id/timepicker\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@android:color/white\"\n        android:gravity=\"center\"\n        android:minHeight=\"150dp\"\n        android:orientation=\"horizontal\">\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/year\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n\n            android:id=\"@+id/month\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/day\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/hour\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/min\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/second\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n    </LinearLayout>\n\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/pickerview_custom_options.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"50dp\"\n        android:background=\"#EEEEEE\">\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.5dp\"\n            android:background=\"#aaa\" />\n\n        <ImageView\n            android:id=\"@+id/iv_cancel\"\n            android:layout_width=\"35dp\"\n            android:layout_height=\"35dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"17dp\"\n            android:padding=\"8dp\"\n            android:src=\"@drawable/to_down\" />\n\n        <TextView\n            android:id=\"@+id/tv_finish\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"17dp\"\n            android:padding=\"8dp\"\n            android:text=\"完成\"\n            android:textColor=\"#24AD9D\"\n            android:textSize=\"18sp\" />\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.5dp\"\n            android:background=\"#aaa\" />\n    </RelativeLayout>\n\n    <!--此部分需要完整复制过去，删减或者更改ID会导致初始化找不到内容而报空-->\n    <LinearLayout\n        android:id=\"@+id/optionspicker\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:minHeight=\"150dp\"\n        android:gravity=\"center\"\n        android:background=\"@android:color/white\"\n        android:orientation=\"horizontal\">\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/options1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/options2\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/options3\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n    </LinearLayout>\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0.5dp\"\n        android:background=\"#24ad9d\" />\n\n    <TextView\n        android:id=\"@+id/tv_add\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"50dp\"\n        android:background=\"#E5E9EC\"\n        android:gravity=\"center\"\n        android:text=\"+ 添加加油卡\"\n        android:textColor=\"#24AD9D\"\n        android:textSize=\"18sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/pickerview_custom_time.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"50dp\"\n        android:background=\"#EEEEEE\">\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.5dp\"\n            android:background=\"#aaa\" />\n\n        <ImageView\n            android:id=\"@+id/iv_cancel\"\n            android:layout_width=\"35dp\"\n            android:layout_height=\"35dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"17dp\"\n            android:padding=\"8dp\"\n            android:src=\"@drawable/to_down\" />\n\n        <TextView\n            android:id=\"@+id/tv_finish\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"17dp\"\n            android:padding=\"8dp\"\n            android:text=\"完成\"\n            android:textColor=\"#24AD9D\"\n            android:textSize=\"18sp\" />\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0.5dp\"\n            android:background=\"#aaa\" />\n    </RelativeLayout>\n\n\n    <!--此部分需要完整复制过去，删减或者更改ID会导致初始化找不到内容而报空-->\n    <LinearLayout\n        android:id=\"@+id/timepicker\"\n        android:minHeight=\"150dp\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@android:color/white\"\n        android:gravity=\"center\"\n        android:orientation=\"horizontal\">\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/year\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n\n            android:id=\"@+id/month\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/day\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/hour\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/min\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/second\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.1\" />\n    </LinearLayout>\n\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/menu/menu_main.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\" tools:context=\".MainActivity\">\n    <item android:id=\"@+id/action_settings\" android:title=\"@string/action_settings\"\n        android:orderInCategory=\"100\" app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"app_name\">PickerViewDemo</string>\n    <string name=\"hello_world\">Hello world!</string>\n    <string name=\"action_settings\">Settings</string>\n\n\n\n    <string name=\"picker_text_parse\">解析数据</string>\n    <string name=\"picker_text_show\">显示省市区选择器</string>\n\n    <string name=\"picker_custom_lunar\">公农历切换</string>\n    <string name=\"picker_time\">时间选择器</string>\n    <string name=\"picker_province\">条件选择器</string>\n\n    <string name=\"picker_custom_time\">时间选择器自定义布局</string>\n    <string name=\"picker_custom_province\">条件选择器自定义布局</string>\n    <string name=\"picker_custom_parent\">自定义父容器</string>\n    <string name=\"picker_use_circle_divider\">使用圆形分割线</string>\n\n    <string name=\"picker_non_linkage\">条件选择器(不联动)</string>\n\n    <string name=\"picker_json_parse_sample\">省市区Json文件解析示例</string>\n\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-en/strings.xml",
    "content": "<resources>\n\n    <string name=\"picker_custom_lunar\">LunarTimePicker</string>\n\n    <string name=\"picker_time\">TimePicker</string>\n    <string name=\"picker_province\">OptionsPicker</string>\n\n    <string name=\"picker_custom_time\">CustomLayoutTimePicker</string>\n    <string name=\"picker_custom_province\">CustomLayoutOptionsPicker</string>\n    <string name=\"picker_custom_parent\">CustomParentView</string>\n\n    <string name=\"picker_non_linkage\">OptionsPicker(Non-Linkage)</string>\n    <string name=\"picker_json_parse_sample\">AreaDataParseSample</string>\n\n    <string name=\"picker_text_parse\">Parse Data</string>\n    <string name=\"picker_text_show\">Show OptionsPicker</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        maven {\n            url 'https://maven.google.com/'\n            name 'Google'\n        }\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.5.1'\n//        classpath \"com.novoda:bintray-release:0.9.1\"\n        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n        maven {\n            url 'https://maven.google.com/'\n            name 'Google'\n        }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Oct 14 15:15:59 CST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.4.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "pickerview/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "pickerview/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'com.github.dcendents.android-maven'\n//apply plugin: 'com.novoda.bintray-release'//添加JCenter插件\n\n\n\nandroid {\n    compileSdkVersion 26\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 26\n        versionCode 34\n        versionName \"4.1.9\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    lintOptions {\n        abortOnError false\n    }\n}\n\n//allprojects {\n//    tasks.withType(Javadoc) {//兼容中文字符\n//        options{\n//            encoding \"UTF-8\"\n//            charSet 'UTF-8'\n//            links \"http://docs.oracle.com/javase/7/docs/api\"\n//        }\n//    }\n//}\n//publish {\n//    userOrg = 'contrarywind'//bintray.com 用户名/组织名 user/org name\n//    groupId = 'com.contrarywind'//JCenter上显示的路径 path\n//    artifactId = 'Android-PickerView'//项目名称 project name\n//    publishVersion = '4.1.9'//版本号 version code\n//    desc = 'this is a pickerview for android'//项目描述 description\n//    website = 'https://github.com/Bigkoo/Android-PickerView' //项目网址链接 link\n//}\n\ndependencies {\n//    compile fileTree(include: ['*.jar'], dir: 'libs')\n    api project(path: ':wheelview')\n//    api 'com.contrarywind:wheelview:4.1.0'\n    implementation 'com.android.support:support-annotations:28.0.0'\n}"
  },
  {
    "path": "pickerview/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/Sai/Documents/software/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java",
    "content": "package com.bigkoo.pickerview;\n\nimport android.app.Application;\nimport android.test.ApplicationTestCase;\n\n/**\n * <a href=\"http://d.android.com/tools/testing/testing_android.html\">Testing Fundamentals</a>\n */\npublic class ApplicationTest extends ApplicationTestCase<Application> {\n    public ApplicationTest() {\n        super(Application.class);\n    }\n}"
  },
  {
    "path": "pickerview/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bigkoo.pickerview\">\n\n\n</manifest>\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/adapter/ArrayWheelAdapter.java",
    "content": "package com.bigkoo.pickerview.adapter;\r\n\r\nimport com.contrarywind.adapter.WheelAdapter;\r\n\r\nimport java.util.List;\r\n\r\n/**\r\n * The simple Array wheel adapter\r\n * @param <T> the element type\r\n */\r\npublic class ArrayWheelAdapter<T> implements WheelAdapter {\r\n\t\r\n\r\n\t// items\r\n\tprivate List<T> items;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t * @param items the items\r\n\t */\r\n\tpublic ArrayWheelAdapter(List<T> items) {\r\n\t\tthis.items = items;\r\n\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic Object getItem(int index) {\r\n\t\tif (index >= 0 && index < items.size()) {\r\n\t\t\treturn items.get(index);\r\n\t\t}\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\t@Override\r\n\tpublic int getItemsCount() {\r\n\t\treturn items.size();\r\n\t}\r\n\r\n\t@Override\r\n\tpublic int indexOf(Object o){\r\n\t\treturn items.indexOf(o);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/adapter/NumericWheelAdapter.java",
    "content": "package com.bigkoo.pickerview.adapter;\r\n\r\n\r\nimport com.contrarywind.adapter.WheelAdapter;\r\n\r\n/**\r\n * Numeric Wheel adapter.\r\n */\r\npublic class NumericWheelAdapter implements WheelAdapter {\r\n\t\r\n\tprivate int minValue;\r\n\tprivate int maxValue;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t * @param minValue the wheel min value\r\n\t * @param maxValue the wheel max value\r\n\t */\r\n\tpublic NumericWheelAdapter(int minValue, int maxValue) {\r\n\t\tthis.minValue = minValue;\r\n\t\tthis.maxValue = maxValue;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic Object getItem(int index) {\r\n\t\tif (index >= 0 && index < getItemsCount()) {\r\n\t\t\tint value = minValue + index;\r\n\t\t\treturn value;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic int getItemsCount() {\r\n\t\treturn maxValue - minValue + 1;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic int indexOf(Object o){\r\n\t\ttry {\r\n\t\t\treturn (int)o - minValue;\r\n\t\t} catch (Exception e) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\r\n\t}\r\n}\r\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java",
    "content": "package com.bigkoo.pickerview.builder;\n\nimport android.content.Context;\nimport android.graphics.Typeface;\nimport android.support.annotation.ColorInt;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.bigkoo.pickerview.configure.PickerOptions;\nimport com.bigkoo.pickerview.listener.CustomListener;\nimport com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;\nimport com.bigkoo.pickerview.listener.OnOptionsSelectListener;\nimport com.bigkoo.pickerview.view.OptionsPickerView;\nimport com.contrarywind.view.WheelView;\n\n/**\n * Created by xiaosongzeem on 2018/3/20.\n */\n\npublic class OptionsPickerBuilder {\n\n    //配置类\n    private PickerOptions mPickerOptions;\n\n\n    //Required\n    public OptionsPickerBuilder(Context context, OnOptionsSelectListener listener) {\n        mPickerOptions = new PickerOptions(PickerOptions.TYPE_PICKER_OPTIONS);\n        mPickerOptions.context = context;\n        mPickerOptions.optionsSelectListener = listener;\n    }\n\n    //Option\n    public OptionsPickerBuilder setSubmitText(String textContentConfirm) {\n        mPickerOptions.textContentConfirm = textContentConfirm;\n        return this;\n    }\n\n    public OptionsPickerBuilder setCancelText(String textContentCancel) {\n        mPickerOptions.textContentCancel = textContentCancel;\n        return this;\n    }\n\n    public OptionsPickerBuilder setTitleText(String textContentTitle) {\n        mPickerOptions.textContentTitle = textContentTitle;\n        return this;\n    }\n\n    public OptionsPickerBuilder isDialog(boolean isDialog) {\n        mPickerOptions.isDialog = isDialog;\n        return this;\n    }\n\n    public OptionsPickerBuilder addOnCancelClickListener(View.OnClickListener cancelListener) {\n        mPickerOptions.cancelListener = cancelListener;\n        return this;\n    }\n\n\n    public OptionsPickerBuilder setSubmitColor(int textColorConfirm) {\n        mPickerOptions.textColorConfirm = textColorConfirm;\n        return this;\n    }\n\n    public OptionsPickerBuilder setCancelColor(int textColorCancel) {\n        mPickerOptions.textColorCancel = textColorCancel;\n        return this;\n    }\n\n\n    /**\n     * {@link #setOutSideColor} instead.\n     *\n     * @param backgroundId color resId.\n     */\n    @Deprecated\n    public OptionsPickerBuilder setBackgroundId(int backgroundId) {\n        mPickerOptions.outSideColor = backgroundId;\n        return this;\n    }\n\n    /**\n     * 显示时的外部背景色颜色,默认是灰色\n     *\n     * @param outSideColor color resId.\n     * @return\n     */\n    public OptionsPickerBuilder setOutSideColor(int outSideColor) {\n        mPickerOptions.outSideColor = outSideColor;\n        return this;\n    }\n\n    /**\n     * ViewGroup 类型\n     * 设置PickerView的显示容器\n     *\n     * @param decorView Parent View.\n     * @return\n     */\n    public OptionsPickerBuilder setDecorView(ViewGroup decorView) {\n        mPickerOptions.decorView = decorView;\n        return this;\n    }\n\n    public OptionsPickerBuilder setLayoutRes(int res, CustomListener listener) {\n        mPickerOptions.layoutRes = res;\n        mPickerOptions.customListener = listener;\n        return this;\n    }\n\n    public OptionsPickerBuilder setBgColor(int bgColorWheel) {\n        mPickerOptions.bgColorWheel = bgColorWheel;\n        return this;\n    }\n\n    public OptionsPickerBuilder setTitleBgColor(int bgColorTitle) {\n        mPickerOptions.bgColorTitle = bgColorTitle;\n        return this;\n    }\n\n    public OptionsPickerBuilder setTitleColor(int textColorTitle) {\n        mPickerOptions.textColorTitle = textColorTitle;\n        return this;\n    }\n\n    public OptionsPickerBuilder setSubCalSize(int textSizeSubmitCancel) {\n        mPickerOptions.textSizeSubmitCancel = textSizeSubmitCancel;\n        return this;\n    }\n\n    public OptionsPickerBuilder setTitleSize(int textSizeTitle) {\n        mPickerOptions.textSizeTitle = textSizeTitle;\n        return this;\n    }\n\n    public OptionsPickerBuilder setContentTextSize(int textSizeContent) {\n        mPickerOptions.textSizeContent = textSizeContent;\n        return this;\n    }\n\n    public OptionsPickerBuilder setOutSideCancelable(boolean cancelable) {\n        mPickerOptions.cancelable = cancelable;\n        return this;\n    }\n\n\n    public OptionsPickerBuilder setLabels(String label1, String label2, String label3) {\n        mPickerOptions.label1 = label1;\n        mPickerOptions.label2 = label2;\n        mPickerOptions.label3 = label3;\n        return this;\n    }\n\n    /**\n     * 设置Item 的间距倍数，用于控制 Item 高度间隔\n     *\n     * @param lineSpacingMultiplier 浮点型，1.0-4.0f 之间有效,超过则取极值。\n     */\n    public OptionsPickerBuilder setLineSpacingMultiplier(float lineSpacingMultiplier) {\n        mPickerOptions.lineSpacingMultiplier = lineSpacingMultiplier;\n        return this;\n    }\n\n    /**\n     * Set item divider line type color.\n     *\n     * @param dividerColor color resId.\n     */\n    public OptionsPickerBuilder setDividerColor(@ColorInt int dividerColor) {\n        mPickerOptions.dividerColor = dividerColor;\n        return this;\n    }\n\n    /**\n     * Set item divider line type.\n     *\n     * @param dividerType enum Type {@link WheelView.DividerType}\n     */\n    public OptionsPickerBuilder setDividerType(WheelView.DividerType dividerType) {\n        mPickerOptions.dividerType = dividerType;\n        return this;\n    }\n\n    /**\n     * Set the textColor of selected item.\n     *\n     * @param textColorCenter color res.\n     */\n    public OptionsPickerBuilder setTextColorCenter(int textColorCenter) {\n        mPickerOptions.textColorCenter = textColorCenter;\n        return this;\n    }\n\n    /**\n     * Set the textColor of outside item.\n     *\n     * @param textColorOut color resId.\n     */\n    public OptionsPickerBuilder setTextColorOut(@ColorInt int textColorOut) {\n        mPickerOptions.textColorOut = textColorOut;\n        return this;\n    }\n\n    public OptionsPickerBuilder setTypeface(Typeface font) {\n        mPickerOptions.font = font;\n        return this;\n    }\n\n    public OptionsPickerBuilder setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) {\n        mPickerOptions.cyclic1 = cyclic1;\n        mPickerOptions.cyclic2 = cyclic2;\n        mPickerOptions.cyclic3 = cyclic3;\n        return this;\n    }\n\n    public OptionsPickerBuilder setSelectOptions(int option1) {\n        mPickerOptions.option1 = option1;\n        return this;\n    }\n\n    public OptionsPickerBuilder setSelectOptions(int option1, int option2) {\n        mPickerOptions.option1 = option1;\n        mPickerOptions.option2 = option2;\n        return this;\n    }\n\n    public OptionsPickerBuilder setSelectOptions(int option1, int option2, int option3) {\n        mPickerOptions.option1 = option1;\n        mPickerOptions.option2 = option2;\n        mPickerOptions.option3 = option3;\n        return this;\n    }\n\n    public OptionsPickerBuilder setTextXOffset(int xoffset_one, int xoffset_two, int xoffset_three) {\n        mPickerOptions.x_offset_one = xoffset_one;\n        mPickerOptions.x_offset_two = xoffset_two;\n        mPickerOptions.x_offset_three = xoffset_three;\n        return this;\n    }\n\n    public OptionsPickerBuilder isCenterLabel(boolean isCenterLabel) {\n        mPickerOptions.isCenterLabel = isCenterLabel;\n        return this;\n    }\n\n\n    /**\n     * 设置最大可见数目\n     *\n     * @param count 建议设置为 3 ~ 9之间。\n     */\n    public OptionsPickerBuilder setItemVisibleCount(int count) {\n        mPickerOptions.itemsVisibleCount = count;\n        return this;\n    }\n\n    /**\n     * 透明度是否渐变\n     *\n     * @param isAlphaGradient true of false\n     */\n    public OptionsPickerBuilder isAlphaGradient(boolean isAlphaGradient) {\n        mPickerOptions.isAlphaGradient = isAlphaGradient;\n        return this;\n    }\n\n    /**\n     * 切换选项时，是否还原第一项\n     *\n     * @param isRestoreItem true：还原； false: 保持上一个选项\n     * @return TimePickerBuilder\n     */\n    public OptionsPickerBuilder isRestoreItem(boolean isRestoreItem) {\n        mPickerOptions.isRestoreItem = isRestoreItem;\n        return this;\n    }\n\n    /**\n     * @param listener 切换item项滚动停止时，实时回调监听。\n     * @return\n     */\n    public OptionsPickerBuilder setOptionsSelectChangeListener(OnOptionsSelectChangeListener listener) {\n        mPickerOptions.optionsSelectChangeListener = listener;\n        return this;\n    }\n\n\n    public <T> OptionsPickerView<T> build() {\n        return new OptionsPickerView<>(mPickerOptions);\n    }\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java",
    "content": "package com.bigkoo.pickerview.builder;\n\nimport android.content.Context;\nimport android.support.annotation.ColorInt;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.bigkoo.pickerview.configure.PickerOptions;\nimport com.bigkoo.pickerview.listener.CustomListener;\nimport com.bigkoo.pickerview.listener.OnTimeSelectChangeListener;\nimport com.bigkoo.pickerview.listener.OnTimeSelectListener;\nimport com.bigkoo.pickerview.view.TimePickerView;\nimport com.contrarywind.view.WheelView;\n\nimport java.util.Calendar;\n\n/**\n * Created by xiaosongzeem on 2018/3/20.\n */\n\npublic class TimePickerBuilder {\n\n    private PickerOptions mPickerOptions;\n\n    //Required\n    public TimePickerBuilder(Context context, OnTimeSelectListener listener) {\n        mPickerOptions = new PickerOptions(PickerOptions.TYPE_PICKER_TIME);\n        mPickerOptions.context = context;\n        mPickerOptions.timeSelectListener = listener;\n    }\n\n    //Option\n    public TimePickerBuilder setGravity(int gravity) {\n        mPickerOptions.textGravity = gravity;\n        return this;\n    }\n\n    public TimePickerBuilder addOnCancelClickListener(View.OnClickListener cancelListener) {\n        mPickerOptions.cancelListener = cancelListener;\n        return this;\n    }\n\n    /**\n     * new boolean[]{true, true, true, false, false, false}\n     * control the \"year\",\"month\",\"day\",\"hours\",\"minutes\",\"seconds \" display or hide.\n     * 分别控制“年”“月”“日”“时”“分”“秒”的显示或隐藏。\n     *\n     * @param type 布尔型数组，长度需要设置为6。\n     * @return TimePickerBuilder\n     */\n    public TimePickerBuilder setType(boolean[] type) {\n        mPickerOptions.type = type;\n        return this;\n    }\n\n    public TimePickerBuilder setSubmitText(String textContentConfirm) {\n        mPickerOptions.textContentConfirm = textContentConfirm;\n        return this;\n    }\n\n    public TimePickerBuilder isDialog(boolean isDialog) {\n        mPickerOptions.isDialog = isDialog;\n        return this;\n    }\n\n    public TimePickerBuilder setCancelText(String textContentCancel) {\n        mPickerOptions.textContentCancel = textContentCancel;\n        return this;\n    }\n\n    public TimePickerBuilder setTitleText(String textContentTitle) {\n        mPickerOptions.textContentTitle = textContentTitle;\n        return this;\n    }\n\n    public TimePickerBuilder setSubmitColor(int textColorConfirm) {\n        mPickerOptions.textColorConfirm = textColorConfirm;\n        return this;\n    }\n\n    public TimePickerBuilder setCancelColor(int textColorCancel) {\n        mPickerOptions.textColorCancel = textColorCancel;\n        return this;\n    }\n\n    /**\n     * ViewGroup 类型的容器\n     *\n     * @param decorView 选择器会被添加到此容器中\n     * @return TimePickerBuilder\n     */\n    public TimePickerBuilder setDecorView(ViewGroup decorView) {\n        mPickerOptions.decorView = decorView;\n        return this;\n    }\n\n    public TimePickerBuilder setBgColor(int bgColorWheel) {\n        mPickerOptions.bgColorWheel = bgColorWheel;\n        return this;\n    }\n\n    public TimePickerBuilder setTitleBgColor(int bgColorTitle) {\n        mPickerOptions.bgColorTitle = bgColorTitle;\n        return this;\n    }\n\n    public TimePickerBuilder setTitleColor(int textColorTitle) {\n        mPickerOptions.textColorTitle = textColorTitle;\n        return this;\n    }\n\n    public TimePickerBuilder setSubCalSize(int textSizeSubmitCancel) {\n        mPickerOptions.textSizeSubmitCancel = textSizeSubmitCancel;\n        return this;\n    }\n\n    public TimePickerBuilder setTitleSize(int textSizeTitle) {\n        mPickerOptions.textSizeTitle = textSizeTitle;\n        return this;\n    }\n\n    public TimePickerBuilder setContentTextSize(int textSizeContent) {\n        mPickerOptions.textSizeContent = textSizeContent;\n        return this;\n    }\n\n    /**\n     * 设置最大可见数目\n     *\n     * @param count suggest value: 3, 5, 7, 9\n     */\n    public TimePickerBuilder setItemVisibleCount(int count) {\n        mPickerOptions.itemsVisibleCount = count;\n        return this;\n    }\n\n    /**\n     * 透明度是否渐变\n     *\n     * @param isAlphaGradient true of false\n     */\n    public TimePickerBuilder isAlphaGradient(boolean isAlphaGradient) {\n        mPickerOptions.isAlphaGradient = isAlphaGradient;\n        return this;\n    }\n\n    /**\n     * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11\n     *\n     * @param date\n     * @return TimePickerBuilder\n     */\n    public TimePickerBuilder setDate(Calendar date) {\n        mPickerOptions.date = date;\n        return this;\n    }\n\n    public TimePickerBuilder setLayoutRes(int res, CustomListener customListener) {\n        mPickerOptions.layoutRes = res;\n        mPickerOptions.customListener = customListener;\n        return this;\n    }\n\n\n    /**\n     * 设置起始时间\n     * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11\n     */\n\n    public TimePickerBuilder setRangDate(Calendar startDate, Calendar endDate) {\n        mPickerOptions.startDate = startDate;\n        mPickerOptions.endDate = endDate;\n        return this;\n    }\n\n\n    /**\n     * 设置间距倍数,但是只能在1.0-4.0f之间\n     *\n     * @param lineSpacingMultiplier\n     */\n    public TimePickerBuilder setLineSpacingMultiplier(float lineSpacingMultiplier) {\n        mPickerOptions.lineSpacingMultiplier = lineSpacingMultiplier;\n        return this;\n    }\n\n    /**\n     * 设置分割线的颜色\n     *\n     * @param dividerColor\n     */\n\n    public TimePickerBuilder setDividerColor(@ColorInt int dividerColor) {\n        mPickerOptions.dividerColor = dividerColor;\n        return this;\n    }\n\n    /**\n     * 设置分割线的类型\n     *\n     * @param dividerType\n     */\n    public TimePickerBuilder setDividerType(WheelView.DividerType dividerType) {\n        mPickerOptions.dividerType = dividerType;\n        return this;\n    }\n\n    /**\n     * {@link #setOutSideColor} instead.\n     *\n     * @param backgroundId color resId.\n     */\n    @Deprecated\n    public TimePickerBuilder setBackgroundId(int backgroundId) {\n        mPickerOptions.outSideColor = backgroundId;\n        return this;\n    }\n\n    /**\n     * 显示时的外部背景色颜色,默认是灰色\n     *\n     * @param outSideColor\n     */\n    public TimePickerBuilder setOutSideColor(@ColorInt int outSideColor) {\n        mPickerOptions.outSideColor = outSideColor;\n        return this;\n    }\n\n    /**\n     * 设置分割线之间的文字的颜色\n     *\n     * @param textColorCenter\n     */\n    public TimePickerBuilder setTextColorCenter(@ColorInt int textColorCenter) {\n        mPickerOptions.textColorCenter = textColorCenter;\n        return this;\n    }\n\n    /**\n     * 设置分割线以外文字的颜色\n     *\n     * @param textColorOut\n     */\n    public TimePickerBuilder setTextColorOut(@ColorInt int textColorOut) {\n        mPickerOptions.textColorOut = textColorOut;\n        return this;\n    }\n\n    public TimePickerBuilder isCyclic(boolean cyclic) {\n        mPickerOptions.cyclic = cyclic;\n        return this;\n    }\n\n    public TimePickerBuilder setOutSideCancelable(boolean cancelable) {\n        mPickerOptions.cancelable = cancelable;\n        return this;\n    }\n\n    public TimePickerBuilder setLunarCalendar(boolean lunarCalendar) {\n        mPickerOptions.isLunarCalendar = lunarCalendar;\n        return this;\n    }\n\n\n    public TimePickerBuilder setLabel(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) {\n        mPickerOptions.label_year = label_year;\n        mPickerOptions.label_month = label_month;\n        mPickerOptions.label_day = label_day;\n        mPickerOptions.label_hours = label_hours;\n        mPickerOptions.label_minutes = label_mins;\n        mPickerOptions.label_seconds = label_seconds;\n        return this;\n    }\n\n    /**\n     * 设置X轴倾斜角度[ -90 , 90°]\n     *\n     * @param x_offset_year    年\n     * @param x_offset_month   月\n     * @param x_offset_day     日\n     * @param x_offset_hours   时\n     * @param x_offset_minutes 分\n     * @param x_offset_seconds 秒\n     * @return\n     */\n    public TimePickerBuilder setTextXOffset(int x_offset_year, int x_offset_month, int x_offset_day,\n                                            int x_offset_hours, int x_offset_minutes, int x_offset_seconds) {\n        mPickerOptions.x_offset_year = x_offset_year;\n        mPickerOptions.x_offset_month = x_offset_month;\n        mPickerOptions.x_offset_day = x_offset_day;\n        mPickerOptions.x_offset_hours = x_offset_hours;\n        mPickerOptions.x_offset_minutes = x_offset_minutes;\n        mPickerOptions.x_offset_seconds = x_offset_seconds;\n        return this;\n    }\n\n    public TimePickerBuilder isCenterLabel(boolean isCenterLabel) {\n        mPickerOptions.isCenterLabel = isCenterLabel;\n        return this;\n    }\n\n    /**\n     * @param listener 切换item项滚动停止时，实时回调监听。\n     * @return\n     */\n    public TimePickerBuilder setTimeSelectChangeListener(OnTimeSelectChangeListener listener) {\n        mPickerOptions.timeSelectChangeListener = listener;\n        return this;\n    }\n\n    public TimePickerView build() {\n        return new TimePickerView(mPickerOptions);\n    }\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java",
    "content": "package com.bigkoo.pickerview.configure;\n\nimport android.content.Context;\nimport android.graphics.Typeface;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.bigkoo.pickerview.R;\nimport com.bigkoo.pickerview.listener.CustomListener;\nimport com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;\nimport com.bigkoo.pickerview.listener.OnOptionsSelectListener;\nimport com.bigkoo.pickerview.listener.OnTimeSelectChangeListener;\nimport com.bigkoo.pickerview.listener.OnTimeSelectListener;\nimport com.contrarywind.view.WheelView;\n\nimport java.util.Calendar;\n\n/**\n * Build Options\n * Created by xiaosongzeem on 2018/3/8.\n */\n\npublic class PickerOptions {\n\n    //constant\n    private static final int PICKER_VIEW_BTN_COLOR_NORMAL = 0xFF057dff;\n    private static final int PICKER_VIEW_BG_COLOR_TITLE = 0xFFf5f5f5;\n    private static final int PICKER_VIEW_COLOR_TITLE = 0xFF000000;\n    private static final int PICKER_VIEW_BG_COLOR_DEFAULT = 0xFFFFFFFF;\n\n    public static final int TYPE_PICKER_OPTIONS = 1;\n    public static final int TYPE_PICKER_TIME = 2;\n\n    public OnOptionsSelectListener optionsSelectListener;\n    public OnTimeSelectListener timeSelectListener;\n    public View.OnClickListener cancelListener;\n\n    public OnTimeSelectChangeListener timeSelectChangeListener;\n    public OnOptionsSelectChangeListener optionsSelectChangeListener;\n    public CustomListener customListener;\n\n    //options picker\n    public String label1, label2, label3;//单位字符\n    public int option1, option2, option3;//默认选中项\n    public int x_offset_one, x_offset_two, x_offset_three;//x轴偏移量\n\n    public boolean cyclic1 = false;//是否循环，默认否\n    public boolean cyclic2 = false;\n    public boolean cyclic3 = false;\n\n    public boolean isRestoreItem = false; //切换时，还原第一项\n\n\n    //time picker\n    public boolean[] type = new boolean[]{true, true, true, false, false, false};//显示类型，默认显示： 年月日\n\n    public Calendar date;//当前选中时间\n    public Calendar startDate;//开始时间\n    public Calendar endDate;//终止时间\n    public int startYear;//开始年份\n    public int endYear;//结尾年份\n\n    public boolean cyclic = false;//是否循环\n    public boolean isLunarCalendar = false;//是否显示农历\n\n    public String label_year, label_month, label_day, label_hours, label_minutes, label_seconds;//单位\n    public int x_offset_year, x_offset_month, x_offset_day, x_offset_hours, x_offset_minutes, x_offset_seconds;//单位\n\n\n    public PickerOptions(int buildType) {\n        if (buildType == TYPE_PICKER_OPTIONS) {\n            layoutRes = R.layout.pickerview_options;\n        } else {\n            layoutRes = R.layout.pickerview_time;\n        }\n    }\n\n    //******* general field ******//\n    public int layoutRes;\n    public ViewGroup decorView;\n    public int textGravity = Gravity.CENTER;\n    public Context context;\n\n    public String textContentConfirm;//确定按钮文字\n    public String textContentCancel;//取消按钮文字\n    public String textContentTitle;//标题文字\n\n    public int textColorConfirm = PICKER_VIEW_BTN_COLOR_NORMAL;//确定按钮颜色\n    public int textColorCancel = PICKER_VIEW_BTN_COLOR_NORMAL;//取消按钮颜色\n    public int textColorTitle = PICKER_VIEW_COLOR_TITLE;//标题颜色\n\n    public int bgColorWheel = PICKER_VIEW_BG_COLOR_DEFAULT;//滚轮背景颜色\n    public int bgColorTitle = PICKER_VIEW_BG_COLOR_TITLE;//标题背景颜色\n\n    public int textSizeSubmitCancel = 17;//确定取消按钮大小\n    public int textSizeTitle = 18;//标题文字大小\n    public int textSizeContent = 18;//内容文字大小\n\n    public int textColorOut = 0xFFa8a8a8; //分割线以外的文字颜色\n    public int textColorCenter = 0xFF2a2a2a; //分割线之间的文字颜色\n    public int dividerColor = 0xFFd5d5d5; //分割线的颜色\n    public int outSideColor = -1; //显示时的外部背景色颜色,默认是灰色\n\n    public float lineSpacingMultiplier = 1.6f; // 条目间距倍数 默认1.6\n    public boolean isDialog;//是否是对话框模式\n\n    public boolean cancelable = true;//是否能取消\n    public boolean isCenterLabel = false;//是否只显示中间的label,默认每个item都显示\n    public Typeface font = Typeface.MONOSPACE;//字体样式\n    public WheelView.DividerType dividerType = WheelView.DividerType.FILL;//分隔线类型\n    public int itemsVisibleCount = 9; //最大可见条目数\n    public boolean isAlphaGradient = false; //透明度渐变\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener.java",
    "content": "package com.bigkoo.pickerview.listener;\n\nimport android.view.View;\n\n/**\n * Created by KyuYi on 2017/3/2.\n * E-Mail:kyu_yi@sina.com\n * 功能：\n */\n\npublic interface CustomListener {\n    void customLayout(View v);\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/listener/ISelectTimeCallback.java",
    "content": "package com.bigkoo.pickerview.listener;\n\n/**\n * Created by zengsong on 2018/3/21.\n */\n\npublic interface ISelectTimeCallback {\n\n    public void onTimeSelectChanged();\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/listener/OnDismissListener.java",
    "content": "package com.bigkoo.pickerview.listener;\n\n/**\n * Created by Sai on 15/8/9.\n */\npublic interface OnDismissListener {\n    public void onDismiss(Object o);\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectChangeListener.java",
    "content": "package com.bigkoo.pickerview.listener;\n\n/**\n * Created by xiaosong on 2018/3/20.\n */\n\npublic interface OnOptionsSelectChangeListener {\n\n    void onOptionsSelectChanged(int options1, int options2, int options3);\n\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectListener.java",
    "content": "package com.bigkoo.pickerview.listener;\n\nimport android.view.View;\n\n/**\n * Created by xiaosong on 2018/3/20.\n */\n\npublic interface OnOptionsSelectListener {\n\n    void onOptionsSelect(int options1, int options2, int options3, View v);\n\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectChangeListener.java",
    "content": "package com.bigkoo.pickerview.listener;\n\nimport java.util.Date;\n\n/**\n * Created by xiaosong on 2018/3/20.\n */\n\npublic interface OnTimeSelectChangeListener {\n\n    void onTimeSelectChanged(Date date);\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectListener.java",
    "content": "package com.bigkoo.pickerview.listener;\n\nimport android.view.View;\n\nimport java.util.Date;\n\n/**\n * Created by xiaosong on 2018/3/20.\n */\n\npublic interface OnTimeSelectListener {\n\n    void onTimeSelect(Date date, View v);\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/utils/ChinaDate.java",
    "content": "package com.bigkoo.pickerview.utils;\r\n\r\nimport java.text.SimpleDateFormat;\r\nimport java.util.ArrayList;\r\nimport java.util.Calendar;\r\nimport java.util.Date;\r\nimport java.util.GregorianCalendar;\r\nimport java.util.Locale;\r\n\r\npublic class ChinaDate {\r\n\r\n    /**\r\n     * <lunarInfo 数组值的计算原理>\r\n     *\r\n     * 0x代表十六进制，后面的五位数是十六进制数。\r\n     * 举个例子: 1980年的数据是 0x095b0\r\n     * 二进制:  0000 1001 0101 1011 0000\r\n     * 1-4:   表示当年是否为闰年，是的话为1，否则为0。\r\n     * 5-16: 为除了闰月外的正常月份是大月还是小月，1为30天，0为29天。\r\n     * 注意:  从1月到12月对应的是第16位到第5位。\r\n     * 17-20: 非闰年为0，大于0表示闰月月份，仅当存在闰月的情况下有意义。\r\n     */\r\n    final private static long[] lunarInfo = new long[]{\r\n            0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,//1900-1909\r\n            0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,//1910-1919\r\n            0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,//1920-1929\r\n            0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,//1930-1939\r\n            0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,//1940-1949\r\n            0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,//1950-1959\r\n            0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,//1960-1969\r\n            0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6,//1970-1979\r\n            0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,//1980-1989\r\n            0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,//1990-1999\r\n            0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,//2000-2009\r\n            0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,//2010-2019\r\n            0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,//2020-2029\r\n            0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,//2030-2039\r\n            0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0,//2040-2049\r\n            0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0,//2050-2059\r\n            0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4,//2060-2069\r\n            0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0,//2070-2079\r\n            0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160,//2080-2089\r\n            0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,//2090-2099\r\n            0x0d520};//2100\r\n\r\n    private final static String[] nStr1 = new String[]{\"\", \"正\", \"二\", \"三\", \"四\",\r\n            \"五\", \"六\", \"七\", \"八\", \"九\", \"十\", \"冬\", \"腊\"};\r\n    private final static String[] Gan = new String[]{\"甲\", \"乙\", \"丙\", \"丁\", \"戊\",\r\n            \"己\", \"庚\", \"辛\", \"壬\", \"癸\"};\r\n    private final static String[] Zhi = new String[]{\"子\", \"丑\", \"寅\", \"卯\", \"辰\",\r\n            \"巳\", \"午\", \"未\", \"申\", \"酉\", \"戌\", \"亥\"};\r\n    private final static String[] Animals = new String[]{\"鼠\", \"牛\", \"虎\", \"兔\",\r\n            \"龙\", \"蛇\", \"马\", \"羊\", \"猴\", \"鸡\", \"狗\", \"猪\"};\r\n\r\n    /**\r\n     * 传回农历\r\n     *\r\n     * @param y 年的总天数\r\n     * @return 农历\r\n     */\r\n    final private static int lYearDays(int y) {\r\n        int i, sum = 348;\r\n        for (i = 0x8000; i > 0x8; i >>= 1) {\r\n            if ((lunarInfo[y - 1900] & i) != 0)\r\n                sum += 1;\r\n        }\r\n        return (sum + leapDays(y));\r\n    }\r\n\r\n    /**\r\n     * 传回农历\r\n     *\r\n     * @param y 年闰月的天数\r\n     * @return 农历\r\n     */\r\n    final public static int leapDays(int y) {\r\n        if (leapMonth(y) != 0) {\r\n            if ((lunarInfo[y - 1900] & 0x10000) != 0)\r\n                return 30;\r\n            else\r\n                return 29;\r\n        } else\r\n            return 0;\r\n    }\r\n\r\n    /**\r\n     * 传回农历\r\n     *\r\n     * @param y 年闰哪个月 1-12 , 没闰传回 0\r\n     * @return 农历\r\n     */\r\n    final public static int leapMonth(int y) {\r\n        return (int) (lunarInfo[y - 1900] & 0xf);\r\n    }\r\n\r\n    /**\r\n     * 传回农历 y\r\n     *\r\n     * @param y y年m月的总天数\r\n     * @param m y年m月的总天数\r\n     * @return 农历\r\n     */\r\n    final public static int monthDays(int y, int m) {\r\n        if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)\r\n            return 29;\r\n        else\r\n            return 30;\r\n    }\r\n\r\n    /**\r\n     * 传回农历\r\n     *\r\n     * @param y 年的生肖\r\n     * @return\r\n     */\r\n    final public static String AnimalsYear(int y) {\r\n        return Animals[(y - 4) % 12];\r\n    }\r\n\r\n    /**\r\n     * 传入\r\n     *\r\n     * @param num 月日的offset 传回干支,0是甲子\r\n     * @return 干支\r\n     */\r\n    final private static String cyclicalm(int num) {\r\n        return (Gan[num % 10] + Zhi[num % 12]);\r\n    }\r\n\r\n    /**\r\n     * 传入 offset 传回干支\r\n     *\r\n     * @param y 0是甲子\r\n     * @return 干支\r\n     */\r\n    final public static String cyclical(int y) {\r\n        int num = y - 1900 + 36;\r\n        return (cyclicalm(num));\r\n    }\r\n\r\n\r\n    /**\r\n     * 传出y年m月d日对应的农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6\r\n     *\r\n     * @param y 年\r\n     * @param m 月\r\n     * @param d 日\r\n     * @return y年m月d日对应的农历\r\n     */\r\n    final public static long[] calElement(int y, int m, int d) {\r\n        long[] nongDate = new long[7];\r\n        int i = 0, temp = 0, leap = 0;\r\n        Date baseDate = new GregorianCalendar(0 + 1900, 0, 31).getTime();\r\n        Date objDate = new GregorianCalendar(y, m - 1, d).getTime();\r\n        long offset = (objDate.getTime() - baseDate.getTime()) / 86400000L;\r\n        nongDate[5] = offset + 40;\r\n        nongDate[4] = 14;\r\n        for (i = 1900; i < 2100 && offset > 0; i++) {\r\n            temp = lYearDays(i);\r\n            offset -= temp;\r\n            nongDate[4] += 12;\r\n        }\r\n        if (offset < 0) {\r\n            offset += temp;\r\n            i--;\r\n            nongDate[4] -= 12;\r\n        }\r\n        nongDate[0] = i;\r\n        nongDate[3] = i - 1864;\r\n        leap = leapMonth(i); // 闰哪个月\r\n        nongDate[6] = 0;\r\n        for (i = 1; i < 13 && offset > 0; i++) {\r\n            // 闰月\r\n            if (leap > 0 && i == (leap + 1) && nongDate[6] == 0) {\r\n                --i;\r\n                nongDate[6] = 1;\r\n                temp = leapDays((int) nongDate[0]);\r\n            } else {\r\n                temp = monthDays((int) nongDate[0], i);\r\n            }\r\n            // 解除闰月\r\n            if (nongDate[6] == 1 && i == (leap + 1))\r\n                nongDate[6] = 0;\r\n            offset -= temp;\r\n            if (nongDate[6] == 0)\r\n                nongDate[4]++;\r\n        }\r\n        if (offset == 0 && leap > 0 && i == leap + 1) {\r\n            if (nongDate[6] == 1) {\r\n                nongDate[6] = 0;\r\n            } else {\r\n                nongDate[6] = 1;\r\n                --i;\r\n                --nongDate[4];\r\n            }\r\n        }\r\n        if (offset < 0) {\r\n            offset += temp;\r\n            --i;\r\n            --nongDate[4];\r\n        }\r\n        nongDate[1] = i;\r\n        nongDate[2] = offset + 1;\r\n        return nongDate;\r\n    }\r\n\r\n    public final static String getChinaDate(int day) {\r\n        String a = \"\";\r\n        if (day == 10)\r\n            return \"初十\";\r\n        if (day == 20)\r\n            return \"二十\";\r\n        if (day == 30)\r\n            return \"三十\";\r\n        int two = (int) ((day) / 10);\r\n        if (two == 0)\r\n            a = \"初\";\r\n        if (two == 1)\r\n            a = \"十\";\r\n        if (two == 2)\r\n            a = \"廿\";\r\n        if (two == 3)\r\n            a = \"三\";\r\n        int one = (int) (day % 10);\r\n        switch (one) {\r\n            case 1:\r\n                a += \"一\";\r\n                break;\r\n            case 2:\r\n                a += \"二\";\r\n                break;\r\n            case 3:\r\n                a += \"三\";\r\n                break;\r\n            case 4:\r\n                a += \"四\";\r\n                break;\r\n            case 5:\r\n                a += \"五\";\r\n                break;\r\n            case 6:\r\n                a += \"六\";\r\n                break;\r\n            case 7:\r\n                a += \"七\";\r\n                break;\r\n            case 8:\r\n                a += \"八\";\r\n                break;\r\n            case 9:\r\n                a += \"九\";\r\n                break;\r\n        }\r\n        return a;\r\n    }\r\n\r\n    public static String getCurrentLunarDate() {\r\n        Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);\r\n        int year = today.get(Calendar.YEAR);\r\n        int month = today.get(Calendar.MONTH) + 1;\r\n        int date = today.get(Calendar.DATE);\r\n        long[] l = calElement(year, month, date);\r\n        StringBuffer sToday = new StringBuffer();\r\n        try {\r\n            sToday.append(sdf.format(today.getTime()));\r\n            sToday.append(\" 农历\");\r\n            sToday.append(cyclical(year));\r\n            sToday.append('(');\r\n            sToday.append(AnimalsYear(year));\r\n            sToday.append(\")年\");\r\n            sToday.append(nStr1[(int) l[1]]);\r\n            sToday.append(\"月\");\r\n            sToday.append(getChinaDate((int) (l[2])));\r\n            return sToday.toString();\r\n        } finally {\r\n            sToday = null;\r\n        }\r\n    }\r\n\r\n    public static String oneDay(int year, int month, int day) {\r\n        //   Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);\r\n        long[] l = calElement(year, month, day);\r\n        StringBuffer sToday = new StringBuffer();\r\n        try {\r\n            //   sToday.append(sdf.format(today.getTime()));\r\n            sToday.append(\" 农历\");\r\n            sToday.append(cyclical(year));\r\n            sToday.append('(');\r\n            sToday.append(AnimalsYear(year));\r\n            sToday.append(\")年\");\r\n            sToday.append(nStr1[(int) l[1]]);\r\n            sToday.append(\"月\");\r\n            sToday.append(getChinaDate((int) (l[2])));\r\n            return sToday.toString();\r\n        } finally {\r\n            sToday = null;\r\n        }\r\n    }\r\n\r\n    private static SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy年M月d日 EEEEE\");\r\n\r\n\r\n    /**\r\n     * @param lunarYear 农历年份\r\n     * @return String of Ganzhi: 甲子年\r\n     * 甲乙丙丁戊己庚辛壬癸\r\n     * 子丑寅卯辰巳无为申酉戌亥\r\n     */\r\n    public static String getLunarYearText(int lunarYear) {\r\n        return Gan[(lunarYear - 4) % 10] + Zhi[(lunarYear - 4) % 12] + \"年\";\r\n    }\r\n\r\n\r\n    public static ArrayList<String> getYears(int startYear, int endYear) {\r\n        ArrayList<String> years = new ArrayList<>();\r\n        for (int i = startYear; i < endYear; i++) {\r\n            years.add(String.format(\"%s(%d)\", getLunarYearText(i), i));\r\n        }\r\n        return years;\r\n    }\r\n\r\n    /**\r\n     * 获取year年的所有月份\r\n     *\r\n     * @param year 年\r\n     * @return 月份列表\r\n     */\r\n    public static ArrayList<String> getMonths(int year) {\r\n        ArrayList<String> baseMonths = new ArrayList<>();\r\n        for (int i = 1; i < nStr1.length; i++) {\r\n            baseMonths.add(nStr1[i] + \"月\");\r\n        }\r\n        if (leapMonth(year) != 0) {\r\n            baseMonths.add(leapMonth(year), \"闰\" + nStr1[leapMonth(year)] + \"月\");\r\n        }\r\n        return baseMonths;\r\n    }\r\n\r\n    /**\r\n     * 获取每月农历显示名称\r\n     *\r\n     * @param maxDay 天\r\n     * @return 名称列表\r\n     */\r\n    public static ArrayList<String> getLunarDays(int maxDay) {\r\n        ArrayList<String> days = new ArrayList<>();\r\n        for (int i = 1; i <= maxDay; i++) {\r\n            days.add(getChinaDate(i));\r\n        }\r\n        return days;\r\n    }\r\n}\r\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/utils/LunarCalendar.java",
    "content": "package com.bigkoo.pickerview.utils;\r\n\r\nimport android.util.Log;\r\n\r\nimport java.util.Date;\r\nimport java.util.GregorianCalendar;\r\n\r\n/**\r\n * author: Jerry on 2016/7/11 11:29.\r\n * description:工具类，实现公农历互转\r\n */\r\npublic class LunarCalendar {\r\n\r\n    /**\r\n     * 支持转换的最小农历年份\r\n     */\r\n    public static final int MIN_YEAR = 1900;\r\n    /**\r\n     * 支持转换的最大农历年份\r\n     */\r\n    public static final int MAX_YEAR = 2099;\r\n\r\n    /**\r\n     * 公历每月前的天数\r\n     */\r\n    private static final int DAYS_BEFORE_MONTH[] = {0, 31, 59, 90, 120, 151, 181,\r\n            212, 243, 273, 304, 334, 365};\r\n\r\n    /**\r\n     * 用来表示1900年到2099年间农历年份的相关信息，共24位bit的16进制表示，其中：\r\n     * 1. 前4位表示该年闰哪个月；\r\n     * 2. 5-17位表示农历年份13个月的大小月分布，0表示小，1表示大；\r\n     * 3. 最后7位表示农历年首（正月初一）对应的公历日期。\r\n     * <p>\r\n     * 以2014年的数据0x955ABF为例说明：\r\n     * 1001 0101 0101 1010 1011 1111\r\n     * 闰九月  农历正月初一对应公历1月31号\r\n     */\r\n    private static final int LUNAR_INFO[] = {\r\n            0x84B6BF,/*1900*/\r\n            0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A,/*1901-1910*/\r\n            0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754,/*1911-1920*/\r\n            0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E,/*1921-1930*/\r\n            0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48,/*1931-1940*/\r\n            0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51,/*1941-1950*/\r\n            0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x6AD53C,/*1951-1960*/\r\n            0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46,/*1961-1970*/\r\n            0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50,/*1971-1980*/\r\n            0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x095746, 0x5497BB,/*1981-1990*/\r\n            0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645,/*1991-2000*/\r\n            0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E,/*2001-2010*/\r\n            0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9,/*2011-2020*/\r\n            0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x6a573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43,/*2021-2030*/\r\n            0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C,/*2031-2040*/\r\n            0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37,/*2041-2050*/\r\n            0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06AA44, 0x4AB638, 0x0AAE4C, 0x092E42,/*2051-2060*/\r\n            0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B,/*2061-2070*/\r\n            0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6,/*2071-2080*/\r\n            0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E,/*2081-2090*/\r\n            0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5          /*2091-2099*/\r\n    };\r\n    private static int[] solar_1_1 = {1887, 0xec04c, 0xec23f, 0xec435, 0xec649,\r\n            0xec83e, 0xeca51, 0xecc46, 0xece3a, 0xed04d, 0xed242, 0xed436,\r\n            0xed64a, 0xed83f, 0xeda53, 0xedc48, 0xede3d, 0xee050, 0xee244,\r\n            0xee439, 0xee64d, 0xee842, 0xeea36, 0xeec4a, 0xeee3e, 0xef052,\r\n            0xef246, 0xef43a, 0xef64e, 0xef843, 0xefa37, 0xefc4b, 0xefe41,\r\n            0xf0054, 0xf0248, 0xf043c, 0xf0650, 0xf0845, 0xf0a38, 0xf0c4d,\r\n            0xf0e42, 0xf1037, 0xf124a, 0xf143e, 0xf1651, 0xf1846, 0xf1a3a,\r\n            0xf1c4e, 0xf1e44, 0xf2038, 0xf224b, 0xf243f, 0xf2653, 0xf2848,\r\n            0xf2a3b, 0xf2c4f, 0xf2e45, 0xf3039, 0xf324d, 0xf3442, 0xf3636,\r\n            0xf384a, 0xf3a3d, 0xf3c51, 0xf3e46, 0xf403b, 0xf424e, 0xf4443,\r\n            0xf4638, 0xf484c, 0xf4a3f, 0xf4c52, 0xf4e48, 0xf503c, 0xf524f,\r\n            0xf5445, 0xf5639, 0xf584d, 0xf5a42, 0xf5c35, 0xf5e49, 0xf603e,\r\n            0xf6251, 0xf6446, 0xf663b, 0xf684f, 0xf6a43, 0xf6c37, 0xf6e4b,\r\n            0xf703f, 0xf7252, 0xf7447, 0xf763c, 0xf7850, 0xf7a45, 0xf7c39,\r\n            0xf7e4d, 0xf8042, 0xf8254, 0xf8449, 0xf863d, 0xf8851, 0xf8a46,\r\n            0xf8c3b, 0xf8e4f, 0xf9044, 0xf9237, 0xf944a, 0xf963f, 0xf9853,\r\n            0xf9a47, 0xf9c3c, 0xf9e50, 0xfa045, 0xfa238, 0xfa44c, 0xfa641,\r\n            0xfa836, 0xfaa49, 0xfac3d, 0xfae52, 0xfb047, 0xfb23a, 0xfb44e,\r\n            0xfb643, 0xfb837, 0xfba4a, 0xfbc3f, 0xfbe53, 0xfc048, 0xfc23c,\r\n            0xfc450, 0xfc645, 0xfc839, 0xfca4c, 0xfcc41, 0xfce36, 0xfd04a,\r\n            0xfd23d, 0xfd451, 0xfd646, 0xfd83a, 0xfda4d, 0xfdc43, 0xfde37,\r\n            0xfe04b, 0xfe23f, 0xfe453, 0xfe648, 0xfe83c, 0xfea4f, 0xfec44,\r\n            0xfee38, 0xff04c, 0xff241, 0xff436, 0xff64a, 0xff83e, 0xffa51,\r\n            0xffc46, 0xffe3a, 0x10004e, 0x100242, 0x100437, 0x10064b, 0x100841,\r\n            0x100a53, 0x100c48, 0x100e3c, 0x10104f, 0x101244, 0x101438,\r\n            0x10164c, 0x101842, 0x101a35, 0x101c49, 0x101e3d, 0x102051,\r\n            0x102245, 0x10243a, 0x10264e, 0x102843, 0x102a37, 0x102c4b,\r\n            0x102e3f, 0x103053, 0x103247, 0x10343b, 0x10364f, 0x103845,\r\n            0x103a38, 0x103c4c, 0x103e42, 0x104036, 0x104249, 0x10443d,\r\n            0x104651, 0x104846, 0x104a3a, 0x104c4e, 0x104e43, 0x105038,\r\n            0x10524a, 0x10543e, 0x105652, 0x105847, 0x105a3b, 0x105c4f,\r\n            0x105e45, 0x106039, 0x10624c, 0x106441, 0x106635, 0x106849,\r\n            0x106a3d, 0x106c51, 0x106e47, 0x10703c, 0x10724f, 0x107444,\r\n            0x107638, 0x10784c, 0x107a3f, 0x107c53, 0x107e48};\r\n    private static int[] lunar_month_days = {1887, 0x1694, 0x16aa, 0x4ad5,\r\n            0xab6, 0xc4b7, 0x4ae, 0xa56, 0xb52a, 0x1d2a, 0xd54, 0x75aa, 0x156a,\r\n            0x1096d, 0x95c, 0x14ae, 0xaa4d, 0x1a4c, 0x1b2a, 0x8d55, 0xad4,\r\n            0x135a, 0x495d, 0x95c, 0xd49b, 0x149a, 0x1a4a, 0xbaa5, 0x16a8,\r\n            0x1ad4, 0x52da, 0x12b6, 0xe937, 0x92e, 0x1496, 0xb64b, 0xd4a,\r\n            0xda8, 0x95b5, 0x56c, 0x12ae, 0x492f, 0x92e, 0xcc96, 0x1a94,\r\n            0x1d4a, 0xada9, 0xb5a, 0x56c, 0x726e, 0x125c, 0xf92d, 0x192a,\r\n            0x1a94, 0xdb4a, 0x16aa, 0xad4, 0x955b, 0x4ba, 0x125a, 0x592b,\r\n            0x152a, 0xf695, 0xd94, 0x16aa, 0xaab5, 0x9b4, 0x14b6, 0x6a57,\r\n            0xa56, 0x1152a, 0x1d2a, 0xd54, 0xd5aa, 0x156a, 0x96c, 0x94ae,\r\n            0x14ae, 0xa4c, 0x7d26, 0x1b2a, 0xeb55, 0xad4, 0x12da, 0xa95d,\r\n            0x95a, 0x149a, 0x9a4d, 0x1a4a, 0x11aa5, 0x16a8, 0x16d4, 0xd2da,\r\n            0x12b6, 0x936, 0x9497, 0x1496, 0x1564b, 0xd4a, 0xda8, 0xd5b4,\r\n            0x156c, 0x12ae, 0xa92f, 0x92e, 0xc96, 0x6d4a, 0x1d4a, 0x10d65,\r\n            0xb58, 0x156c, 0xb26d, 0x125c, 0x192c, 0x9a95, 0x1a94, 0x1b4a,\r\n            0x4b55, 0xad4, 0xf55b, 0x4ba, 0x125a, 0xb92b, 0x152a, 0x1694,\r\n            0x96aa, 0x15aa, 0x12ab5, 0x974, 0x14b6, 0xca57, 0xa56, 0x1526,\r\n            0x8e95, 0xd54, 0x15aa, 0x49b5, 0x96c, 0xd4ae, 0x149c, 0x1a4c,\r\n            0xbd26, 0x1aa6, 0xb54, 0x6d6a, 0x12da, 0x1695d, 0x95a, 0x149a,\r\n            0xda4b, 0x1a4a, 0x1aa4, 0xbb54, 0x16b4, 0xada, 0x495b, 0x936,\r\n            0xf497, 0x1496, 0x154a, 0xb6a5, 0xda4, 0x15b4, 0x6ab6, 0x126e,\r\n            0x1092f, 0x92e, 0xc96, 0xcd4a, 0x1d4a, 0xd64, 0x956c, 0x155c,\r\n            0x125c, 0x792e, 0x192c, 0xfa95, 0x1a94, 0x1b4a, 0xab55, 0xad4,\r\n            0x14da, 0x8a5d, 0xa5a, 0x1152b, 0x152a, 0x1694, 0xd6aa, 0x15aa,\r\n            0xab4, 0x94ba, 0x14b6, 0xa56, 0x7527, 0xd26, 0xee53, 0xd54, 0x15aa,\r\n            0xa9b5, 0x96c, 0x14ae, 0x8a4e, 0x1a4c, 0x11d26, 0x1aa4, 0x1b54,\r\n            0xcd6a, 0xada, 0x95c, 0x949d, 0x149a, 0x1a2a, 0x5b25, 0x1aa4,\r\n            0xfb52, 0x16b4, 0xaba, 0xa95b, 0x936, 0x1496, 0x9a4b, 0x154a,\r\n            0x136a5, 0xda4, 0x15ac};\r\n\r\n    /**\r\n     * 将农历日期转换为公历日期\r\n     *\r\n     * @param year        农历年份\r\n     * @param month       农历月\r\n     * @param monthDay    农历日\r\n     * @param isLeapMonth 该月是否是闰月\r\n     * @return 返回农历日期对应的公历日期，year0, month1, day2.\r\n     */\r\n    public static final int[] lunarToSolar(int year, int month, int monthDay,\r\n                                           boolean isLeapMonth) {\r\n        int dayOffset;\r\n        int leapMonth;\r\n        int i;\r\n\r\n        if (year < MIN_YEAR || year > MAX_YEAR || month < 1 || month > 12\r\n                || monthDay < 1 || monthDay > 30) {\r\n            throw new IllegalArgumentException(\r\n                    \"Illegal lunar date, must be like that:\\n\\t\" +\r\n                            \"year : 1900~2099\\n\\t\" +\r\n                            \"month : 1~12\\n\\t\" +\r\n                            \"day : 1~30\");\r\n        }\r\n\r\n        dayOffset = (LUNAR_INFO[year - MIN_YEAR] & 0x001F) - 1;\r\n\r\n        if (((LUNAR_INFO[year - MIN_YEAR] & 0x0060) >> 5) == 2)\r\n            dayOffset += 31;\r\n\r\n        for (i = 1; i < month; i++) {\r\n            if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (i - 1))) == 0)\r\n                dayOffset += 29;\r\n            else\r\n                dayOffset += 30;\r\n        }\r\n\r\n        dayOffset += monthDay;\r\n        leapMonth = (LUNAR_INFO[year - MIN_YEAR] & 0xf00000) >> 20;\r\n\r\n        // 这一年有闰月\r\n        if (leapMonth != 0) {\r\n            if (month > leapMonth || (month == leapMonth && isLeapMonth)) {\r\n                if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (month - 1))) == 0)\r\n                    dayOffset += 29;\r\n                else\r\n                    dayOffset += 30;\r\n            }\r\n        }\r\n\r\n        if (dayOffset > 366 || (year % 4 != 0 && dayOffset > 365)) {\r\n            year += 1;\r\n            if (year % 4 == 1)\r\n                dayOffset -= 366;\r\n            else\r\n                dayOffset -= 365;\r\n        }\r\n\r\n        int[] solarInfo = new int[3];\r\n        for (i = 1; i < 13; i++) {\r\n            int iPos = DAYS_BEFORE_MONTH[i];\r\n            if (year % 4 == 0 && i > 2) {\r\n                iPos += 1;\r\n            }\r\n\r\n            if (year % 4 == 0 && i == 2 && iPos + 1 == dayOffset) {\r\n                solarInfo[1] = i;\r\n                solarInfo[2] = dayOffset - 31;\r\n                break;\r\n            }\r\n\r\n            if (iPos >= dayOffset) {\r\n                solarInfo[1] = i;\r\n                iPos = DAYS_BEFORE_MONTH[i - 1];\r\n                if (year % 4 == 0 && i > 2) {\r\n                    iPos += 1;\r\n                }\r\n                if (dayOffset > iPos)\r\n                    solarInfo[2] = dayOffset - iPos;\r\n                else if (dayOffset == iPos) {\r\n                    if (year % 4 == 0 && i == 2)\r\n                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1] + 1;\r\n                    else\r\n                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1];\r\n\r\n                } else\r\n                    solarInfo[2] = dayOffset;\r\n                break;\r\n            }\r\n        }\r\n        solarInfo[0] = year;\r\n\r\n        return solarInfo;\r\n    }\r\n\r\n    public static final int[] solarToLunar(int year, int month, int monthDay) {\r\n        int[] lunarDate = new int[4];\r\n\r\n        int index = year - solar_1_1[0];\r\n        int data = (year << 9) | (month << 5)\r\n                | (monthDay);\r\n        int solar11 = 0;\r\n        if (solar_1_1[index] > data) {\r\n            index--;\r\n        }\r\n        solar11 = solar_1_1[index];\r\n        int y = getBitInt(solar11, 12, 9);\r\n        int m = getBitInt(solar11, 4, 5);\r\n        int d = getBitInt(solar11, 5, 0);\r\n        long offset = solarToInt(year, month,\r\n                monthDay) - solarToInt(y, m, d);\r\n\r\n        int days = lunar_month_days[index];\r\n        int leap = getBitInt(days, 4, 13);\r\n\r\n        int lunarY = index + solar_1_1[0];\r\n        int lunarM = 1;\r\n        int lunarD = 1;\r\n        offset += 1;\r\n\r\n        for (int i = 0; i < 13; i++) {\r\n            int dm = getBitInt(days, 1, 12 - i) == 1 ? 30 : 29;\r\n            if (offset > dm) {\r\n                lunarM++;\r\n                offset -= dm;\r\n            } else {\r\n                break;\r\n            }\r\n        }\r\n        lunarD = (int) (offset);\r\n        lunarDate[0] = lunarY;\r\n        lunarDate[1] = lunarM;\r\n        boolean isLeap = false;\r\n        if (leap != 0 && lunarM > leap) {\r\n            lunarDate[1] = lunarM - 1;\r\n            if (lunarM == leap + 1) {\r\n                isLeap = true;\r\n            }\r\n        }\r\n\r\n        lunarDate[2] = lunarD;\r\n        lunarDate[3] = isLeap ? 1 : 0;\r\n        //Log.i(\"----------->\",year+\"-\"+month+\"-\"+monthDay+\"====>\"+lunarDate[0]+\"-\"+lunarDate[1]+\"-\"+lunarDate[2]+\"-\"+lunarDate[3]);\r\n        return lunarDate;\r\n    }\r\n\r\n\r\n    /**\r\n     * 将公历日期转换为农历日期，且标识是否是闰月\r\n     *\r\n     * @param year\r\n     * @param month\r\n     * @param monthDay\r\n     * @return 返回公历日期对应的农历日期，year0，month1，day2，leap3\r\n     * @deprecated 不准确\r\n     */\r\n    @Deprecated\r\n    public static final int[] solarToLunarDeprecated(int year, int month, int monthDay) {\r\n        int[] lunarDate = new int[4];\r\n        Date baseDate = new GregorianCalendar(1900, 0, 31).getTime();\r\n        Date objDate = new GregorianCalendar(year, month - 1, monthDay).getTime();\r\n        int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000L);\r\n\r\n        // 用offset减去每农历年的天数计算当天是农历第几天\r\n        // iYear最终结果是农历的年份, offset是当年的第几天\r\n        int iYear, daysOfYear = 0;\r\n        for (iYear = MIN_YEAR; iYear <= MAX_YEAR && offset > 0; iYear++) {\r\n            daysOfYear = daysInLunarYear(iYear);\r\n            offset -= daysOfYear;\r\n        }\r\n        if (offset < 0) {\r\n            offset += daysOfYear;\r\n            iYear--;\r\n        }\r\n\r\n        // 农历年份\r\n        lunarDate[0] = iYear;\r\n\r\n        int leapMonth = leapMonth(iYear); // 闰哪个月,1-12\r\n        boolean isLeap = false;\r\n        // 用当年的天数offset,逐个减去每月（农历）的天数，求出当天是本月的第几天\r\n        int iMonth, daysOfMonth = 0;\r\n        for (iMonth = 1; iMonth <= 13 && offset > 0; iMonth++) {\r\n            daysOfMonth = daysInLunarMonth(iYear, iMonth);\r\n            offset -= daysOfMonth;\r\n        }\r\n        // 当前月超过闰月，要校正\r\n        if (leapMonth != 0 && iMonth > leapMonth) {\r\n            --iMonth;\r\n            Log.i(\"----------->\", year + \"-\" + month + \"-\" + monthDay + \"====>\" + iMonth + \"-\" + leapMonth);\r\n            if (iMonth == leapMonth) {\r\n                isLeap = true;\r\n            }\r\n        }\r\n        // offset小于0时，也要校正\r\n        if (offset < 0) {\r\n            offset += daysOfMonth;\r\n            --iMonth;\r\n        }\r\n\r\n        lunarDate[1] = iMonth;\r\n        lunarDate[2] = offset + 1;\r\n        lunarDate[3] = isLeap ? 1 : 0;\r\n\r\n        //Log.i(\"----------->\",year+\"-\"+month+\"-\"+monthDay+\"====>\"+lunarDate[0]+\"-\"+lunarDate[1]+\"-\"+lunarDate[2]+\"-\"+lunarDate[3]);\r\n        return lunarDate;\r\n    }\r\n\r\n    /**\r\n     * 传回农历year年month月的总天数\r\n     *\r\n     * @param year  要计算的年份\r\n     * @param month 要计算的月\r\n     * @return 传回天数\r\n     */\r\n    final public static int daysInMonth(int year, int month) {\r\n        return daysInMonth(year, month, false);\r\n    }\r\n\r\n    /**\r\n     * 传回农历year年month月的总天数\r\n     *\r\n     * @param year  要计算的年份\r\n     * @param month 要计算的月\r\n     * @param leap  当月是否是闰月\r\n     * @return 传回天数，如果闰月是错误的，返回0.\r\n     */\r\n    public static final int daysInMonth(int year, int month, boolean leap) {\r\n        int leapMonth = leapMonth(year);\r\n        int offset = 0;\r\n\r\n        // 如果本年有闰月且month大于闰月时，需要校正\r\n        if (leapMonth != 0 && month > leapMonth) {\r\n            offset = 1;\r\n        }\r\n\r\n        // 不考虑闰月\r\n        if (!leap) {\r\n            return daysInLunarMonth(year, month + offset);\r\n        } else {\r\n            // 传入的闰月是正确的月份\r\n            if (leapMonth != 0 && leapMonth == month) {\r\n                return daysInLunarMonth(year, month + 1);\r\n            }\r\n        }\r\n\r\n        return 0;\r\n    }\r\n\r\n    /**\r\n     * 传回农历 year年的总天数\r\n     *\r\n     * @param year 将要计算的年份\r\n     * @return 返回传入年份的总天数\r\n     */\r\n    private static int daysInLunarYear(int year) {\r\n        int i, sum = 348;\r\n        if (leapMonth(year) != 0) {\r\n            sum = 377;\r\n        }\r\n        int monthInfo = LUNAR_INFO[year - MIN_YEAR] & 0x0FFF80;\r\n        for (i = 0x80000; i > 0x7; i >>= 1) {\r\n            if ((monthInfo & i) != 0)\r\n                sum += 1;\r\n        }\r\n        return sum;\r\n    }\r\n\r\n    /**\r\n     * 传回农历 year年month月的总天数，总共有13个月包括闰月\r\n     *\r\n     * @param year  将要计算的年份\r\n     * @param month 将要计算的月份\r\n     * @return 传回农历 year年month月的总天数\r\n     */\r\n    private static int daysInLunarMonth(int year, int month) {\r\n        if ((LUNAR_INFO[year - MIN_YEAR] & (0x100000 >> month)) == 0)\r\n            return 29;\r\n        else\r\n            return 30;\r\n    }\r\n\r\n    /**\r\n     * 传回农历 year年闰哪个月 1-12 , 没闰传回 0\r\n     *\r\n     * @param year 将要计算的年份\r\n     * @return 传回农历 year年闰哪个月1-12, 没闰传回 0\r\n     */\r\n    public static int leapMonth(int year) {\r\n        return (int) ((LUNAR_INFO[year - MIN_YEAR] & 0xF00000)) >> 20;\r\n    }\r\n\r\n\r\n    private static int getBitInt(int data, int length, int shift) {\r\n        return (data & (((1 << length) - 1) << shift)) >> shift;\r\n    }\r\n\r\n    private static long solarToInt(int y, int m, int d) {\r\n        m = (m + 9) % 12;\r\n        y = y - m / 10;\r\n        return 365 * y + y / 4 - y / 100 + y / 400 + (m * 306 + 5) / 10\r\n                + (d - 1);\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java",
    "content": "package com.bigkoo.pickerview.utils;\n\nimport android.view.Gravity;\n\nimport com.bigkoo.pickerview.R;\n\n/**\n * Created by Sai on 15/8/9.\n */\npublic class PickerViewAnimateUtil {\n    private static final int INVALID = -1;\n    /**\n     * Get default animation resource when not defined by the user\n     *\n     * @param gravity       the animGravity of the dialog\n     * @param isInAnimation determine if is in or out animation. true when is is\n     * @return the id of the animation resource\n     */\n    public static int getAnimationResource(int gravity, boolean isInAnimation) {\n        switch (gravity) {\n            case Gravity.BOTTOM:\n                return isInAnimation ? R.anim.pickerview_slide_in_bottom : R.anim.pickerview_slide_out_bottom;\n        }\n        return INVALID;\n    }\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java",
    "content": "package com.bigkoo.pickerview.view;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.graphics.Color;\nimport android.view.Gravity;\nimport android.view.KeyEvent;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.Window;\nimport android.view.animation.Animation;\nimport android.view.animation.AnimationUtils;\nimport android.widget.FrameLayout;\n\nimport com.bigkoo.pickerview.R;\nimport com.bigkoo.pickerview.configure.PickerOptions;\nimport com.bigkoo.pickerview.listener.OnDismissListener;\nimport com.bigkoo.pickerview.utils.PickerViewAnimateUtil;\n\n/**\n * Created by Sai on 15/11/22.\n * 精仿iOSPickerViewController控件\n */\npublic class BasePickerView {\n\n    private Context context;\n    protected ViewGroup contentContainer;\n    private ViewGroup rootView;//附加View 的 根View\n    private ViewGroup dialogView;//附加Dialog 的 根View\n\n    protected PickerOptions mPickerOptions;\n    private OnDismissListener onDismissListener;\n    private boolean dismissing;\n\n    private Animation outAnim;\n    private Animation inAnim;\n    private boolean isShowing;\n\n    protected int animGravity = Gravity.BOTTOM;\n\n    private Dialog mDialog;\n    protected View clickView;//是通过哪个View弹出的\n    private boolean isAnim = true;\n\n    public BasePickerView(Context context) {\n        this.context = context;\n    }\n\n\n    protected void initViews() {\n\n        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(\n                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);\n\n        LayoutInflater layoutInflater = LayoutInflater.from(context);\n        if (isDialog()) {\n            //如果是对话框模式\n            dialogView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, null, false);\n            //设置界面的背景为透明\n            dialogView.setBackgroundColor(Color.TRANSPARENT);\n            //这个是真正要加载选择器的父布局\n            contentContainer = (ViewGroup) dialogView.findViewById(R.id.content_container);\n            //设置对话框 默认左右间距屏幕30\n            params.leftMargin = 30;\n            params.rightMargin = 30;\n            contentContainer.setLayoutParams(params);\n            //创建对话框\n            createDialog();\n            //给背景设置点击事件,这样当点击内容以外的地方会关闭界面\n            dialogView.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View view) {\n                    dismiss();\n                }\n            });\n        } else {\n            //如果只是要显示在屏幕的下方\n            //decorView是activity的根View,包含 contentView 和 titleView\n            if (mPickerOptions.decorView == null) {\n                mPickerOptions.decorView = (ViewGroup) ((Activity) context).getWindow().getDecorView();\n            }\n            //将控件添加到decorView中\n            rootView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, mPickerOptions.decorView, false);\n            rootView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));\n            if (mPickerOptions.outSideColor != -1) {\n                rootView.setBackgroundColor(mPickerOptions.outSideColor);\n            }\n            //这个是真正要加载时间选取器的父布局\n            contentContainer = (ViewGroup) rootView.findViewById(R.id.content_container);\n            contentContainer.setLayoutParams(params);\n        }\n        setKeyBackCancelable(true);\n    }\n\n    protected void initAnim() {\n        inAnim = getInAnimation();\n        outAnim = getOutAnimation();\n    }\n\n    protected void initEvents() {\n    }\n\n\n    /**\n     * @param v      (是通过哪个View弹出的)\n     * @param isAnim 是否显示动画效果\n     */\n    public void show(View v, boolean isAnim) {\n        this.clickView = v;\n        this.isAnim = isAnim;\n        show();\n    }\n\n    public void show(boolean isAnim) {\n        show(null, isAnim);\n    }\n\n    public void show(View v) {\n        this.clickView = v;\n        show();\n    }\n\n\n    /**\n     * 添加View到根视图\n     */\n    public void show() {\n        if (isDialog()) {\n            showDialog();\n        } else {\n            if (isShowing()) {\n                return;\n            }\n            isShowing = true;\n            onAttached(rootView);\n            rootView.requestFocus();\n        }\n    }\n\n\n    /**\n     * show的时候调用\n     *\n     * @param view 这个View\n     */\n    private void onAttached(View view) {\n        mPickerOptions.decorView.addView(view);\n        if (isAnim) {\n            contentContainer.startAnimation(inAnim);\n        }\n    }\n\n\n    /**\n     * 检测该View是不是已经添加到根视图\n     *\n     * @return 如果视图已经存在该View返回true\n     */\n    public boolean isShowing() {\n        if (isDialog()) {\n            return false;\n        } else {\n            return rootView.getParent() != null || isShowing;\n        }\n\n    }\n\n    public void dismiss() {\n        if (isDialog()) {\n            dismissDialog();\n        } else {\n            if (dismissing) {\n                return;\n            }\n\n            if (isAnim) {\n                //消失动画\n                outAnim.setAnimationListener(new Animation.AnimationListener() {\n                    @Override\n                    public void onAnimationStart(Animation animation) {\n\n                    }\n\n                    @Override\n                    public void onAnimationEnd(Animation animation) {\n                        dismissImmediately();\n                    }\n\n                    @Override\n                    public void onAnimationRepeat(Animation animation) {\n\n                    }\n                });\n                contentContainer.startAnimation(outAnim);\n            } else {\n                dismissImmediately();\n            }\n            dismissing = true;\n        }\n\n\n    }\n\n    public void dismissImmediately() {\n\n        mPickerOptions.decorView.post(new Runnable() {\n            @Override\n            public void run() {\n                //从根视图移除\n                mPickerOptions.decorView.removeView(rootView);\n                isShowing = false;\n                dismissing = false;\n                if (onDismissListener != null) {\n                    onDismissListener.onDismiss(BasePickerView.this);\n                }\n            }\n        });\n\n\n    }\n\n    private Animation getInAnimation() {\n        int res = PickerViewAnimateUtil.getAnimationResource(this.animGravity, true);\n        return AnimationUtils.loadAnimation(context, res);\n    }\n\n    private Animation getOutAnimation() {\n        int res = PickerViewAnimateUtil.getAnimationResource(this.animGravity, false);\n        return AnimationUtils.loadAnimation(context, res);\n    }\n\n    public BasePickerView setOnDismissListener(OnDismissListener onDismissListener) {\n        this.onDismissListener = onDismissListener;\n        return this;\n    }\n\n    public void setKeyBackCancelable(boolean isCancelable) {\n\n        ViewGroup View;\n        if (isDialog()) {\n            View = dialogView;\n        } else {\n            View = rootView;\n        }\n\n        View.setFocusable(isCancelable);\n        View.setFocusableInTouchMode(isCancelable);\n        if (isCancelable) {\n            View.setOnKeyListener(onKeyBackListener);\n        } else {\n            View.setOnKeyListener(null);\n        }\n    }\n\n    private View.OnKeyListener onKeyBackListener = new View.OnKeyListener() {\n        @Override\n        public boolean onKey(View v, int keyCode, KeyEvent event) {\n            if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_DOWN && isShowing()) {\n                dismiss();\n                return true;\n            }\n            return false;\n        }\n    };\n\n    protected BasePickerView setOutSideCancelable(boolean isCancelable) {\n\n        if (rootView != null) {\n            View view = rootView.findViewById(R.id.outmost_container);\n\n            if (isCancelable) {\n                view.setOnTouchListener(onCancelableTouchListener);\n            } else {\n                view.setOnTouchListener(null);\n            }\n        }\n\n        return this;\n    }\n\n    /**\n     * 设置对话框模式是否可以点击外部取消\n     */\n    public void setDialogOutSideCancelable() {\n        if (mDialog != null) {\n            mDialog.setCancelable(mPickerOptions.cancelable);\n        }\n    }\n\n\n    /**\n     * Called when the user touch on black overlay, in order to dismiss the dialog.\n     */\n    private final View.OnTouchListener onCancelableTouchListener = new View.OnTouchListener() {\n        @Override\n        public boolean onTouch(View v, MotionEvent event) {\n            if (event.getAction() == MotionEvent.ACTION_DOWN) {\n                dismiss();\n            }\n            return false;\n        }\n    };\n\n    public View findViewById(int id) {\n        return contentContainer.findViewById(id);\n    }\n\n    public void createDialog() {\n        if (dialogView != null) {\n            mDialog = new Dialog(context, R.style.custom_dialog2);\n            mDialog.setCancelable(mPickerOptions.cancelable);//不能点外面取消,也不能点back取消\n            mDialog.setContentView(dialogView);\n\n            Window dialogWindow = mDialog.getWindow();\n            if (dialogWindow != null) {\n                dialogWindow.setWindowAnimations(R.style.picker_view_scale_anim);\n                dialogWindow.setGravity(Gravity.CENTER);//可以改成Bottom\n            }\n\n            mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {\n                @Override\n                public void onDismiss(DialogInterface dialog) {\n                    if (onDismissListener != null) {\n                        onDismissListener.onDismiss(BasePickerView.this);\n                    }\n                }\n            });\n        }\n    }\n\n    private void showDialog() {\n        if (mDialog != null) {\n            mDialog.show();\n        }\n    }\n\n    private void dismissDialog() {\n        if (mDialog != null) {\n            mDialog.dismiss();\n        }\n    }\n\n    public ViewGroup getDialogContainerLayout() {\n        return contentContainer;\n    }\n\n\n    public Dialog getDialog() {\n        return mDialog;\n    }\n\n\n    public boolean isDialog() {\n        return false;\n    }\n\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/view/OptionsPickerView.java",
    "content": "package com.bigkoo.pickerview.view;\n\nimport android.content.Context;\nimport android.text.TextUtils;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.bigkoo.pickerview.R;\nimport com.bigkoo.pickerview.configure.PickerOptions;\n\nimport java.util.List;\n\n/**\n * 条件选择器\n * Created by Sai on 15/11/22.\n */\npublic class OptionsPickerView<T> extends BasePickerView implements View.OnClickListener {\n\n    private WheelOptions<T> wheelOptions;\n\n    private static final String TAG_SUBMIT = \"submit\";\n    private static final String TAG_CANCEL = \"cancel\";\n\n\n    public OptionsPickerView(PickerOptions pickerOptions) {\n        super(pickerOptions.context);\n        mPickerOptions = pickerOptions;\n        initView(pickerOptions.context);\n    }\n\n    private void initView(Context context) {\n        setDialogOutSideCancelable();\n        initViews();\n        initAnim();\n        initEvents();\n        if (mPickerOptions.customListener == null) {\n            LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer);\n\n            //顶部标题\n            TextView tvTitle = (TextView) findViewById(R.id.tvTitle);\n            RelativeLayout rv_top_bar = (RelativeLayout) findViewById(R.id.rv_topbar);\n\n            //确定和取消按钮\n            Button btnSubmit = (Button) findViewById(R.id.btnSubmit);\n            Button btnCancel = (Button) findViewById(R.id.btnCancel);\n\n            btnSubmit.setTag(TAG_SUBMIT);\n            btnCancel.setTag(TAG_CANCEL);\n            btnSubmit.setOnClickListener(this);\n            btnCancel.setOnClickListener(this);\n\n            //设置文字\n            btnSubmit.setText(TextUtils.isEmpty(mPickerOptions.textContentConfirm) ? context.getResources().getString(R.string.pickerview_submit) : mPickerOptions.textContentConfirm);\n            btnCancel.setText(TextUtils.isEmpty(mPickerOptions.textContentCancel) ? context.getResources().getString(R.string.pickerview_cancel) : mPickerOptions.textContentCancel);\n            tvTitle.setText(TextUtils.isEmpty(mPickerOptions.textContentTitle) ? \"\" : mPickerOptions.textContentTitle);//默认为空\n\n            //设置color\n            btnSubmit.setTextColor(mPickerOptions.textColorConfirm);\n            btnCancel.setTextColor(mPickerOptions.textColorCancel);\n            tvTitle.setTextColor(mPickerOptions.textColorTitle);\n            rv_top_bar.setBackgroundColor(mPickerOptions.bgColorTitle);\n\n            //设置文字大小\n            btnSubmit.setTextSize(mPickerOptions.textSizeSubmitCancel);\n            btnCancel.setTextSize(mPickerOptions.textSizeSubmitCancel);\n            tvTitle.setTextSize(mPickerOptions.textSizeTitle);\n        } else {\n            mPickerOptions.customListener.customLayout(LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer));\n        }\n\n        // ----滚轮布局\n        final LinearLayout optionsPicker = (LinearLayout) findViewById(R.id.optionspicker);\n        optionsPicker.setBackgroundColor(mPickerOptions.bgColorWheel);\n\n        wheelOptions = new WheelOptions<>(optionsPicker, mPickerOptions.isRestoreItem);\n        if (mPickerOptions.optionsSelectChangeListener != null) {\n            wheelOptions.setOptionsSelectChangeListener(mPickerOptions.optionsSelectChangeListener);\n        }\n\n        wheelOptions.setTextContentSize(mPickerOptions.textSizeContent);\n        wheelOptions.setItemsVisible(mPickerOptions.itemsVisibleCount);\n        wheelOptions.setAlphaGradient(mPickerOptions.isAlphaGradient);\n        wheelOptions.setLabels(mPickerOptions.label1, mPickerOptions.label2, mPickerOptions.label3);\n        wheelOptions.setTextXOffset(mPickerOptions.x_offset_one, mPickerOptions.x_offset_two, mPickerOptions.x_offset_three);\n        wheelOptions.setCyclic(mPickerOptions.cyclic1, mPickerOptions.cyclic2, mPickerOptions.cyclic3);\n        wheelOptions.setTypeface(mPickerOptions.font);\n\n        setOutSideCancelable(mPickerOptions.cancelable);\n\n        wheelOptions.setDividerColor(mPickerOptions.dividerColor);\n        wheelOptions.setDividerType(mPickerOptions.dividerType);\n        wheelOptions.setLineSpacingMultiplier(mPickerOptions.lineSpacingMultiplier);\n        wheelOptions.setTextColorOut(mPickerOptions.textColorOut);\n        wheelOptions.setTextColorCenter(mPickerOptions.textColorCenter);\n        wheelOptions.isCenterLabel(mPickerOptions.isCenterLabel);\n    }\n\n    /**\n     * 动态设置标题\n     *\n     * @param text 标题文本内容\n     */\n    public void setTitleText(String text) {\n        TextView tvTitle = (TextView) findViewById(R.id.tvTitle);\n        if (tvTitle != null) {\n            tvTitle.setText(text);\n        }\n    }\n\n    /**\n     * 设置默认选中项\n     *\n     * @param option1\n     */\n    public void setSelectOptions(int option1) {\n        mPickerOptions.option1 = option1;\n        reSetCurrentItems();\n    }\n\n\n    public void setSelectOptions(int option1, int option2) {\n        mPickerOptions.option1 = option1;\n        mPickerOptions.option2 = option2;\n        reSetCurrentItems();\n    }\n\n    public void setSelectOptions(int option1, int option2, int option3) {\n        mPickerOptions.option1 = option1;\n        mPickerOptions.option2 = option2;\n        mPickerOptions.option3 = option3;\n        reSetCurrentItems();\n    }\n\n    private void reSetCurrentItems() {\n        if (wheelOptions != null) {\n            wheelOptions.setCurrentItems(mPickerOptions.option1, mPickerOptions.option2, mPickerOptions.option3);\n        }\n    }\n\n    public void setPicker(List<T> optionsItems) {\n        this.setPicker(optionsItems, null, null);\n    }\n\n    public void setPicker(List<T> options1Items, List<List<T>> options2Items) {\n        this.setPicker(options1Items, options2Items, null);\n    }\n\n    public void setPicker(List<T> options1Items,\n                          List<List<T>> options2Items,\n                          List<List<List<T>>> options3Items) {\n\n        wheelOptions.setPicker(options1Items, options2Items, options3Items);\n        reSetCurrentItems();\n    }\n\n\n    //不联动情况下调用\n    public void setNPicker(List<T> options1Items,\n                           List<T> options2Items,\n                           List<T> options3Items) {\n\n        wheelOptions.setLinkage(false);\n        wheelOptions.setNPicker(options1Items, options2Items, options3Items);\n        reSetCurrentItems();\n    }\n\n    @Override\n    public void onClick(View v) {\n        String tag = (String) v.getTag();\n        if (tag.equals(TAG_SUBMIT)) {\n            returnData();\n        } else if (tag.equals(TAG_CANCEL)) {\n            if (mPickerOptions.cancelListener != null) {\n                mPickerOptions.cancelListener.onClick(v);\n            }\n        }\n        dismiss();\n    }\n\n    //抽离接口回调的方法\n    public void returnData() {\n        if (mPickerOptions.optionsSelectListener != null) {\n            int[] optionsCurrentItems = wheelOptions.getCurrentItems();\n            mPickerOptions.optionsSelectListener.onOptionsSelect(optionsCurrentItems[0], optionsCurrentItems[1], optionsCurrentItems[2], clickView);\n        }\n    }\n\n\n    @Override\n    public boolean isDialog() {\n        return mPickerOptions.isDialog;\n    }\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java",
    "content": "package com.bigkoo.pickerview.view;\n\nimport android.content.Context;\nimport android.text.TextUtils;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.bigkoo.pickerview.R;\nimport com.bigkoo.pickerview.configure.PickerOptions;\nimport com.bigkoo.pickerview.listener.ISelectTimeCallback;\n\nimport java.text.ParseException;\nimport java.util.Calendar;\nimport java.util.Date;\n\n/**\n * 时间选择器\n * Created by Sai on 15/11/22.\n * Updated by XiaoSong on 2017-2-22.\n */\npublic class TimePickerView extends BasePickerView implements View.OnClickListener {\n\n    private WheelTime wheelTime; //自定义控件\n    private static final String TAG_SUBMIT = \"submit\";\n    private static final String TAG_CANCEL = \"cancel\";\n\n    public TimePickerView(PickerOptions pickerOptions) {\n        super(pickerOptions.context);\n        mPickerOptions = pickerOptions;\n        initView(pickerOptions.context);\n    }\n\n    private void initView(Context context) {\n        setDialogOutSideCancelable();\n        initViews();\n        initAnim();\n\n        if (mPickerOptions.customListener == null) {\n            LayoutInflater.from(context).inflate(R.layout.pickerview_time, contentContainer);\n\n            //顶部标题\n            TextView tvTitle = (TextView) findViewById(R.id.tvTitle);\n            RelativeLayout rv_top_bar = (RelativeLayout) findViewById(R.id.rv_topbar);\n\n            //确定和取消按钮\n            Button btnSubmit = (Button) findViewById(R.id.btnSubmit);\n            Button btnCancel = (Button) findViewById(R.id.btnCancel);\n\n            btnSubmit.setTag(TAG_SUBMIT);\n            btnCancel.setTag(TAG_CANCEL);\n\n            btnSubmit.setOnClickListener(this);\n            btnCancel.setOnClickListener(this);\n\n            //设置文字\n            btnSubmit.setText(TextUtils.isEmpty(mPickerOptions.textContentConfirm) ? context.getResources().getString(R.string.pickerview_submit) : mPickerOptions.textContentConfirm);\n            btnCancel.setText(TextUtils.isEmpty(mPickerOptions.textContentCancel) ? context.getResources().getString(R.string.pickerview_cancel) : mPickerOptions.textContentCancel);\n            tvTitle.setText(TextUtils.isEmpty(mPickerOptions.textContentTitle) ? \"\" : mPickerOptions.textContentTitle);//默认为空\n\n            //设置color\n            btnSubmit.setTextColor(mPickerOptions.textColorConfirm);\n            btnCancel.setTextColor(mPickerOptions.textColorCancel);\n            tvTitle.setTextColor(mPickerOptions.textColorTitle);\n            rv_top_bar.setBackgroundColor(mPickerOptions.bgColorTitle);\n\n            //设置文字大小\n            btnSubmit.setTextSize(mPickerOptions.textSizeSubmitCancel);\n            btnCancel.setTextSize(mPickerOptions.textSizeSubmitCancel);\n            tvTitle.setTextSize(mPickerOptions.textSizeTitle);\n\n        } else {\n            mPickerOptions.customListener.customLayout(LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer));\n        }\n        // 时间转轮 自定义控件\n        LinearLayout timePickerView = (LinearLayout) findViewById(R.id.timepicker);\n        timePickerView.setBackgroundColor(mPickerOptions.bgColorWheel);\n\n        initWheelTime(timePickerView);\n    }\n\n    private void initWheelTime(LinearLayout timePickerView) {\n        wheelTime = new WheelTime(timePickerView, mPickerOptions.type, mPickerOptions.textGravity, mPickerOptions.textSizeContent);\n        if (mPickerOptions.timeSelectChangeListener != null) {\n            wheelTime.setSelectChangeCallback(new ISelectTimeCallback() {\n                @Override\n                public void onTimeSelectChanged() {\n                    try {\n                        Date date = WheelTime.dateFormat.parse(wheelTime.getTime());\n                        mPickerOptions.timeSelectChangeListener.onTimeSelectChanged(date);\n                    } catch (ParseException e) {\n                        e.printStackTrace();\n                    }\n                }\n            });\n        }\n\n        wheelTime.setLunarMode(mPickerOptions.isLunarCalendar);\n\n        if (mPickerOptions.startYear != 0 && mPickerOptions.endYear != 0\n                && mPickerOptions.startYear <= mPickerOptions.endYear) {\n            setRange();\n        }\n\n        //若手动设置了时间范围限制\n        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {\n            if (mPickerOptions.startDate.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) {\n                throw new IllegalArgumentException(\"startDate can't be later than endDate\");\n            } else {\n                setRangDate();\n            }\n        } else if (mPickerOptions.startDate != null) {\n            if (mPickerOptions.startDate.get(Calendar.YEAR) < 1900) {\n                throw new IllegalArgumentException(\"The startDate can not as early as 1900\");\n            } else {\n                setRangDate();\n            }\n        } else if (mPickerOptions.endDate != null) {\n            if (mPickerOptions.endDate.get(Calendar.YEAR) > 2100) {\n                throw new IllegalArgumentException(\"The endDate should not be later than 2100\");\n            } else {\n                setRangDate();\n            }\n        } else {//没有设置时间范围限制，则会使用默认范围。\n            setRangDate();\n        }\n\n        setTime();\n        wheelTime.setLabels(mPickerOptions.label_year, mPickerOptions.label_month, mPickerOptions.label_day\n                , mPickerOptions.label_hours, mPickerOptions.label_minutes, mPickerOptions.label_seconds);\n        wheelTime.setTextXOffset(mPickerOptions.x_offset_year, mPickerOptions.x_offset_month, mPickerOptions.x_offset_day,\n                mPickerOptions.x_offset_hours, mPickerOptions.x_offset_minutes, mPickerOptions.x_offset_seconds);\n        wheelTime.setItemsVisible(mPickerOptions.itemsVisibleCount);\n        wheelTime.setAlphaGradient(mPickerOptions.isAlphaGradient);\n        setOutSideCancelable(mPickerOptions.cancelable);\n        wheelTime.setCyclic(mPickerOptions.cyclic);\n        wheelTime.setDividerColor(mPickerOptions.dividerColor);\n        wheelTime.setDividerType(mPickerOptions.dividerType);\n        wheelTime.setLineSpacingMultiplier(mPickerOptions.lineSpacingMultiplier);\n        wheelTime.setTextColorOut(mPickerOptions.textColorOut);\n        wheelTime.setTextColorCenter(mPickerOptions.textColorCenter);\n        wheelTime.isCenterLabel(mPickerOptions.isCenterLabel);\n    }\n\n\n    /**\n     * 设置默认时间\n     */\n    public void setDate(Calendar date) {\n        mPickerOptions.date = date;\n        setTime();\n    }\n\n    /**\n     * 设置可以选择的时间范围, 要在setTime之前调用才有效果\n     */\n    private void setRange() {\n        wheelTime.setStartYear(mPickerOptions.startYear);\n        wheelTime.setEndYear(mPickerOptions.endYear);\n\n    }\n\n    /**\n     * 设置可以选择的时间范围, 要在setTime之前调用才有效果\n     */\n    private void setRangDate() {\n        wheelTime.setRangDate(mPickerOptions.startDate, mPickerOptions.endDate);\n        initDefaultSelectedDate();\n    }\n\n    private void initDefaultSelectedDate() {\n        //如果手动设置了时间范围\n        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {\n            //若默认时间未设置，或者设置的默认时间越界了，则设置默认选中时间为开始时间。\n            if (mPickerOptions.date == null || mPickerOptions.date.getTimeInMillis() < mPickerOptions.startDate.getTimeInMillis()\n                    || mPickerOptions.date.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) {\n                mPickerOptions.date = mPickerOptions.startDate;\n            }\n        } else if (mPickerOptions.startDate != null) {\n            //没有设置默认选中时间,那就拿开始时间当默认时间\n            mPickerOptions.date = mPickerOptions.startDate;\n        } else if (mPickerOptions.endDate != null) {\n            mPickerOptions.date = mPickerOptions.endDate;\n        }\n    }\n\n    /**\n     * 设置选中时间,默认选中当前时间\n     */\n    private void setTime() {\n        int year, month, day, hours, minute, seconds;\n        Calendar calendar = Calendar.getInstance();\n\n        if (mPickerOptions.date == null) {\n            calendar.setTimeInMillis(System.currentTimeMillis());\n            year = calendar.get(Calendar.YEAR);\n            month = calendar.get(Calendar.MONTH);\n            day = calendar.get(Calendar.DAY_OF_MONTH);\n            hours = calendar.get(Calendar.HOUR_OF_DAY);\n            minute = calendar.get(Calendar.MINUTE);\n            seconds = calendar.get(Calendar.SECOND);\n        } else {\n            year = mPickerOptions.date.get(Calendar.YEAR);\n            month = mPickerOptions.date.get(Calendar.MONTH);\n            day = mPickerOptions.date.get(Calendar.DAY_OF_MONTH);\n            hours = mPickerOptions.date.get(Calendar.HOUR_OF_DAY);\n            minute = mPickerOptions.date.get(Calendar.MINUTE);\n            seconds = mPickerOptions.date.get(Calendar.SECOND);\n        }\n\n        wheelTime.setPicker(year, month, day, hours, minute, seconds);\n    }\n\n\n    @Override\n    public void onClick(View v) {\n        String tag = (String) v.getTag();\n        if (tag.equals(TAG_SUBMIT)) {\n            returnData();\n        } else if (tag.equals(TAG_CANCEL)) {\n            if (mPickerOptions.cancelListener != null) {\n                mPickerOptions.cancelListener.onClick(v);\n            }\n        }\n        dismiss();\n    }\n\n    public void returnData() {\n        if (mPickerOptions.timeSelectListener != null) {\n            try {\n                Date date = WheelTime.dateFormat.parse(wheelTime.getTime());\n                mPickerOptions.timeSelectListener.onTimeSelect(date, clickView);\n            } catch (ParseException e) {\n                e.printStackTrace();\n            }\n        }\n    }\n\n    /**\n     * 动态设置标题\n     *\n     * @param text 标题文本内容\n     */\n    public void setTitleText(String text) {\n        TextView tvTitle = (TextView) findViewById(R.id.tvTitle);\n        if (tvTitle != null) {\n            tvTitle.setText(text);\n        }\n    }\n\n    /**\n     * 目前暂时只支持设置1900 - 2100年\n     *\n     * @param lunar 农历的开关\n     */\n    public void setLunarCalendar(boolean lunar) {\n        try {\n            int year, month, day, hours, minute, seconds;\n            Calendar calendar = Calendar.getInstance();\n            calendar.setTime(WheelTime.dateFormat.parse(wheelTime.getTime()));\n            year = calendar.get(Calendar.YEAR);\n            month = calendar.get(Calendar.MONTH);\n            day = calendar.get(Calendar.DAY_OF_MONTH);\n            hours = calendar.get(Calendar.HOUR_OF_DAY);\n            minute = calendar.get(Calendar.MINUTE);\n            seconds = calendar.get(Calendar.SECOND);\n\n            wheelTime.setLunarMode(lunar);\n            wheelTime.setLabels(mPickerOptions.label_year, mPickerOptions.label_month, mPickerOptions.label_day,\n                    mPickerOptions.label_hours, mPickerOptions.label_minutes, mPickerOptions.label_seconds);\n            wheelTime.setPicker(year, month, day, hours, minute, seconds);\n        } catch (ParseException e) {\n            e.printStackTrace();\n        }\n    }\n\n    public boolean isLunarCalendar() {\n        return wheelTime.isLunarMode();\n    }\n\n\n    @Override\n    public boolean isDialog() {\n        return mPickerOptions.isDialog;\n    }\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java",
    "content": "package com.bigkoo.pickerview.view;\n\nimport android.graphics.Typeface;\nimport android.view.View;\n\nimport com.bigkoo.pickerview.R;\nimport com.bigkoo.pickerview.adapter.ArrayWheelAdapter;\nimport com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;\nimport com.contrarywind.listener.OnItemSelectedListener;\nimport com.contrarywind.view.WheelView;\n\nimport java.util.List;\n\npublic class WheelOptions<T> {\n    private View view;\n    private WheelView wv_option1;\n    private WheelView wv_option2;\n    private WheelView wv_option3;\n\n    private List<T> mOptions1Items;\n    private List<List<T>> mOptions2Items;\n    private List<List<List<T>>> mOptions3Items;\n\n    private boolean linkage = true;//默认联动\n    private boolean isRestoreItem; //切换时，还原第一项\n    private OnItemSelectedListener wheelListener_option1;\n    private OnItemSelectedListener wheelListener_option2;\n\n    private OnOptionsSelectChangeListener optionsSelectChangeListener;\n\n    public View getView() {\n        return view;\n    }\n\n    public void setView(View view) {\n        this.view = view;\n    }\n\n    public WheelOptions(View view, boolean isRestoreItem) {\n        super();\n        this.isRestoreItem = isRestoreItem;\n        this.view = view;\n        wv_option1 = (WheelView) view.findViewById(R.id.options1);// 初始化时显示的数据\n        wv_option2 = (WheelView) view.findViewById(R.id.options2);\n        wv_option3 = (WheelView) view.findViewById(R.id.options3);\n    }\n\n\n    public void setPicker(List<T> options1Items,\n                          List<List<T>> options2Items,\n                          List<List<List<T>>> options3Items) {\n        this.mOptions1Items = options1Items;\n        this.mOptions2Items = options2Items;\n        this.mOptions3Items = options3Items;\n\n        // 选项1\n        wv_option1.setAdapter(new ArrayWheelAdapter(mOptions1Items));// 设置显示数据\n        wv_option1.setCurrentItem(0);// 初始化时显示的数据\n        // 选项2\n        if (mOptions2Items != null) {\n            wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(0)));// 设置显示数据\n        }\n        wv_option2.setCurrentItem(wv_option2.getCurrentItem());// 初始化时显示的数据\n        // 选项3\n        if (mOptions3Items != null) {\n            wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(0).get(0)));// 设置显示数据\n        }\n        wv_option3.setCurrentItem(wv_option3.getCurrentItem());\n        wv_option1.setIsOptions(true);\n        wv_option2.setIsOptions(true);\n        wv_option3.setIsOptions(true);\n\n        if (this.mOptions2Items == null) {\n            wv_option2.setVisibility(View.GONE);\n        } else {\n            wv_option2.setVisibility(View.VISIBLE);\n        }\n        if (this.mOptions3Items == null) {\n            wv_option3.setVisibility(View.GONE);\n        } else {\n            wv_option3.setVisibility(View.VISIBLE);\n        }\n\n        // 联动监听器\n        wheelListener_option1 = new OnItemSelectedListener() {\n\n            @Override\n            public void onItemSelected(int index) {\n                int opt2Select = 0;\n                if (mOptions2Items == null) {//只有1级联动数据\n                    if (optionsSelectChangeListener != null) {\n                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), 0, 0);\n                    }\n                } else {\n                    if (!isRestoreItem) {\n                        opt2Select = wv_option2.getCurrentItem();//上一个opt2的选中位置\n                        //新opt2的位置，判断如果旧位置没有超过数据范围，则沿用旧位置，否则选中最后一项\n                        opt2Select = opt2Select >= mOptions2Items.get(index).size() - 1 ? mOptions2Items.get(index).size() - 1 : opt2Select;\n                    }\n                    wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(index)));\n                    wv_option2.setCurrentItem(opt2Select);\n\n                    if (mOptions3Items != null) {\n                        wheelListener_option2.onItemSelected(opt2Select);\n                    } else {//只有2级联动数据，滑动第1项回调\n                        if (optionsSelectChangeListener != null) {\n                            optionsSelectChangeListener.onOptionsSelectChanged(index, opt2Select, 0);\n                        }\n                    }\n                }\n            }\n        };\n\n        wheelListener_option2 = new OnItemSelectedListener() {\n\n            @Override\n            public void onItemSelected(int index) {\n                if (mOptions3Items != null) {\n                    int opt1Select = wv_option1.getCurrentItem();\n                    opt1Select = opt1Select >= mOptions3Items.size() - 1 ? mOptions3Items.size() - 1 : opt1Select;\n                    index = index >= mOptions2Items.get(opt1Select).size() - 1 ? mOptions2Items.get(opt1Select).size() - 1 : index;\n                    int opt3 = 0;\n                    if (!isRestoreItem) {\n                        // wv_option3.getCurrentItem() 上一个opt3的选中位置\n                        //新opt3的位置，判断如果旧位置没有超过数据范围，则沿用旧位置，否则选中最后一项\n                        opt3 = wv_option3.getCurrentItem() >= mOptions3Items.get(opt1Select).get(index).size() - 1 ?\n                                mOptions3Items.get(opt1Select).get(index).size() - 1 : wv_option3.getCurrentItem();\n                    }\n                    wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(wv_option1.getCurrentItem()).get(index)));\n                    wv_option3.setCurrentItem(opt3);\n\n                    //3级联动数据实时回调\n                    if (optionsSelectChangeListener != null) {\n                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, opt3);\n                    }\n                } else {//只有2级联动数据，滑动第2项回调\n                    if (optionsSelectChangeListener != null) {\n                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, 0);\n                    }\n                }\n            }\n        };\n\n        // 添加联动监听\n        if (options1Items != null && linkage) {\n            wv_option1.setOnItemSelectedListener(wheelListener_option1);\n        }\n        if (options2Items != null && linkage) {\n            wv_option2.setOnItemSelectedListener(wheelListener_option2);\n        }\n        if (options3Items != null && linkage && optionsSelectChangeListener != null) {\n            wv_option3.setOnItemSelectedListener(new OnItemSelectedListener() {\n                @Override\n                public void onItemSelected(int index) {\n                    optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), wv_option2.getCurrentItem(), index);\n                }\n            });\n        }\n    }\n\n\n    //不联动情况下\n    public void setNPicker(List<T> options1Items, List<T> options2Items, List<T> options3Items) {\n\n        // 选项1\n        wv_option1.setAdapter(new ArrayWheelAdapter<>(options1Items));// 设置显示数据\n        wv_option1.setCurrentItem(0);// 初始化时显示的数据\n        // 选项2\n        if (options2Items != null) {\n            wv_option2.setAdapter(new ArrayWheelAdapter<>(options2Items));// 设置显示数据\n        }\n        wv_option2.setCurrentItem(wv_option2.getCurrentItem());// 初始化时显示的数据\n        // 选项3\n        if (options3Items != null) {\n            wv_option3.setAdapter(new ArrayWheelAdapter<>(options3Items));// 设置显示数据\n        }\n        wv_option3.setCurrentItem(wv_option3.getCurrentItem());\n        wv_option1.setIsOptions(true);\n        wv_option2.setIsOptions(true);\n        wv_option3.setIsOptions(true);\n\n        if (optionsSelectChangeListener != null) {\n            wv_option1.setOnItemSelectedListener(new OnItemSelectedListener() {\n                @Override\n                public void onItemSelected(int index) {\n                    optionsSelectChangeListener.onOptionsSelectChanged(index, wv_option2.getCurrentItem(), wv_option3.getCurrentItem());\n                }\n            });\n        }\n\n        if (options2Items == null) {\n            wv_option2.setVisibility(View.GONE);\n        } else {\n            wv_option2.setVisibility(View.VISIBLE);\n            if (optionsSelectChangeListener != null) {\n                wv_option2.setOnItemSelectedListener(new OnItemSelectedListener() {\n                    @Override\n                    public void onItemSelected(int index) {\n                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, wv_option3.getCurrentItem());\n                    }\n                });\n            }\n        }\n        if (options3Items == null) {\n            wv_option3.setVisibility(View.GONE);\n        } else {\n            wv_option3.setVisibility(View.VISIBLE);\n            if (optionsSelectChangeListener != null) {\n                wv_option3.setOnItemSelectedListener(new OnItemSelectedListener() {\n                    @Override\n                    public void onItemSelected(int index) {\n                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), wv_option2.getCurrentItem(), index);\n                    }\n                });\n            }\n        }\n    }\n\n    public void setTextContentSize(int textSize) {\n        wv_option1.setTextSize(textSize);\n        wv_option2.setTextSize(textSize);\n        wv_option3.setTextSize(textSize);\n    }\n\n    private void setLineSpacingMultiplier() {\n\n    }\n\n    /**\n     * 设置选项的单位\n     *\n     * @param label1 单位\n     * @param label2 单位\n     * @param label3 单位\n     */\n    public void setLabels(String label1, String label2, String label3) {\n        if (label1 != null) {\n            wv_option1.setLabel(label1);\n        }\n        if (label2 != null) {\n            wv_option2.setLabel(label2);\n        }\n        if (label3 != null) {\n            wv_option3.setLabel(label3);\n        }\n    }\n\n    /**\n     * 设置x轴偏移量\n     */\n    public void setTextXOffset(int x_offset_one, int x_offset_two, int x_offset_three) {\n        wv_option1.setTextXOffset(x_offset_one);\n        wv_option2.setTextXOffset(x_offset_two);\n        wv_option3.setTextXOffset(x_offset_three);\n    }\n\n    /**\n     * 设置是否循环滚动\n     *\n     * @param cyclic 是否循环\n     */\n    public void setCyclic(boolean cyclic) {\n        wv_option1.setCyclic(cyclic);\n        wv_option2.setCyclic(cyclic);\n        wv_option3.setCyclic(cyclic);\n    }\n\n    /**\n     * 设置字体样式\n     *\n     * @param font 系统提供的几种样式\n     */\n    public void setTypeface(Typeface font) {\n        wv_option1.setTypeface(font);\n        wv_option2.setTypeface(font);\n        wv_option3.setTypeface(font);\n    }\n\n    /**\n     * 分别设置第一二三级是否循环滚动\n     *\n     * @param cyclic1,cyclic2,cyclic3 是否循环\n     */\n    public void setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) {\n        wv_option1.setCyclic(cyclic1);\n        wv_option2.setCyclic(cyclic2);\n        wv_option3.setCyclic(cyclic3);\n    }\n\n    /**\n     * 返回当前选中的结果对应的位置数组 因为支持三级联动效果，分三个级别索引，0，1，2。\n     * 在快速滑动未停止时，点击确定按钮，会进行判断，如果匹配数据越界，则设为0，防止index出错导致崩溃。\n     *\n     * @return 索引数组\n     */\n    public int[] getCurrentItems() {\n        int[] currentItems = new int[3];\n        currentItems[0] = wv_option1.getCurrentItem();\n\n        if (mOptions2Items != null && mOptions2Items.size() > 0) {//非空判断\n            currentItems[1] = wv_option2.getCurrentItem() > (mOptions2Items.get(currentItems[0]).size() - 1) ? 0 : wv_option2.getCurrentItem();\n        } else {\n            currentItems[1] = wv_option2.getCurrentItem();\n        }\n\n        if (mOptions3Items != null && mOptions3Items.size() > 0) {//非空判断\n            currentItems[2] = wv_option3.getCurrentItem() > (mOptions3Items.get(currentItems[0]).get(currentItems[1]).size() - 1) ? 0 : wv_option3.getCurrentItem();\n        } else {\n            currentItems[2] = wv_option3.getCurrentItem();\n        }\n\n        return currentItems;\n    }\n\n    public void setCurrentItems(int option1, int option2, int option3) {\n        if (linkage) {\n            itemSelected(option1, option2, option3);\n        } else {\n            wv_option1.setCurrentItem(option1);\n            wv_option2.setCurrentItem(option2);\n            wv_option3.setCurrentItem(option3);\n        }\n    }\n\n    private void itemSelected(int opt1Select, int opt2Select, int opt3Select) {\n        if (mOptions1Items != null) {\n            wv_option1.setCurrentItem(opt1Select);\n        }\n        if (mOptions2Items != null) {\n            wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(opt1Select)));\n            wv_option2.setCurrentItem(opt2Select);\n        }\n        if (mOptions3Items != null) {\n            wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(opt1Select).get(opt2Select)));\n            wv_option3.setCurrentItem(opt3Select);\n        }\n    }\n\n    /**\n     * 设置间距倍数,但是只能在1.2-4.0f之间\n     *\n     * @param lineSpacingMultiplier\n     */\n    public void setLineSpacingMultiplier(float lineSpacingMultiplier) {\n        wv_option1.setLineSpacingMultiplier(lineSpacingMultiplier);\n        wv_option2.setLineSpacingMultiplier(lineSpacingMultiplier);\n        wv_option3.setLineSpacingMultiplier(lineSpacingMultiplier);\n    }\n\n    /**\n     * 设置分割线的颜色\n     *\n     * @param dividerColor\n     */\n    public void setDividerColor(int dividerColor) {\n        wv_option1.setDividerColor(dividerColor);\n        wv_option2.setDividerColor(dividerColor);\n        wv_option3.setDividerColor(dividerColor);\n    }\n\n    /**\n     * 设置分割线的类型\n     *\n     * @param dividerType\n     */\n    public void setDividerType(WheelView.DividerType dividerType) {\n        wv_option1.setDividerType(dividerType);\n        wv_option2.setDividerType(dividerType);\n        wv_option3.setDividerType(dividerType);\n    }\n\n    /**\n     * 设置分割线之间的文字的颜色\n     *\n     * @param textColorCenter\n     */\n    public void setTextColorCenter(int textColorCenter) {\n        wv_option1.setTextColorCenter(textColorCenter);\n        wv_option2.setTextColorCenter(textColorCenter);\n        wv_option3.setTextColorCenter(textColorCenter);\n    }\n\n    /**\n     * 设置分割线以外文字的颜色\n     *\n     * @param textColorOut\n     */\n    public void setTextColorOut(int textColorOut) {\n        wv_option1.setTextColorOut(textColorOut);\n        wv_option2.setTextColorOut(textColorOut);\n        wv_option3.setTextColorOut(textColorOut);\n    }\n\n    /**\n     * Label 是否只显示中间选中项的\n     *\n     * @param isCenterLabel\n     */\n    public void isCenterLabel(boolean isCenterLabel) {\n        wv_option1.isCenterLabel(isCenterLabel);\n        wv_option2.isCenterLabel(isCenterLabel);\n        wv_option3.isCenterLabel(isCenterLabel);\n    }\n\n    public void setOptionsSelectChangeListener(OnOptionsSelectChangeListener optionsSelectChangeListener) {\n        this.optionsSelectChangeListener = optionsSelectChangeListener;\n    }\n\n    public void setLinkage(boolean linkage) {\n        this.linkage = linkage;\n    }\n\n    /**\n     * 设置最大可见数目\n     *\n     * @param itemsVisible 建议设置为 3 ~ 9之间。\n     */\n    public void setItemsVisible(int itemsVisible) {\n        wv_option1.setItemsVisibleCount(itemsVisible);\n        wv_option2.setItemsVisibleCount(itemsVisible);\n        wv_option3.setItemsVisibleCount(itemsVisible);\n    }\n\n    public void setAlphaGradient(boolean isAlphaGradient) {\n        wv_option1.setAlphaGradient(isAlphaGradient);\n        wv_option2.setAlphaGradient(isAlphaGradient);\n        wv_option3.setAlphaGradient(isAlphaGradient);\n    }\n}\n"
  },
  {
    "path": "pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java",
    "content": "package com.bigkoo.pickerview.view;\n\nimport android.view.View;\n\nimport com.bigkoo.pickerview.R;\nimport com.bigkoo.pickerview.adapter.ArrayWheelAdapter;\nimport com.bigkoo.pickerview.adapter.NumericWheelAdapter;\nimport com.bigkoo.pickerview.listener.ISelectTimeCallback;\nimport com.bigkoo.pickerview.utils.ChinaDate;\nimport com.bigkoo.pickerview.utils.LunarCalendar;\nimport com.contrarywind.listener.OnItemSelectedListener;\nimport com.contrarywind.view.WheelView;\n\nimport java.text.DateFormat;\nimport java.text.SimpleDateFormat;\nimport java.util.Arrays;\nimport java.util.Calendar;\nimport java.util.List;\n\n\npublic class WheelTime {\n    public static DateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n    private View view;\n    private WheelView wv_year;\n    private WheelView wv_month;\n    private WheelView wv_day;\n    private WheelView wv_hours;\n    private WheelView wv_minutes;\n    private WheelView wv_seconds;\n    private int gravity;\n\n    private boolean[] type;\n    private static final int DEFAULT_START_YEAR = 1900;\n    private static final int DEFAULT_END_YEAR = 2100;\n    private static final int DEFAULT_START_MONTH = 1;\n    private static final int DEFAULT_END_MONTH = 12;\n    private static final int DEFAULT_START_DAY = 1;\n    private static final int DEFAULT_END_DAY = 31;\n\n    private int startYear = DEFAULT_START_YEAR;\n    private int endYear = DEFAULT_END_YEAR;\n    private int startMonth = DEFAULT_START_MONTH;\n    private int endMonth = DEFAULT_END_MONTH;\n    private int startDay = DEFAULT_START_DAY;\n    private int endDay = DEFAULT_END_DAY; //表示31天的\n    private int currentYear;\n\n    private int textSize;\n\n    private boolean isLunarCalendar = false;\n    private ISelectTimeCallback mSelectChangeCallback;\n\n    public WheelTime(View view, boolean[] type, int gravity, int textSize) {\n        super();\n        this.view = view;\n        this.type = type;\n        this.gravity = gravity;\n        this.textSize = textSize;\n    }\n\n    public void setLunarMode(boolean isLunarCalendar) {\n        this.isLunarCalendar = isLunarCalendar;\n    }\n\n    public boolean isLunarMode() {\n        return isLunarCalendar;\n    }\n\n    public void setPicker(int year, int month, int day) {\n        this.setPicker(year, month, day, 0, 0, 0);\n    }\n\n    public void setPicker(int year, final int month, int day, int h, int m, int s) {\n        if (isLunarCalendar) {\n            int[] lunar = LunarCalendar.solarToLunar(year, month + 1, day);\n            setLunar(lunar[0], lunar[1] - 1, lunar[2], lunar[3] == 1, h, m, s);\n        } else {\n            setSolar(year, month, day, h, m, s);\n        }\n    }\n\n    /**\n     * 设置农历\n     *\n     * @param year\n     * @param month\n     * @param day\n     * @param h\n     * @param m\n     * @param s\n     */\n    private void setLunar(int year, final int month, int day, boolean isLeap, int h, int m, int s) {\n        // 年\n        wv_year = (WheelView) view.findViewById(R.id.year);\n        wv_year.setAdapter(new ArrayWheelAdapter(ChinaDate.getYears(startYear, endYear)));// 设置\"年\"的显示数据\n        wv_year.setLabel(\"\");// 添加文字\n        wv_year.setCurrentItem(year - startYear);// 初始化时显示的数据\n        wv_year.setGravity(gravity);\n\n        // 月\n        wv_month = (WheelView) view.findViewById(R.id.month);\n        wv_month.setAdapter(new ArrayWheelAdapter(ChinaDate.getMonths(year)));\n        wv_month.setLabel(\"\");\n\n        int leapMonth = ChinaDate.leapMonth(year);\n        if (leapMonth != 0 && (month > leapMonth - 1 || isLeap)) { //选中月是闰月或大于闰月\n            wv_month.setCurrentItem(month + 1);\n        } else {\n            wv_month.setCurrentItem(month);\n        }\n\n        wv_month.setGravity(gravity);\n\n        // 日\n        wv_day = (WheelView) view.findViewById(R.id.day);\n        // 判断大小月及是否闰年,用来确定\"日\"的数据\n        if (ChinaDate.leapMonth(year) == 0) {\n            wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year, month))));\n        } else {\n            wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.leapDays(year))));\n        }\n        wv_day.setLabel(\"\");\n        wv_day.setCurrentItem(day - 1);\n        wv_day.setGravity(gravity);\n\n        wv_hours = (WheelView) view.findViewById(R.id.hour);\n        wv_hours.setAdapter(new NumericWheelAdapter(0, 23));\n        //wv_hours.setLabel(context.getString(R.string.pickerview_hours));// 添加文字\n        wv_hours.setCurrentItem(h);\n        wv_hours.setGravity(gravity);\n\n        wv_minutes = (WheelView) view.findViewById(R.id.min);\n        wv_minutes.setAdapter(new NumericWheelAdapter(0, 59));\n        //wv_minutes.setLabel(context.getString(R.string.pickerview_minutes));// 添加文字\n        wv_minutes.setCurrentItem(m);\n        wv_minutes.setGravity(gravity);\n\n        wv_seconds = (WheelView) view.findViewById(R.id.second);\n        wv_seconds.setAdapter(new NumericWheelAdapter(0, 59));\n        //wv_seconds.setLabel(context.getString(R.string.pickerview_minutes));// 添加文字\n        wv_seconds.setCurrentItem(m);\n        wv_seconds.setGravity(gravity);\n\n        // 添加\"年\"监听\n        wv_year.setOnItemSelectedListener(new OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(int index) {\n                int year_num = index + startYear;\n                // 判断是不是闰年,来确定月和日的选择\n                wv_month.setAdapter(new ArrayWheelAdapter(ChinaDate.getMonths(year_num)));\n                if (ChinaDate.leapMonth(year_num) != 0 && wv_month.getCurrentItem() > ChinaDate.leapMonth(year_num) - 1) {\n                    wv_month.setCurrentItem(wv_month.getCurrentItem() + 1);\n                } else {\n                    wv_month.setCurrentItem(wv_month.getCurrentItem());\n                }\n\n                int currentIndex = wv_day.getCurrentItem();\n                int maxItem = 29;\n                if (ChinaDate.leapMonth(year_num) != 0 && wv_month.getCurrentItem() > ChinaDate.leapMonth(year_num) - 1) {\n                    if (wv_month.getCurrentItem() == ChinaDate.leapMonth(year_num) + 1) {\n                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.leapDays(year_num))));\n                        maxItem = ChinaDate.leapDays(year_num);\n                    } else {\n                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, wv_month.getCurrentItem()))));\n                        maxItem = ChinaDate.monthDays(year_num, wv_month.getCurrentItem());\n                    }\n                } else {\n                    wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, wv_month.getCurrentItem() + 1))));\n                    maxItem = ChinaDate.monthDays(year_num, wv_month.getCurrentItem() + 1);\n                }\n\n                if (currentIndex > maxItem - 1) {\n                    wv_day.setCurrentItem(maxItem - 1);\n                }\n\n                if (mSelectChangeCallback != null) {\n                    mSelectChangeCallback.onTimeSelectChanged();\n                }\n            }\n        });\n\n        // 添加\"月\"监听\n        wv_month.setOnItemSelectedListener(new OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(int index) {\n                int month_num = index;\n                int year_num = wv_year.getCurrentItem() + startYear;\n                int currentIndex = wv_day.getCurrentItem();\n                int maxItem = 29;\n                if (ChinaDate.leapMonth(year_num) != 0 && month_num > ChinaDate.leapMonth(year_num) - 1) {\n                    if (wv_month.getCurrentItem() == ChinaDate.leapMonth(year_num) + 1) {\n                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.leapDays(year_num))));\n                        maxItem = ChinaDate.leapDays(year_num);\n                    } else {\n                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, month_num))));\n                        maxItem = ChinaDate.monthDays(year_num, month_num);\n                    }\n                } else {\n                    wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, month_num + 1))));\n                    maxItem = ChinaDate.monthDays(year_num, month_num + 1);\n                }\n\n                if (currentIndex > maxItem - 1) {\n                    wv_day.setCurrentItem(maxItem - 1);\n                }\n\n                if (mSelectChangeCallback != null) {\n                    mSelectChangeCallback.onTimeSelectChanged();\n                }\n            }\n        });\n\n        setChangedListener(wv_day);\n        setChangedListener(wv_hours);\n        setChangedListener(wv_minutes);\n        setChangedListener(wv_seconds);\n\n        if (type.length != 6) {\n            throw new RuntimeException(\"type[] length is not 6\");\n        }\n        wv_year.setVisibility(type[0] ? View.VISIBLE : View.GONE);\n        wv_month.setVisibility(type[1] ? View.VISIBLE : View.GONE);\n        wv_day.setVisibility(type[2] ? View.VISIBLE : View.GONE);\n        wv_hours.setVisibility(type[3] ? View.VISIBLE : View.GONE);\n        wv_minutes.setVisibility(type[4] ? View.VISIBLE : View.GONE);\n        wv_seconds.setVisibility(type[5] ? View.VISIBLE : View.GONE);\n        setContentTextSize();\n    }\n\n    /**\n     * 设置公历\n     *\n     * @param year\n     * @param month\n     * @param day\n     * @param h\n     * @param m\n     * @param s\n     */\n    private void setSolar(int year, final int month, int day, int h, int m, int s) {\n        // 添加大小月月份并将其转换为list,方便之后的判断\n        String[] months_big = {\"1\", \"3\", \"5\", \"7\", \"8\", \"10\", \"12\"};\n        String[] months_little = {\"4\", \"6\", \"9\", \"11\"};\n\n        final List<String> list_big = Arrays.asList(months_big);\n        final List<String> list_little = Arrays.asList(months_little);\n\n        currentYear = year;\n        // 年\n        wv_year = (WheelView) view.findViewById(R.id.year);\n        wv_year.setAdapter(new NumericWheelAdapter(startYear, endYear));// 设置\"年\"的显示数据\n\n\n        wv_year.setCurrentItem(year - startYear);// 初始化时显示的数据\n        wv_year.setGravity(gravity);\n        // 月\n        wv_month = (WheelView) view.findViewById(R.id.month);\n        if (startYear == endYear) {//开始年等于终止年\n            wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth));\n            wv_month.setCurrentItem(month + 1 - startMonth);\n        } else if (year == startYear) {\n            //起始日期的月份控制\n            wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12));\n            wv_month.setCurrentItem(month + 1 - startMonth);\n        } else if (year == endYear) {\n            //终止日期的月份控制\n            wv_month.setAdapter(new NumericWheelAdapter(1, endMonth));\n            wv_month.setCurrentItem(month);\n        } else {\n            wv_month.setAdapter(new NumericWheelAdapter(1, 12));\n            wv_month.setCurrentItem(month);\n        }\n        wv_month.setGravity(gravity);\n        // 日\n        wv_day = (WheelView) view.findViewById(R.id.day);\n\n        boolean leapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;\n        if (startYear == endYear && startMonth == endMonth) {\n            if (list_big.contains(String.valueOf(month + 1))) {\n                if (endDay > 31) {\n                    endDay = 31;\n                }\n                wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));\n            } else if (list_little.contains(String.valueOf(month + 1))) {\n                if (endDay > 30) {\n                    endDay = 30;\n                }\n                wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));\n            } else {\n                // 闰年\n                if (leapYear) {\n                    if (endDay > 29) {\n                        endDay = 29;\n                    }\n                    wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));\n                } else {\n                    if (endDay > 28) {\n                        endDay = 28;\n                    }\n                    wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));\n                }\n            }\n            wv_day.setCurrentItem(day - startDay);\n        } else if (year == startYear && month + 1 == startMonth) {\n            // 起始日期的天数控制\n            if (list_big.contains(String.valueOf(month + 1))) {\n\n                wv_day.setAdapter(new NumericWheelAdapter(startDay, 31));\n            } else if (list_little.contains(String.valueOf(month + 1))) {\n\n                wv_day.setAdapter(new NumericWheelAdapter(startDay, 30));\n            } else {\n                // 闰年 29，平年 28\n                wv_day.setAdapter(new NumericWheelAdapter(startDay, leapYear ? 29 : 28));\n            }\n            wv_day.setCurrentItem(day - startDay);\n        } else if (year == endYear && month + 1 == endMonth) {\n            // 终止日期的天数控制\n            if (list_big.contains(String.valueOf(month + 1))) {\n                if (endDay > 31) {\n                    endDay = 31;\n                }\n                wv_day.setAdapter(new NumericWheelAdapter(1, endDay));\n            } else if (list_little.contains(String.valueOf(month + 1))) {\n                if (endDay > 30) {\n                    endDay = 30;\n                }\n                wv_day.setAdapter(new NumericWheelAdapter(1, endDay));\n            } else {\n                // 闰年\n                if (leapYear) {\n                    if (endDay > 29) {\n                        endDay = 29;\n                    }\n                    wv_day.setAdapter(new NumericWheelAdapter(1, endDay));\n                } else {\n                    if (endDay > 28) {\n                        endDay = 28;\n                    }\n                    wv_day.setAdapter(new NumericWheelAdapter(1, endDay));\n                }\n            }\n            wv_day.setCurrentItem(day - 1);\n        } else {\n            // 判断大小月及是否闰年,用来确定\"日\"的数据\n            if (list_big.contains(String.valueOf(month + 1))) {\n                wv_day.setAdapter(new NumericWheelAdapter(1, 31));\n            } else if (list_little.contains(String.valueOf(month + 1))) {\n                wv_day.setAdapter(new NumericWheelAdapter(1, 30));\n            } else {\n                // 闰年 29，平年 28\n                wv_day.setAdapter(new NumericWheelAdapter(startDay, leapYear ? 29 : 28));\n            }\n            wv_day.setCurrentItem(day - 1);\n        }\n\n        wv_day.setGravity(gravity);\n        //时\n        wv_hours = (WheelView) view.findViewById(R.id.hour);\n        wv_hours.setAdapter(new NumericWheelAdapter(0, 23));\n\n        wv_hours.setCurrentItem(h);\n        wv_hours.setGravity(gravity);\n        //分\n        wv_minutes = (WheelView) view.findViewById(R.id.min);\n        wv_minutes.setAdapter(new NumericWheelAdapter(0, 59));\n\n        wv_minutes.setCurrentItem(m);\n        wv_minutes.setGravity(gravity);\n        //秒\n        wv_seconds = (WheelView) view.findViewById(R.id.second);\n        wv_seconds.setAdapter(new NumericWheelAdapter(0, 59));\n\n        wv_seconds.setCurrentItem(s);\n        wv_seconds.setGravity(gravity);\n\n        // 添加\"年\"监听\n        wv_year.setOnItemSelectedListener(new OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(int index) {\n                int year_num = index + startYear;\n                currentYear = year_num;\n                int currentMonthItem = wv_month.getCurrentItem();//记录上一次的item位置\n                // 判断大小月及是否闰年,用来确定\"日\"的数据\n                if (startYear == endYear) {\n                    //重新设置月份\n                    wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth));\n\n                    if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {\n                        currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;\n                        wv_month.setCurrentItem(currentMonthItem);\n                    }\n\n                    int monthNum = currentMonthItem + startMonth;\n\n                    if (startMonth == endMonth) {\n                        //重新设置日\n                        setReDay(year_num, monthNum, startDay, endDay, list_big, list_little);\n                    } else if (monthNum == startMonth) {\n                        //重新设置日\n                        setReDay(year_num, monthNum, startDay, 31, list_big, list_little);\n                    } else if (monthNum == endMonth) {\n                        setReDay(year_num, monthNum, 1, endDay, list_big, list_little);\n                    } else {//重新设置日\n                        setReDay(year_num, monthNum, 1, 31, list_big, list_little);\n                    }\n                } else if (year_num == startYear) {//等于开始的年\n                    //重新设置月份\n                    wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12));\n\n                    if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {\n                        currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;\n                        wv_month.setCurrentItem(currentMonthItem);\n                    }\n\n                    int month = currentMonthItem + startMonth;\n                    if (month == startMonth) {\n                        //重新设置日\n                        setReDay(year_num, month, startDay, 31, list_big, list_little);\n                    } else {\n                        //重新设置日\n                        setReDay(year_num, month, 1, 31, list_big, list_little);\n                    }\n\n                } else if (year_num == endYear) {\n                    //重新设置月份\n                    wv_month.setAdapter(new NumericWheelAdapter(1, endMonth));\n                    if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {\n                        currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;\n                        wv_month.setCurrentItem(currentMonthItem);\n                    }\n                    int monthNum = currentMonthItem + 1;\n\n                    if (monthNum == endMonth) {\n                        //重新设置日\n                        setReDay(year_num, monthNum, 1, endDay, list_big, list_little);\n                    } else {\n                        //重新设置日\n                        setReDay(year_num, monthNum, 1, 31, list_big, list_little);\n                    }\n\n                } else {\n                    //重新设置月份\n                    wv_month.setAdapter(new NumericWheelAdapter(1, 12));\n                    //重新设置日\n                    setReDay(year_num, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little);\n                }\n\n                if (mSelectChangeCallback != null) {\n                    mSelectChangeCallback.onTimeSelectChanged();\n                }\n            }\n        });\n\n\n        // 添加\"月\"监听\n        wv_month.setOnItemSelectedListener(new OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(int index) {\n                int month_num = index + 1;\n\n                if (startYear == endYear) {\n                    month_num = month_num + startMonth - 1;\n                    if (startMonth == endMonth) {\n                        //重新设置日\n                        setReDay(currentYear, month_num, startDay, endDay, list_big, list_little);\n                    } else if (startMonth == month_num) {\n\n                        //重新设置日\n                        setReDay(currentYear, month_num, startDay, 31, list_big, list_little);\n                    } else if (endMonth == month_num) {\n                        setReDay(currentYear, month_num, 1, endDay, list_big, list_little);\n                    } else {\n                        setReDay(currentYear, month_num, 1, 31, list_big, list_little);\n                    }\n                } else if (currentYear == startYear) {\n                    month_num = month_num + startMonth - 1;\n                    if (month_num == startMonth) {\n                        //重新设置日\n                        setReDay(currentYear, month_num, startDay, 31, list_big, list_little);\n                    } else {\n                        //重新设置日\n                        setReDay(currentYear, month_num, 1, 31, list_big, list_little);\n                    }\n\n                } else if (currentYear == endYear) {\n                    if (month_num == endMonth) {\n                        //重新设置日\n                        setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, endDay, list_big, list_little);\n                    } else {\n                        setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little);\n                    }\n\n                } else {\n                    //重新设置日\n                    setReDay(currentYear, month_num, 1, 31, list_big, list_little);\n                }\n\n                if (mSelectChangeCallback != null) {\n                    mSelectChangeCallback.onTimeSelectChanged();\n                }\n            }\n        });\n\n        setChangedListener(wv_day);\n        setChangedListener(wv_hours);\n        setChangedListener(wv_minutes);\n        setChangedListener(wv_seconds);\n\n        if (type.length != 6) {\n            throw new IllegalArgumentException(\"type[] length is not 6\");\n        }\n        wv_year.setVisibility(type[0] ? View.VISIBLE : View.GONE);\n        wv_month.setVisibility(type[1] ? View.VISIBLE : View.GONE);\n        wv_day.setVisibility(type[2] ? View.VISIBLE : View.GONE);\n        wv_hours.setVisibility(type[3] ? View.VISIBLE : View.GONE);\n        wv_minutes.setVisibility(type[4] ? View.VISIBLE : View.GONE);\n        wv_seconds.setVisibility(type[5] ? View.VISIBLE : View.GONE);\n        setContentTextSize();\n    }\n\n    private void setChangedListener(WheelView wheelView) {\n        if (mSelectChangeCallback != null) {\n            wheelView.setOnItemSelectedListener(new OnItemSelectedListener() {\n                @Override\n                public void onItemSelected(int index) {\n                    mSelectChangeCallback.onTimeSelectChanged();\n                }\n            });\n        }\n\n    }\n\n\n    private void setReDay(int year_num, int monthNum, int startD, int endD, List<String> list_big, List<String> list_little) {\n        int currentItem = wv_day.getCurrentItem();\n\n//        int maxItem;\n        if (list_big.contains(String.valueOf(monthNum))) {\n            if (endD > 31) {\n                endD = 31;\n            }\n            wv_day.setAdapter(new NumericWheelAdapter(startD, endD));\n//            maxItem = endD;\n        } else if (list_little.contains(String.valueOf(monthNum))) {\n            if (endD > 30) {\n                endD = 30;\n            }\n            wv_day.setAdapter(new NumericWheelAdapter(startD, endD));\n//            maxItem = endD;\n        } else {\n            if ((year_num % 4 == 0 && year_num % 100 != 0)\n                    || year_num % 400 == 0) {\n                if (endD > 29) {\n                    endD = 29;\n                }\n                wv_day.setAdapter(new NumericWheelAdapter(startD, endD));\n//                maxItem = endD;\n            } else {\n                if (endD > 28) {\n                    endD = 28;\n                }\n                wv_day.setAdapter(new NumericWheelAdapter(startD, endD));\n//                maxItem = endD;\n            }\n        }\n\n        if (currentItem > wv_day.getAdapter().getItemsCount() - 1) {\n            currentItem = wv_day.getAdapter().getItemsCount() - 1;\n            wv_day.setCurrentItem(currentItem);\n        }\n    }\n\n\n    private void setContentTextSize() {\n        wv_day.setTextSize(textSize);\n        wv_month.setTextSize(textSize);\n        wv_year.setTextSize(textSize);\n        wv_hours.setTextSize(textSize);\n        wv_minutes.setTextSize(textSize);\n        wv_seconds.setTextSize(textSize);\n    }\n\n\n    public void setLabels(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) {\n        if (isLunarCalendar) {\n            return;\n        }\n\n        if (label_year != null) {\n            wv_year.setLabel(label_year);\n        } else {\n            wv_year.setLabel(view.getContext().getString(R.string.pickerview_year));\n        }\n        if (label_month != null) {\n            wv_month.setLabel(label_month);\n        } else {\n            wv_month.setLabel(view.getContext().getString(R.string.pickerview_month));\n        }\n        if (label_day != null) {\n            wv_day.setLabel(label_day);\n        } else {\n            wv_day.setLabel(view.getContext().getString(R.string.pickerview_day));\n        }\n        if (label_hours != null) {\n            wv_hours.setLabel(label_hours);\n        } else {\n            wv_hours.setLabel(view.getContext().getString(R.string.pickerview_hours));\n        }\n        if (label_mins != null) {\n            wv_minutes.setLabel(label_mins);\n        } else {\n            wv_minutes.setLabel(view.getContext().getString(R.string.pickerview_minutes));\n        }\n        if (label_seconds != null) {\n            wv_seconds.setLabel(label_seconds);\n        } else {\n            wv_seconds.setLabel(view.getContext().getString(R.string.pickerview_seconds));\n        }\n\n    }\n\n    public void setTextXOffset(int x_offset_year, int x_offset_month, int x_offset_day,\n                               int x_offset_hours, int x_offset_minutes, int x_offset_seconds) {\n        wv_year.setTextXOffset(x_offset_year);\n        wv_month.setTextXOffset(x_offset_month);\n        wv_day.setTextXOffset(x_offset_day);\n        wv_hours.setTextXOffset(x_offset_hours);\n        wv_minutes.setTextXOffset(x_offset_minutes);\n        wv_seconds.setTextXOffset(x_offset_seconds);\n    }\n\n    /**\n     * 设置是否循环滚动\n     *\n     * @param cyclic\n     */\n    public void setCyclic(boolean cyclic) {\n        wv_year.setCyclic(cyclic);\n        wv_month.setCyclic(cyclic);\n        wv_day.setCyclic(cyclic);\n        wv_hours.setCyclic(cyclic);\n        wv_minutes.setCyclic(cyclic);\n        wv_seconds.setCyclic(cyclic);\n    }\n\n    public String getTime() {\n        if (isLunarCalendar) {\n            //如果是农历 返回对应的公历时间\n            return getLunarTime();\n        }\n        StringBuilder sb = new StringBuilder();\n        if (currentYear == startYear) {\n           /* int i = wv_month.getCurrentItem() + startMonth;\n            System.out.println(\"i:\" + i);*/\n            if ((wv_month.getCurrentItem() + startMonth) == startMonth) {\n                sb.append((wv_year.getCurrentItem() + startYear)).append(\"-\")\n                        .append((wv_month.getCurrentItem() + startMonth)).append(\"-\")\n                        .append((wv_day.getCurrentItem() + startDay)).append(\" \")\n                        .append(wv_hours.getCurrentItem()).append(\":\")\n                        .append(wv_minutes.getCurrentItem()).append(\":\")\n                        .append(wv_seconds.getCurrentItem());\n            } else {\n                sb.append((wv_year.getCurrentItem() + startYear)).append(\"-\")\n                        .append((wv_month.getCurrentItem() + startMonth)).append(\"-\")\n                        .append((wv_day.getCurrentItem() + 1)).append(\" \")\n                        .append(wv_hours.getCurrentItem()).append(\":\")\n                        .append(wv_minutes.getCurrentItem()).append(\":\")\n                        .append(wv_seconds.getCurrentItem());\n            }\n\n        } else {\n            sb.append((wv_year.getCurrentItem() + startYear)).append(\"-\")\n                    .append((wv_month.getCurrentItem() + 1)).append(\"-\")\n                    .append((wv_day.getCurrentItem() + 1)).append(\" \")\n                    .append(wv_hours.getCurrentItem()).append(\":\")\n                    .append(wv_minutes.getCurrentItem()).append(\":\")\n                    .append(wv_seconds.getCurrentItem());\n        }\n\n        return sb.toString();\n    }\n\n\n    /**\n     * 农历返回对应的公历时间\n     *\n     * @return\n     */\n    private String getLunarTime() {\n        StringBuilder sb = new StringBuilder();\n        int year = wv_year.getCurrentItem() + startYear;\n        int month = 1;\n        boolean isLeapMonth = false;\n        if (ChinaDate.leapMonth(year) == 0) {\n            month = wv_month.getCurrentItem() + 1;\n        } else {\n            if ((wv_month.getCurrentItem() + 1) - ChinaDate.leapMonth(year) <= 0) {\n                month = wv_month.getCurrentItem() + 1;\n            } else if ((wv_month.getCurrentItem() + 1) - ChinaDate.leapMonth(year) == 1) {\n                month = wv_month.getCurrentItem();\n                isLeapMonth = true;\n            } else {\n                month = wv_month.getCurrentItem();\n            }\n        }\n        int day = wv_day.getCurrentItem() + 1;\n        int[] solar = LunarCalendar.lunarToSolar(year, month, day, isLeapMonth);\n\n        sb.append(solar[0]).append(\"-\")\n                .append(solar[1]).append(\"-\")\n                .append(solar[2]).append(\" \")\n                .append(wv_hours.getCurrentItem()).append(\":\")\n                .append(wv_minutes.getCurrentItem()).append(\":\")\n                .append(wv_seconds.getCurrentItem());\n        return sb.toString();\n    }\n\n    public View getView() {\n        return view;\n    }\n\n    public int getStartYear() {\n        return startYear;\n    }\n\n    public void setStartYear(int startYear) {\n        this.startYear = startYear;\n    }\n\n    public int getEndYear() {\n        return endYear;\n    }\n\n    public void setEndYear(int endYear) {\n        this.endYear = endYear;\n    }\n\n\n    public void setRangDate(Calendar startDate, Calendar endDate) {\n\n        if (startDate == null && endDate != null) {\n            int year = endDate.get(Calendar.YEAR);\n            int month = endDate.get(Calendar.MONTH) + 1;\n            int day = endDate.get(Calendar.DAY_OF_MONTH);\n            if (year > startYear) {\n                this.endYear = year;\n                this.endMonth = month;\n                this.endDay = day;\n            } else if (year == startYear) {\n                if (month > startMonth) {\n                    this.endYear = year;\n                    this.endMonth = month;\n                    this.endDay = day;\n                } else if (month == startMonth) {\n                    if (day > startDay) {\n                        this.endYear = year;\n                        this.endMonth = month;\n                        this.endDay = day;\n                    }\n                }\n            }\n\n        } else if (startDate != null && endDate == null) {\n            int year = startDate.get(Calendar.YEAR);\n            int month = startDate.get(Calendar.MONTH) + 1;\n            int day = startDate.get(Calendar.DAY_OF_MONTH);\n            if (year < endYear) {\n                this.startMonth = month;\n                this.startDay = day;\n                this.startYear = year;\n            } else if (year == endYear) {\n                if (month < endMonth) {\n                    this.startMonth = month;\n                    this.startDay = day;\n                    this.startYear = year;\n                } else if (month == endMonth) {\n                    if (day < endDay) {\n                        this.startMonth = month;\n                        this.startDay = day;\n                        this.startYear = year;\n                    }\n                }\n            }\n\n        } else if (startDate != null && endDate != null) {\n            this.startYear = startDate.get(Calendar.YEAR);\n            this.endYear = endDate.get(Calendar.YEAR);\n            this.startMonth = startDate.get(Calendar.MONTH) + 1;\n            this.endMonth = endDate.get(Calendar.MONTH) + 1;\n            this.startDay = startDate.get(Calendar.DAY_OF_MONTH);\n            this.endDay = endDate.get(Calendar.DAY_OF_MONTH);\n        }\n\n    }\n\n    /**\n     * 设置间距倍数,但是只能在1.0-4.0f之间\n     *\n     * @param lineSpacingMultiplier\n     */\n    public void setLineSpacingMultiplier(float lineSpacingMultiplier) {\n        wv_day.setLineSpacingMultiplier(lineSpacingMultiplier);\n        wv_month.setLineSpacingMultiplier(lineSpacingMultiplier);\n        wv_year.setLineSpacingMultiplier(lineSpacingMultiplier);\n        wv_hours.setLineSpacingMultiplier(lineSpacingMultiplier);\n        wv_minutes.setLineSpacingMultiplier(lineSpacingMultiplier);\n        wv_seconds.setLineSpacingMultiplier(lineSpacingMultiplier);\n    }\n\n    /**\n     * 设置分割线的颜色\n     *\n     * @param dividerColor\n     */\n    public void setDividerColor(int dividerColor) {\n        wv_day.setDividerColor(dividerColor);\n        wv_month.setDividerColor(dividerColor);\n        wv_year.setDividerColor(dividerColor);\n        wv_hours.setDividerColor(dividerColor);\n        wv_minutes.setDividerColor(dividerColor);\n        wv_seconds.setDividerColor(dividerColor);\n    }\n\n    /**\n     * 设置分割线的类型\n     *\n     * @param dividerType\n     */\n    public void setDividerType(WheelView.DividerType dividerType) {\n        wv_day.setDividerType(dividerType);\n        wv_month.setDividerType(dividerType);\n        wv_year.setDividerType(dividerType);\n        wv_hours.setDividerType(dividerType);\n        wv_minutes.setDividerType(dividerType);\n        wv_seconds.setDividerType(dividerType);\n    }\n\n    /**\n     * 设置分割线之间的文字的颜色\n     *\n     * @param textColorCenter\n     */\n    public void setTextColorCenter(int textColorCenter) {\n        wv_day.setTextColorCenter(textColorCenter);\n        wv_month.setTextColorCenter(textColorCenter);\n        wv_year.setTextColorCenter(textColorCenter);\n        wv_hours.setTextColorCenter(textColorCenter);\n        wv_minutes.setTextColorCenter(textColorCenter);\n        wv_seconds.setTextColorCenter(textColorCenter);\n    }\n\n    /**\n     * 设置分割线以外文字的颜色\n     *\n     * @param textColorOut\n     */\n    public void setTextColorOut(int textColorOut) {\n        wv_day.setTextColorOut(textColorOut);\n        wv_month.setTextColorOut(textColorOut);\n        wv_year.setTextColorOut(textColorOut);\n        wv_hours.setTextColorOut(textColorOut);\n        wv_minutes.setTextColorOut(textColorOut);\n        wv_seconds.setTextColorOut(textColorOut);\n    }\n\n    /**\n     * @param isCenterLabel 是否只显示中间选中项的\n     */\n    public void isCenterLabel(boolean isCenterLabel) {\n        wv_day.isCenterLabel(isCenterLabel);\n        wv_month.isCenterLabel(isCenterLabel);\n        wv_year.isCenterLabel(isCenterLabel);\n        wv_hours.isCenterLabel(isCenterLabel);\n        wv_minutes.isCenterLabel(isCenterLabel);\n        wv_seconds.isCenterLabel(isCenterLabel);\n    }\n\n    public void setSelectChangeCallback(ISelectTimeCallback mSelectChangeCallback) {\n        this.mSelectChangeCallback = mSelectChangeCallback;\n    }\n\n    public void setItemsVisible(int itemsVisibleCount) {\n        wv_day.setItemsVisibleCount(itemsVisibleCount);\n        wv_month.setItemsVisibleCount(itemsVisibleCount);\n        wv_year.setItemsVisibleCount(itemsVisibleCount);\n        wv_hours.setItemsVisibleCount(itemsVisibleCount);\n        wv_minutes.setItemsVisibleCount(itemsVisibleCount);\n        wv_seconds.setItemsVisibleCount(itemsVisibleCount);\n    }\n\n    public void setAlphaGradient(boolean isAlphaGradient) {\n        wv_day.setAlphaGradient(isAlphaGradient);\n        wv_month.setAlphaGradient(isAlphaGradient);\n        wv_year.setAlphaGradient(isAlphaGradient);\n        wv_hours.setAlphaGradient(isAlphaGradient);\n        wv_minutes.setAlphaGradient(isAlphaGradient);\n        wv_seconds.setAlphaGradient(isAlphaGradient);\n    }\n}\n"
  },
  {
    "path": "pickerview/src/main/res/anim/pickerview_dialog_scale_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\n  <alpha\n      android:duration=\"@integer/animation_default_duration\"\n      android:fromAlpha=\"0.0\"\n      android:toAlpha=\"1.0\" />\n\n  <scale\n      android:duration=\"@integer/animation_default_duration\"\n      android:fromXScale=\"0.0\"\n      android:toXScale=\"1.0\"\n      android:fromYScale=\"0.0\"\n      android:toYScale=\"1.0\"\n      android:pivotX=\"50%\"\n      android:pivotY=\"50%\"/>\n\n</set>"
  },
  {
    "path": "pickerview/src/main/res/anim/pickerview_dialog_scale_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\n  <alpha\n      android:duration=\"@integer/animation_default_duration\"\n      android:fromAlpha=\"1.0\"\n      android:toAlpha=\"0.3\" />\n\n  <scale\n      android:duration=\"@integer/animation_default_duration\"\n      android:fromXScale=\"1.0\"\n      android:toXScale=\"0.0\"\n      android:fromYScale=\"1.0\"\n      android:toYScale=\"0.0\"\n      android:pivotX=\"50%\"\n      android:pivotY=\"50%\"/>\n</set>"
  },
  {
    "path": "pickerview/src/main/res/anim/pickerview_slide_in_bottom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:shareInterpolator=\"false\">\n\n  <translate\n      android:duration=\"@integer/animation_default_duration\"\n      android:fromXDelta=\"0%\"\n      android:toXDelta=\"0%\"\n      android:fromYDelta=\"100%\"\n      android:toYDelta=\"0%\"/>\n</set>"
  },
  {
    "path": "pickerview/src/main/res/anim/pickerview_slide_out_bottom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:shareInterpolator=\"false\">\n\n  <translate\n      android:duration=\"@integer/animation_default_duration\"\n      android:fromXDelta=\"0%\"\n      android:toXDelta=\"0%\"\n      android:fromYDelta=\"0%\"\n      android:toYDelta=\"100%\"/>\n</set>"
  },
  {
    "path": "pickerview/src/main/res/drawable/selector_pickerview_btn.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector\n  xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_pressed=\"true\" android:color=\"@color/pickerview_timebtn_pre\" />\n    <item android:color=\"@color/pickerview_timebtn_nor\" />\n</selector>\n"
  },
  {
    "path": "pickerview/src/main/res/layout/include_pickerview_topbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/rv_topbar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/pickerview_bg_topbar\">\n\n    <Button\n        android:id=\"@+id/btnCancel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@android:color/transparent\"\n        android:gravity=\"left|center_vertical\"\n        android:paddingLeft=\"@dimen/pickerview_topbar_padding\"\n        android:text=\"@string/pickerview_cancel\"\n        android:textAllCaps=\"false\"\n        android:textColor=\"@drawable/selector_pickerview_btn\"\n        android:textSize=\"@dimen/pickerview_topbar_btn_textsize\" />\n\n    <TextView\n        android:id=\"@+id/tvTitle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toLeftOf=\"@+id/btnSubmit\"\n        android:layout_toRightOf=\"@+id/btnCancel\"\n        android:gravity=\"center\"\n        android:textColor=\"@color/pickerview_topbar_title\"\n        android:textSize=\"@dimen/pickerview_topbar_title_textsize\" />\n\n    <Button\n        android:id=\"@id/btnSubmit\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentRight=\"true\"\n        android:background=\"@android:color/transparent\"\n        android:gravity=\"right|center_vertical\"\n        android:paddingRight=\"@dimen/pickerview_topbar_padding\"\n        android:text=\"@string/pickerview_submit\"\n        android:textAllCaps=\"false\"\n        android:textColor=\"@drawable/selector_pickerview_btn\"\n        android:textSize=\"@dimen/pickerview_topbar_btn_textsize\" />\n</RelativeLayout>\n"
  },
  {
    "path": "pickerview/src/main/res/layout/layout_basepickerview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    android:id=\"@+id/outmost_container\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clickable=\"true\"\n    android:background=\"@color/pickerview_bgColor_overlay\">\n\n    <FrameLayout\n        android:id=\"@+id/content_container\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\">\n    </FrameLayout>\n\n</FrameLayout>"
  },
  {
    "path": "pickerview/src/main/res/layout/pickerview_options.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <include\n        layout=\"@layout/include_pickerview_topbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/pickerview_topbar_height\" />\n\n    <LinearLayout\n        android:id=\"@+id/optionspicker\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@android:color/white\"\n        android:gravity=\"center\"\n        android:minHeight=\"180dp\"\n        android:orientation=\"horizontal\">\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/options1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/options2\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/options3\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n    </LinearLayout>\n\n\n</LinearLayout>"
  },
  {
    "path": "pickerview/src/main/res/layout/pickerview_time.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <include\n        layout=\"@layout/include_pickerview_topbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/pickerview_topbar_height\" />\n\n    <LinearLayout\n        android:id=\"@+id/timepicker\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@android:color/white\"\n        android:gravity=\"center\"\n        android:minHeight=\"150dp\"\n        android:orientation=\"horizontal\">\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/year\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"0.96\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/month\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/day\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/hour\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/min\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n\n        <com.contrarywind.view.WheelView\n            android:id=\"@+id/second\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\" />\n    </LinearLayout>\n\n\n</LinearLayout>"
  },
  {
    "path": "pickerview/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- 顶部按钮栏高度 -->\n    <dimen name=\"pickerview_topbar_height\">44dp</dimen>\n\n    <!-- 顶部按钮padding -->\n    <dimen name=\"pickerview_topbar_padding\">20dp</dimen>\n\n    <!-- 顶部按钮文字大小 -->\n    <dimen name=\"pickerview_topbar_btn_textsize\">17sp</dimen>\n    <dimen name=\"pickerview_topbar_title_textsize\">18sp</dimen>\n    <!-- 选项文字大小 -->\n    <dimen name=\"pickerview_textsize\">20sp</dimen>\n</resources>\n"
  },
  {
    "path": "pickerview/src/main/res/values/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <integer name=\"animation_default_duration\">300</integer>\n</resources>"
  },
  {
    "path": "pickerview/src/main/res/values/strings.xml",
    "content": "<resources>\n\n    <string name=\"pickerview_cancel\">取消</string>\n    <string name=\"pickerview_submit\">确定</string>\n    <string name=\"pickerview_year\">年</string>\n    <string name=\"pickerview_month\">月</string>\n    <string name=\"pickerview_day\">日</string>\n    <string name=\"pickerview_hours\">时</string>\n    <string name=\"pickerview_minutes\">分</string>\n    <string name=\"pickerview_seconds\">秒</string>\n</resources>\n"
  },
  {
    "path": "pickerview/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"custom_dialog2\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowFrame\">@null</item>\n        <!-- Dialog的windowFrame框为无 -->\n        <item name=\"android:windowIsFloating\">true</item>\n        <!-- 是否漂现在activity上 -->\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <!-- 是否半透明 -->\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:background\">@null</item>\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:windowContentOverlay\">@null</item>\n        <!-- 去除黑色边框的关键设置项 -->\n        <item name=\"android:backgroundDimEnabled\">true</item>\n        <!-- 屏幕背景是否变暗 -->\n        <item name=\"android:backgroundDimAmount\">0.3</item>\n    </style>\n\n    <style name=\"picker_view_scale_anim\" mce_bogus=\"1\" parent=\"android:Animation\">\n        <item name=\"android:windowEnterAnimation\">@anim/pickerview_dialog_scale_in</item>\n        <item name=\"android:windowExitAnimation\">@anim/pickerview_dialog_scale_out</item>\n    </style>\n\n\n    <style name=\"picker_view_slide_anim\" mce_bogus=\"1\" parent=\"android:Animation\">\n        <item name=\"android:windowEnterAnimation\">@anim/pickerview_slide_in_bottom</item>\n        <item name=\"android:windowExitAnimation\">@anim/pickerview_slide_out_bottom</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "pickerview/src/main/res/values-en/strings.xml",
    "content": "<resources>\n\n    <string name=\"pickerview_cancel\">Cancel</string>\n    <string name=\"pickerview_submit\">Confirm</string>\n    <string name=\"pickerview_year\"> </string>\n    <string name=\"pickerview_month\"> </string>\n    <string name=\"pickerview_day\"> </string>\n    <string name=\"pickerview_hours\"> </string>\n    <string name=\"pickerview_minutes\"> </string>\n    <string name=\"pickerview_seconds\"> </string>\n</resources>\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app', ':pickerview', ':wheelview'\n"
  },
  {
    "path": "wheelview/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "wheelview/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'com.github.dcendents.android-maven'\n//apply plugin: 'com.novoda.bintray-release'//添加插件\n\n\n\nandroid {\n    compileSdkVersion 26\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 26\n        versionCode 31\n        versionName \"4.1.0\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    lintOptions {\n        abortOnError false\n    }\n}\n\n//allprojects {\n//    tasks.withType(Javadoc) {//兼容中文字符\n//        options{\n//            encoding \"UTF-8\"\n//            charSet 'UTF-8'\n//            links \"http://docs.oracle.com/javase/7/docs/api\"\n//        }\n//    }\n//}\n//publish {\n//    userOrg = 'contrarywind'//bintray.com 用户名/组织名 user/org name\n//    groupId = 'com.contrarywind'//JCenter上显示的路径 path\n//    artifactId = 'wheelview'//项目名称 project name\n//    publishVersion = '4.1.0'//版本号 version code\n//    desc = 'this is a wheelview for android'//项目描述 description\n//    website = 'https://github.com/Bigkoo/Android-PickerView' //项目网址链接 link\n//}\n\ndependencies {\n//    compile fileTree(include: ['*.jar'], dir: 'libs')\n    implementation 'com.android.support:support-annotations:28.0.0'\n}"
  },
  {
    "path": "wheelview/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in C:\\Users\\song\\AppData\\Local\\Android\\sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "wheelview/src/androidTest/java/test/wheelview/ExampleInstrumentedTest.java",
    "content": "package test.wheelview;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport android.support.test.runner.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumentation test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() throws Exception {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getTargetContext();\n\n        assertEquals(\"test.wheelview.test\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "wheelview/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.contrarywind.view\">\n\n</manifest>\n"
  },
  {
    "path": "wheelview/src/main/java/com/contrarywind/adapter/WheelAdapter.java",
    "content": "package com.contrarywind.adapter;\n\n\npublic interface WheelAdapter<T> {\n\t/**\n\t * Gets items count\n\t * @return the count of wheel items\n\t */\n\tint getItemsCount();\n\t\n\t/**\n\t * Gets a wheel item by index.\n\t * @param index the item index\n\t * @return the wheel item text or null\n\t */\n\tT getItem(int index);\n\t\n\t/**\n\t * Gets maximum item length. It is used to determine the wheel width.\n\t * If -1 is returned there will be used the default wheel width.\n\t * @param o  the item object\n\t * @return the maximum item length or -1\n     */\n\tint indexOf(T o);\n}\n"
  },
  {
    "path": "wheelview/src/main/java/com/contrarywind/interfaces/IPickerViewData.java",
    "content": "package com.contrarywind.interfaces;\n\n/**\n * Created by Sai on 2016/7/13.\n */\npublic interface IPickerViewData {\n    String getPickerViewText();\n}\n"
  },
  {
    "path": "wheelview/src/main/java/com/contrarywind/listener/LoopViewGestureListener.java",
    "content": "package com.contrarywind.listener;\n\nimport android.view.MotionEvent;\n\nimport com.contrarywind.view.WheelView;\n\n\n/**\n * 手势监听\n */\npublic final class LoopViewGestureListener extends android.view.GestureDetector.SimpleOnGestureListener {\n\n    private final WheelView wheelView;\n\n\n    public LoopViewGestureListener(WheelView wheelView) {\n        this.wheelView = wheelView;\n    }\n\n    @Override\n    public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {\n        wheelView.scrollBy(velocityY);\n        return true;\n    }\n}\n"
  },
  {
    "path": "wheelview/src/main/java/com/contrarywind/listener/OnItemSelectedListener.java",
    "content": "package com.contrarywind.listener;\n\n\npublic interface OnItemSelectedListener {\n    void onItemSelected(int index);\n}\n"
  },
  {
    "path": "wheelview/src/main/java/com/contrarywind/timer/InertiaTimerTask.java",
    "content": "package com.contrarywind.timer;\n\nimport com.contrarywind.view.WheelView;\n\nimport java.util.TimerTask;\n\n/**\n * 滚动惯性的实现\n *\n * @author 小嵩\n * date:  2017-12-23 23:20:44\n */\npublic final class InertiaTimerTask extends TimerTask {\n\n    private float mCurrentVelocityY; //当前滑动速度\n    private final float mFirstVelocityY;//手指离开屏幕时的初始速度\n    private final WheelView mWheelView;\n\n    /**\n     * @param wheelView 滚轮对象\n     * @param velocityY Y轴滑行速度\n     */\n    public InertiaTimerTask(WheelView wheelView, float velocityY) {\n        super();\n        this.mWheelView = wheelView;\n        this.mFirstVelocityY = velocityY;\n        mCurrentVelocityY = Integer.MAX_VALUE;\n    }\n\n    @Override\n    public final void run() {\n\n        //防止闪动，对速度做一个限制。\n        if (mCurrentVelocityY == Integer.MAX_VALUE) {\n            if (Math.abs(mFirstVelocityY) > 2000F) {\n                mCurrentVelocityY = mFirstVelocityY > 0 ? 2000F : -2000F;\n            } else {\n                mCurrentVelocityY = mFirstVelocityY;\n            }\n        }\n\n        //发送handler消息 处理平顺停止滚动逻辑\n        if (Math.abs(mCurrentVelocityY) >= 0.0F && Math.abs(mCurrentVelocityY) <= 20F) {\n            mWheelView.cancelFuture();\n            mWheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_SMOOTH_SCROLL);\n            return;\n        }\n\n        int dy = (int) (mCurrentVelocityY / 100F);\n        mWheelView.setTotalScrollY(mWheelView.getTotalScrollY() - dy);\n        if (!mWheelView.isLoop()) {\n            float itemHeight = mWheelView.getItemHeight();\n            float top = (-mWheelView.getInitPosition()) * itemHeight;\n            float bottom = (mWheelView.getItemsCount() - 1 - mWheelView.getInitPosition()) * itemHeight;\n            if (mWheelView.getTotalScrollY() - itemHeight * 0.25 < top) {\n                top = mWheelView.getTotalScrollY() + dy;\n            } else if (mWheelView.getTotalScrollY() + itemHeight * 0.25 > bottom) {\n                bottom = mWheelView.getTotalScrollY() + dy;\n            }\n\n            if (mWheelView.getTotalScrollY() <= top) {\n                mCurrentVelocityY = 40F;\n                mWheelView.setTotalScrollY((int) top);\n            } else if (mWheelView.getTotalScrollY() >= bottom) {\n                mWheelView.setTotalScrollY((int) bottom);\n                mCurrentVelocityY = -40F;\n            }\n        }\n\n        if (mCurrentVelocityY < 0.0F) {\n            mCurrentVelocityY = mCurrentVelocityY + 20F;\n        } else {\n            mCurrentVelocityY = mCurrentVelocityY - 20F;\n        }\n\n        //刷新UI\n        mWheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW);\n    }\n}\n"
  },
  {
    "path": "wheelview/src/main/java/com/contrarywind/timer/MessageHandler.java",
    "content": "package com.contrarywind.timer;\n\nimport android.os.Handler;\nimport android.os.Message;\n\nimport com.contrarywind.view.WheelView;\n\n/**\n * Handler 消息类\n *\n * @author 小嵩\n * date: 2017-12-23 23:20:44\n */\npublic final class MessageHandler extends Handler {\n    public static final int WHAT_INVALIDATE_LOOP_VIEW = 1000;\n    public static final int WHAT_SMOOTH_SCROLL = 2000;\n    public static final int WHAT_ITEM_SELECTED = 3000;\n\n    private final WheelView wheelView;\n\n    public MessageHandler(WheelView wheelView) {\n        this.wheelView = wheelView;\n    }\n\n    @Override\n    public final void handleMessage(Message msg) {\n        switch (msg.what) {\n            case WHAT_INVALIDATE_LOOP_VIEW:\n                wheelView.invalidate();\n                break;\n\n            case WHAT_SMOOTH_SCROLL:\n                wheelView.smoothScroll(WheelView.ACTION.FLING);\n                break;\n\n            case WHAT_ITEM_SELECTED:\n                wheelView.onItemSelected();\n                break;\n        }\n    }\n\n}\n"
  },
  {
    "path": "wheelview/src/main/java/com/contrarywind/timer/SmoothScrollTimerTask.java",
    "content": "package com.contrarywind.timer;\n\nimport com.contrarywind.view.WheelView;\n\nimport java.util.TimerTask;\n\n/**\n * 平滑滚动的实现\n *\n * @author 小嵩\n */\npublic final class SmoothScrollTimerTask extends TimerTask {\n\n    private int realTotalOffset;\n    private int realOffset;\n    private int offset;\n    private final WheelView wheelView;\n\n    public SmoothScrollTimerTask(WheelView wheelView, int offset) {\n        this.wheelView = wheelView;\n        this.offset = offset;\n        realTotalOffset = Integer.MAX_VALUE;\n        realOffset = 0;\n    }\n\n    @Override\n    public final void run() {\n        if (realTotalOffset == Integer.MAX_VALUE) {\n            realTotalOffset = offset;\n        }\n        //把要滚动的范围细分成10小份，按10小份单位来重绘\n        realOffset = (int) ((float) realTotalOffset * 0.1F);\n\n        if (realOffset == 0) {\n            if (realTotalOffset < 0) {\n                realOffset = -1;\n            } else {\n                realOffset = 1;\n            }\n        }\n\n        if (Math.abs(realTotalOffset) <= 1) {\n            wheelView.cancelFuture();\n            wheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED);\n        } else {\n            wheelView.setTotalScrollY(wheelView.getTotalScrollY() + realOffset);\n\n            //这里如果不是循环模式，则点击空白位置需要回滚，不然就会出现选到－1 item的 情况\n            if (!wheelView.isLoop()) {\n                float itemHeight = wheelView.getItemHeight();\n                float top = (float) (-wheelView.getInitPosition()) * itemHeight;\n                float bottom = (float) (wheelView.getItemsCount() - 1 - wheelView.getInitPosition()) * itemHeight;\n                if (wheelView.getTotalScrollY() <= top || wheelView.getTotalScrollY() >= bottom) {\n                    wheelView.setTotalScrollY(wheelView.getTotalScrollY() - realOffset);\n                    wheelView.cancelFuture();\n                    wheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED);\n                    return;\n                }\n            }\n            wheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW);\n            realTotalOffset = realTotalOffset - realOffset;\n        }\n    }\n}\n"
  },
  {
    "path": "wheelview/src/main/java/com/contrarywind/view/WheelView.java",
    "content": "package com.contrarywind.view;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Rect;\nimport android.graphics.Typeface;\nimport android.os.Handler;\nimport android.text.TextUtils;\nimport android.util.AttributeSet;\nimport android.util.DisplayMetrics;\nimport android.util.Log;\nimport android.view.GestureDetector;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.view.View;\n\nimport com.contrarywind.adapter.WheelAdapter;\nimport com.contrarywind.interfaces.IPickerViewData;\nimport com.contrarywind.listener.LoopViewGestureListener;\nimport com.contrarywind.listener.OnItemSelectedListener;\nimport com.contrarywind.timer.InertiaTimerTask;\nimport com.contrarywind.timer.MessageHandler;\nimport com.contrarywind.timer.SmoothScrollTimerTask;\n\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.ScheduledFuture;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * 3d滚轮控件\n */\npublic class WheelView extends View {\n\n    public enum ACTION { // 点击，滑翔(滑到尽头)，拖拽事件\n        CLICK, FLING, DAGGLE\n    }\n\n    public enum DividerType { // 分隔线类型\n        FILL, WRAP, CIRCLE\n    }\n\n    private static final String[] TIME_NUM = {\"00\", \"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\"};\n\n    private DividerType dividerType;//分隔线类型\n\n    private Context context;\n    private Handler handler;\n    private GestureDetector gestureDetector;\n    private OnItemSelectedListener onItemSelectedListener;\n\n    private boolean isOptions = false;\n    private boolean isCenterLabel = true;\n\n    // Timer mTimer;\n    private ScheduledExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();\n    private ScheduledFuture<?> mFuture;\n\n    private Paint paintOuterText;\n    private Paint paintCenterText;\n    private Paint paintIndicator;\n\n    private WheelAdapter adapter;\n\n    private String label;//附加单位\n    private int textSize;//选项的文字大小\n    private int maxTextWidth;\n    private int maxTextHeight;\n    private int textXOffset;\n    private float itemHeight;//每行高度\n\n\n    private Typeface typeface = Typeface.MONOSPACE;//字体样式，默认是等宽字体\n    private int textColorOut;\n    private int textColorCenter;\n    private int dividerColor;\n    private int dividerWidth;\n\n    // 条目间距倍数\n    private float lineSpacingMultiplier = 1.6F;\n    private boolean isLoop;\n\n    // 第一条线Y坐标值\n    private float firstLineY;\n    //第二条线Y坐标\n    private float secondLineY;\n    //中间label绘制的Y坐标\n    private float centerY;\n\n    //当前滚动总高度y值\n    private float totalScrollY;\n\n    //初始化默认选中项\n    private int initPosition;\n\n    //选中的Item是第几个\n    private int selectedItem;\n    private int preCurrentIndex;\n\n    // 绘制几个条目，实际上第一项和最后一项Y轴压缩成0%了，所以可见的数目实际为9\n    private int itemsVisible = 11;\n\n    private int measuredHeight;// WheelView 控件高度\n    private int measuredWidth;// WheelView 控件宽度\n\n    // 半径\n    private int radius;\n\n    private int mOffset = 0;\n    private float previousY = 0;\n    private long startTime = 0;\n\n    // 修改这个值可以改变滑行速度\n    private static final int VELOCITY_FLING = 5;\n    private int widthMeasureSpec;\n\n    private int mGravity = Gravity.CENTER;\n    private int drawCenterContentStart = 0;//中间选中文字开始绘制位置\n    private int drawOutContentStart = 0;//非中间文字开始绘制位置\n    private static final float SCALE_CONTENT = 0.8F;//非中间文字则用此控制高度，压扁形成3d错觉\n    private float CENTER_CONTENT_OFFSET;//偏移量\n\n    private boolean isAlphaGradient = false; //透明度渐变\n\n    public WheelView(Context context) {\n        this(context, null);\n    }\n\n    public WheelView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        textSize = getResources().getDimensionPixelSize(R.dimen.pickerview_textsize);//默认大小\n\n        DisplayMetrics dm = getResources().getDisplayMetrics();\n        float density = dm.density; // 屏幕密度比（0.75/1.0/1.5/2.0/3.0）\n\n        if (density < 1) {//根据密度不同进行适配\n            CENTER_CONTENT_OFFSET = 2.4F;\n        } else if (1 <= density && density < 2) {\n            CENTER_CONTENT_OFFSET = 4.0F;\n        } else if (2 <= density && density < 3) {\n            CENTER_CONTENT_OFFSET = 6.0F;\n        } else if (density >= 3) {\n            CENTER_CONTENT_OFFSET = density * 2.5F;\n        }\n\n        if (attrs != null) {\n            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.pickerview, 0, 0);\n            mGravity = a.getInt(R.styleable.pickerview_wheelview_gravity, Gravity.CENTER);\n            textColorOut = a.getColor(R.styleable.pickerview_wheelview_textColorOut, 0xFFa8a8a8);\n            textColorCenter = a.getColor(R.styleable.pickerview_wheelview_textColorCenter, 0xFF2a2a2a);\n            dividerColor = a.getColor(R.styleable.pickerview_wheelview_dividerColor, 0xFFd5d5d5);\n            dividerWidth = a.getDimensionPixelSize(R.styleable.pickerview_wheelview_dividerWidth, 2);\n            textSize = a.getDimensionPixelOffset(R.styleable.pickerview_wheelview_textSize, textSize);\n            lineSpacingMultiplier = a.getFloat(R.styleable.pickerview_wheelview_lineSpacingMultiplier, lineSpacingMultiplier);\n            a.recycle();//回收内存\n        }\n\n        judgeLineSpace();\n        initLoopView(context);\n    }\n\n    /**\n     * 判断间距是否在1.0-4.0之间\n     */\n    private void judgeLineSpace() {\n        if (lineSpacingMultiplier < 1.0f) {\n            lineSpacingMultiplier = 1.0f;\n        } else if (lineSpacingMultiplier > 4.0f) {\n            lineSpacingMultiplier = 4.0f;\n        }\n    }\n\n    private void initLoopView(Context context) {\n        this.context = context;\n        handler = new MessageHandler(this);\n        gestureDetector = new GestureDetector(context, new LoopViewGestureListener(this));\n        gestureDetector.setIsLongpressEnabled(false);\n        isLoop = true;\n\n        totalScrollY = 0;\n        initPosition = -1;\n        initPaints();\n    }\n\n    private void initPaints() {\n        paintOuterText = new Paint();\n        paintOuterText.setColor(textColorOut);\n        paintOuterText.setAntiAlias(true);\n        paintOuterText.setTypeface(typeface);\n        paintOuterText.setTextSize(textSize);\n\n        paintCenterText = new Paint();\n        paintCenterText.setColor(textColorCenter);\n        paintCenterText.setAntiAlias(true);\n        paintCenterText.setTextScaleX(1.1F);\n        paintCenterText.setTypeface(typeface);\n        paintCenterText.setTextSize(textSize);\n\n        paintIndicator = new Paint();\n        paintIndicator.setColor(dividerColor);\n        paintIndicator.setAntiAlias(true);\n\n        setLayerType(LAYER_TYPE_SOFTWARE, null);\n    }\n\n    private void reMeasure() {//重新测量\n        if (adapter == null) {\n            return;\n        }\n\n        measureTextWidthHeight();\n\n        //半圆的周长 = item高度乘以item数目-1\n        int halfCircumference = (int) (itemHeight * (itemsVisible - 1));\n        //整个圆的周长除以PI得到直径，这个直径用作控件的总高度\n        measuredHeight = (int) ((halfCircumference * 2) / Math.PI);\n        //求出半径\n        radius = (int) (halfCircumference / Math.PI);\n        //控件宽度，这里支持weight\n        measuredWidth = MeasureSpec.getSize(widthMeasureSpec);\n        //计算两条横线 和 选中项画笔的基线Y位置\n        firstLineY = (measuredHeight - itemHeight) / 2.0F;\n        secondLineY = (measuredHeight + itemHeight) / 2.0F;\n        centerY = secondLineY - (itemHeight - maxTextHeight) / 2.0f - CENTER_CONTENT_OFFSET;\n\n        //初始化显示的item的position\n        if (initPosition == -1) {\n            if (isLoop) {\n                initPosition = (adapter.getItemsCount() + 1) / 2;\n            } else {\n                initPosition = 0;\n            }\n        }\n        preCurrentIndex = initPosition;\n    }\n\n    /**\n     * 计算最大length的Text的宽高度\n     */\n    private void measureTextWidthHeight() {\n        Rect rect = new Rect();\n        for (int i = 0; i < adapter.getItemsCount(); i++) {\n            String s1 = getContentText(adapter.getItem(i));\n            paintCenterText.getTextBounds(s1, 0, s1.length(), rect);\n\n            int textWidth = rect.width();\n            if (textWidth > maxTextWidth) {\n                maxTextWidth = textWidth;\n            }\n        }\n        paintCenterText.getTextBounds(\"\\u661F\\u671F\", 0, 2, rect); // 星期的字符编码（以它为标准高度）\n        maxTextHeight = rect.height() + 2;\n        itemHeight = lineSpacingMultiplier * maxTextHeight;\n    }\n\n    public void smoothScroll(ACTION action) {//平滑滚动的实现\n        cancelFuture();\n        if (action == ACTION.FLING || action == ACTION.DAGGLE) {\n            mOffset = (int) ((totalScrollY % itemHeight + itemHeight) % itemHeight);\n            if ((float) mOffset > itemHeight / 2.0F) {//如果超过Item高度的一半，滚动到下一个Item去\n                mOffset = (int) (itemHeight - (float) mOffset);\n            } else {\n                mOffset = -mOffset;\n            }\n        }\n        //停止的时候，位置有偏移，不是全部都能正确停止到中间位置的，这里把文字位置挪回中间去\n        mFuture = mExecutor.scheduleWithFixedDelay(new SmoothScrollTimerTask(this, mOffset), 0, 10, TimeUnit.MILLISECONDS);\n    }\n\n    public final void scrollBy(float velocityY) {//滚动惯性的实现\n        cancelFuture();\n        mFuture = mExecutor.scheduleWithFixedDelay(new InertiaTimerTask(this, velocityY), 0, VELOCITY_FLING, TimeUnit.MILLISECONDS);\n    }\n\n    public void cancelFuture() {\n        if (mFuture != null && !mFuture.isCancelled()) {\n            mFuture.cancel(true);\n            mFuture = null;\n        }\n    }\n\n    /**\n     * 设置是否循环滚动\n     *\n     * @param cyclic 是否循环\n     */\n    public final void setCyclic(boolean cyclic) {\n        isLoop = cyclic;\n    }\n\n    public final void setTypeface(Typeface font) {\n        typeface = font;\n        paintOuterText.setTypeface(typeface);\n        paintCenterText.setTypeface(typeface);\n    }\n\n    public final void setTextSize(float size) {\n        if (size > 0.0F) {\n            textSize = (int) (context.getResources().getDisplayMetrics().density * size);\n            paintOuterText.setTextSize(textSize);\n            paintCenterText.setTextSize(textSize);\n        }\n    }\n\n    public final void setCurrentItem(int currentItem) {\n        //不添加这句,当这个wheelView不可见时,默认都是0,会导致获取到的时间错误\n        this.selectedItem = currentItem;\n        this.initPosition = currentItem;\n        totalScrollY = 0;//回归顶部，不然重设setCurrentItem的话位置会偏移的，就会显示出不对位置的数据\n        invalidate();\n    }\n\n    public final void setOnItemSelectedListener(OnItemSelectedListener OnItemSelectedListener) {\n        this.onItemSelectedListener = OnItemSelectedListener;\n    }\n\n    public final void setAdapter(WheelAdapter adapter) {\n        this.adapter = adapter;\n        reMeasure();\n        invalidate();\n    }\n\n    public void setItemsVisibleCount(int visibleCount) {\n        if (visibleCount % 2 == 0) {\n            visibleCount += 1;\n        }\n        this.itemsVisible = visibleCount + 2; //第一条和最后一条\n    }\n\n    public void setAlphaGradient(boolean alphaGradient) {\n        isAlphaGradient = alphaGradient;\n    }\n\n    public final WheelAdapter getAdapter() {\n        return adapter;\n    }\n\n    public final int getCurrentItem() {\n        // return selectedItem;\n        if (adapter == null) {\n            return 0;\n        }\n        if (isLoop && (selectedItem < 0 || selectedItem >= adapter.getItemsCount())) {\n            return Math.max(0, Math.min(Math.abs(Math.abs(selectedItem) - adapter.getItemsCount()), adapter.getItemsCount() - 1));\n        }\n        return Math.max(0, Math.min(selectedItem, adapter.getItemsCount() - 1));\n    }\n\n    public final void onItemSelected() {\n        if (onItemSelectedListener != null) {\n            postDelayed(new Runnable() {\n                @Override\n                public void run() {\n                    onItemSelectedListener.onItemSelected(getCurrentItem());\n                }\n            }, 200L);\n        }\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        if (adapter == null) {\n            return;\n        }\n        //initPosition越界会造成preCurrentIndex的值不正确\n        initPosition = Math.min(Math.max(0, initPosition), adapter.getItemsCount() - 1);\n\n        //滚动的Y值高度除去每行Item的高度，得到滚动了多少个item，即change数\n        //滚动偏移值,用于记录滚动了多少个item\n        int change = (int) (totalScrollY / itemHeight);\n        // Log.d(\"change\", \"\" + change);\n\n        try {\n            //滚动中实际的预选中的item(即经过了中间位置的item) ＝ 滑动前的位置 ＋ 滑动相对位置\n            preCurrentIndex = initPosition + change % adapter.getItemsCount();\n\n        } catch (ArithmeticException e) {\n            Log.e(\"WheelView\", \"出错了！adapter.getItemsCount() == 0，联动数据不匹配\");\n        }\n        if (!isLoop) {//不循环的情况\n            if (preCurrentIndex < 0) {\n                preCurrentIndex = 0;\n            }\n            if (preCurrentIndex > adapter.getItemsCount() - 1) {\n                preCurrentIndex = adapter.getItemsCount() - 1;\n            }\n        } else {//循环\n            if (preCurrentIndex < 0) {//举个例子：如果总数是5，preCurrentIndex ＝ －1，那么preCurrentIndex按循环来说，其实是0的上面，也就是4的位置\n                preCurrentIndex = adapter.getItemsCount() + preCurrentIndex;\n            }\n            if (preCurrentIndex > adapter.getItemsCount() - 1) {//同理上面,自己脑补一下\n                preCurrentIndex = preCurrentIndex - adapter.getItemsCount();\n            }\n        }\n        //跟滚动流畅度有关，总滑动距离与每个item高度取余，即并不是一格格的滚动，每个item不一定滚到对应Rect里的，这个item对应格子的偏移值\n        float itemHeightOffset = (totalScrollY % itemHeight);\n\n\n        //绘制中间两条横线\n        if (dividerType == DividerType.WRAP) {//横线长度仅包裹内容\n            float startX;\n            float endX;\n\n            if (TextUtils.isEmpty(label)) {//隐藏Label的情况\n                startX = (measuredWidth - maxTextWidth) / 2 - 12;\n            } else {\n                startX = (measuredWidth - maxTextWidth) / 4 - 12;\n            }\n\n            if (startX <= 0) {//如果超过了WheelView的边缘\n                startX = 10;\n            }\n            endX = measuredWidth - startX;\n            canvas.drawLine(startX, firstLineY, endX, firstLineY, paintIndicator);\n            canvas.drawLine(startX, secondLineY, endX, secondLineY, paintIndicator);\n        } else if (dividerType == DividerType.CIRCLE) {\n            //分割线为圆圈形状\n            paintIndicator.setStyle(Paint.Style.STROKE);\n            paintIndicator.setStrokeWidth(dividerWidth);\n            float startX;\n            float endX;\n            if (TextUtils.isEmpty(label)) {//隐藏Label的情况\n                startX = (measuredWidth - maxTextWidth) / 2f - 12;\n            } else {\n                startX = (measuredWidth - maxTextWidth) / 4f - 12;\n            }\n            if (startX <= 0) {//如果超过了WheelView的边缘\n                startX = 10;\n            }\n            endX = measuredWidth - startX;\n            //半径始终以宽高中最大的来算\n            float radius = Math.max((endX - startX), itemHeight) / 1.8f;\n            canvas.drawCircle(measuredWidth / 2f, measuredHeight / 2f, radius, paintIndicator);\n        } else {\n            canvas.drawLine(0.0F, firstLineY, measuredWidth, firstLineY, paintIndicator);\n            canvas.drawLine(0.0F, secondLineY, measuredWidth, secondLineY, paintIndicator);\n        }\n\n        //只显示选中项Label文字的模式，并且Label文字不为空，则进行绘制\n        if (!TextUtils.isEmpty(label) && isCenterLabel) {\n            //绘制文字，靠右并留出空隙\n            int drawRightContentStart = measuredWidth - getTextWidth(paintCenterText, label);\n            canvas.drawText(label, drawRightContentStart - CENTER_CONTENT_OFFSET, centerY, paintCenterText);\n        }\n\n        // 设置数组中每个元素的值\n        int counter = 0;\n        while (counter < itemsVisible) {\n            Object showText;\n            int index = preCurrentIndex - (itemsVisible / 2 - counter);//索引值，即当前在控件中间的item看作数据源的中间，计算出相对源数据源的index值\n\n            //判断是否循环，如果是循环数据源也使用相对循环的position获取对应的item值，如果不是循环则超出数据源范围使用\"\"空白字符串填充，在界面上形成空白无数据的item项\n            if (isLoop) {\n                index = getLoopMappingIndex(index);\n                showText = adapter.getItem(index);\n            } else if (index < 0) {\n                showText = \"\";\n            } else if (index > adapter.getItemsCount() - 1) {\n                showText = \"\";\n            } else {\n                showText = adapter.getItem(index);\n            }\n\n            canvas.save();\n            // 弧长 L = itemHeight * counter - itemHeightOffset\n            // 求弧度 α = L / r  (弧长/半径) [0,π]\n            double radian = ((itemHeight * counter - itemHeightOffset)) / radius;\n            // 弧度转换成角度(把半圆以Y轴为轴心向右转90度，使其处于第一象限及第四象限\n            // angle [-90°,90°]\n            float angle = (float) (90D - (radian / Math.PI) * 180D);//item第一项,从90度开始，逐渐递减到 -90度\n\n            // 计算取值可能有细微偏差，保证负90°到90°以外的不绘制\n            if (angle > 90F || angle < -90F) {\n                canvas.restore();\n            } else {\n                //获取内容文字\n                String contentText;\n\n                //如果是label每项都显示的模式，并且item内容不为空、label 也不为空\n                if (!isCenterLabel && !TextUtils.isEmpty(label) && !TextUtils.isEmpty(getContentText(showText))) {\n                    contentText = getContentText(showText) + label;\n                } else {\n                    contentText = getContentText(showText);\n                }\n                // 根据当前角度计算出偏差系数，用以在绘制时控制文字的 水平移动 透明度 倾斜程度.\n                float offsetCoefficient = (float) Math.pow(Math.abs(angle) / 90f, 2.2);\n\n                reMeasureTextSize(contentText);\n                //计算开始绘制的位置\n                measuredCenterContentStart(contentText);\n                measuredOutContentStart(contentText);\n                float translateY = (float) (radius - Math.cos(radian) * radius - (Math.sin(radian) * maxTextHeight) / 2D);\n                //根据Math.sin(radian)来更改canvas坐标系原点，然后缩放画布，使得文字高度进行缩放，形成弧形3d视觉差\n                canvas.translate(0.0F, translateY);\n                if (translateY <= firstLineY && maxTextHeight + translateY >= firstLineY) {\n                    // 条目经过第一条线\n                    canvas.save();\n                    canvas.clipRect(0, 0, measuredWidth, firstLineY - translateY);\n                    canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);\n                    setOutPaintStyle(offsetCoefficient, angle);\n                    canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText);\n                    canvas.restore();\n                    canvas.save();\n                    canvas.clipRect(0, firstLineY - translateY, measuredWidth, (int) (itemHeight));\n                    canvas.scale(1.0F, (float) Math.sin(radian) * 1.0F);\n                    canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTER_CONTENT_OFFSET, paintCenterText);\n                    canvas.restore();\n                } else if (translateY <= secondLineY && maxTextHeight + translateY >= secondLineY) {\n                    // 条目经过第二条线\n                    canvas.save();\n                    canvas.clipRect(0, 0, measuredWidth, secondLineY - translateY);\n                    canvas.scale(1.0F, (float) Math.sin(radian) * 1.0F);\n                    canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTER_CONTENT_OFFSET, paintCenterText);\n                    canvas.restore();\n                    canvas.save();\n                    canvas.clipRect(0, secondLineY - translateY, measuredWidth, (int) (itemHeight));\n                    canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);\n                    setOutPaintStyle(offsetCoefficient, angle);\n                    canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText);\n                    canvas.restore();\n                } else if (translateY >= firstLineY && maxTextHeight + translateY <= secondLineY) {\n                    // 中间条目\n                    // canvas.clipRect(0, 0, measuredWidth, maxTextHeight);\n                    //让文字居中\n                    float Y = maxTextHeight - CENTER_CONTENT_OFFSET;//因为圆弧角换算的向下取值，导致角度稍微有点偏差，加上画笔的基线会偏上，因此需要偏移量修正一下\n                    canvas.drawText(contentText, drawCenterContentStart, Y, paintCenterText);\n                    //设置选中项\n                    selectedItem = preCurrentIndex - (itemsVisible / 2 - counter);\n                } else {\n                    // 其他条目\n                    canvas.save();\n                    canvas.clipRect(0, 0, measuredWidth, (int) (itemHeight));\n                    canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);\n                    setOutPaintStyle(offsetCoefficient, angle);\n                    // 控制文字水平偏移距离\n                    canvas.drawText(contentText, drawOutContentStart + textXOffset * offsetCoefficient, maxTextHeight, paintOuterText);\n                    canvas.restore();\n                }\n                canvas.restore();\n                paintCenterText.setTextSize(textSize);\n            }\n            counter++;\n        }\n    }\n\n    //设置文字倾斜角度，透明度\n    private void setOutPaintStyle(float offsetCoefficient, float angle) {\n        // 控制文字倾斜角度\n        float DEFAULT_TEXT_TARGET_SKEW_X = 0.5f;\n        int multiplier = 0;\n        if (textXOffset > 0) {\n            multiplier = 1;\n        } else if (textXOffset < 0) {\n            multiplier = -1;\n        }\n        paintOuterText.setTextSkewX(multiplier * (angle > 0 ? -1 : 1) * DEFAULT_TEXT_TARGET_SKEW_X * offsetCoefficient);\n\n        // 控制透明度\n        int alpha = isAlphaGradient ? (int) ((90F - Math.abs(angle)) / 90f * 255) : 255;\n        // Log.d(\"WheelView\", \"alpha:\" + alpha);\n        paintOuterText.setAlpha(alpha);\n    }\n\n    /**\n     * reset the size of the text Let it can fully display\n     *\n     * @param contentText item text content.\n     */\n    private void reMeasureTextSize(String contentText) {\n        Rect rect = new Rect();\n        paintCenterText.getTextBounds(contentText, 0, contentText.length(), rect);\n        int width = rect.width();\n        int size = textSize;\n        while (width > measuredWidth) {\n            size--;\n            //设置2条横线中间的文字大小\n            paintCenterText.setTextSize(size);\n            paintCenterText.getTextBounds(contentText, 0, contentText.length(), rect);\n            width = rect.width();\n        }\n        //设置2条横线外面的文字大小\n        paintOuterText.setTextSize(size);\n    }\n\n\n    //递归计算出对应的index\n    private int getLoopMappingIndex(int index) {\n        if (index < 0) {\n            index = index + adapter.getItemsCount();\n            index = getLoopMappingIndex(index);\n        } else if (index > adapter.getItemsCount() - 1) {\n            index = index - adapter.getItemsCount();\n            index = getLoopMappingIndex(index);\n        }\n        return index;\n    }\n\n    /**\n     * 获取所显示的数据源\n     *\n     * @param item data resource\n     * @return 对应显示的字符串\n     */\n    private String getContentText(Object item) {\n        if (item == null) {\n            return \"\";\n        } else if (item instanceof IPickerViewData) {\n            return ((IPickerViewData) item).getPickerViewText();\n        } else if (item instanceof Integer) {\n            //如果为整形则最少保留两位数.\n            return getFixNum((int) item);\n        }\n        return item.toString();\n    }\n\n    private String getFixNum(int timeNum) {\n        return timeNum >= 0 && timeNum < 10 ? TIME_NUM[timeNum] : String.valueOf(timeNum);\n    }\n\n    private void measuredCenterContentStart(String content) {\n        Rect rect = new Rect();\n        paintCenterText.getTextBounds(content, 0, content.length(), rect);\n        switch (mGravity) {\n            case Gravity.CENTER://显示内容居中\n                if (isOptions || label == null || label.equals(\"\") || !isCenterLabel) {\n                    drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.5);\n                } else {//只显示中间label时，时间选择器内容偏左一点，留出空间绘制单位标签\n                    drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.25);\n                }\n                break;\n            case Gravity.LEFT:\n                drawCenterContentStart = 0;\n                break;\n            case Gravity.RIGHT://添加偏移量\n                drawCenterContentStart = measuredWidth - rect.width() - (int) CENTER_CONTENT_OFFSET;\n                break;\n        }\n    }\n\n    private void measuredOutContentStart(String content) {\n        Rect rect = new Rect();\n        paintOuterText.getTextBounds(content, 0, content.length(), rect);\n        switch (mGravity) {\n            case Gravity.CENTER:\n                if (isOptions || label == null || label.equals(\"\") || !isCenterLabel) {\n                    drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.5);\n                } else {//只显示中间label时，时间选择器内容偏左一点，留出空间绘制单位标签\n                    drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.25);\n                }\n                break;\n            case Gravity.LEFT:\n                drawOutContentStart = 0;\n                break;\n            case Gravity.RIGHT:\n                drawOutContentStart = measuredWidth - rect.width() - (int) CENTER_CONTENT_OFFSET;\n                break;\n        }\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        this.widthMeasureSpec = widthMeasureSpec;\n        reMeasure();\n        setMeasuredDimension(measuredWidth, measuredHeight);\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        boolean eventConsumed = gestureDetector.onTouchEvent(event);\n        boolean isIgnore = false;//超过边界滑动时，不再绘制UI。\n\n        float top = -initPosition * itemHeight;\n        float bottom = (adapter.getItemsCount() - 1 - initPosition) * itemHeight;\n        float ratio = 0.25f;\n\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                startTime = System.currentTimeMillis();\n                cancelFuture();\n                previousY = event.getRawY();\n                break;\n\n            case MotionEvent.ACTION_MOVE:\n                float dy = previousY - event.getRawY();\n                previousY = event.getRawY();\n                totalScrollY = totalScrollY + dy;\n\n                // normal mode。\n                if (!isLoop) {\n                    if ((totalScrollY - itemHeight * ratio < top && dy < 0)\n                            || (totalScrollY + itemHeight * ratio > bottom && dy > 0)) {\n                        //快滑动到边界了，设置已滑动到边界的标志\n                        totalScrollY -= dy;\n                        isIgnore = true;\n                    } else {\n                        isIgnore = false;\n                    }\n                }\n                break;\n\n            case MotionEvent.ACTION_UP:\n            default:\n                if (!eventConsumed) {//未消费掉事件\n\n                    /**\n                     *@describe <关于弧长的计算>\n                     *\n                     * 弧长公式： L = α*R\n                     * 反余弦公式：arccos(cosα) = α\n                     * 由于之前是有顺时针偏移90度，\n                     * 所以实际弧度范围α2的值 ：α2 = π/2-α    （α=[0,π] α2 = [-π/2,π/2]）\n                     * 根据正弦余弦转换公式 cosα = sin(π/2-α)\n                     * 代入，得： cosα = sin(π/2-α) = sinα2 = (R - y) / R\n                     * 所以弧长 L = arccos(cosα)*R = arccos((R - y) / R)*R\n                     */\n\n                    float y = event.getY();\n                    double L = Math.acos((radius - y) / radius) * radius;\n                    //item0 有一半是在不可见区域，所以需要加上 itemHeight / 2\n                    int circlePosition = (int) ((L + itemHeight / 2) / itemHeight);\n                    float extraOffset = (totalScrollY % itemHeight + itemHeight) % itemHeight;\n                    //已滑动的弧长值\n                    mOffset = (int) ((circlePosition - itemsVisible / 2) * itemHeight - extraOffset);\n\n                    if ((System.currentTimeMillis() - startTime) > 120) {\n                        // 处理拖拽事件\n                        smoothScroll(ACTION.DAGGLE);\n                    } else {\n                        // 处理条目点击事件\n                        smoothScroll(ACTION.CLICK);\n                    }\n                }\n                break;\n        }\n        if (!isIgnore && event.getAction() != MotionEvent.ACTION_DOWN) {\n            invalidate();\n        }\n        return true;\n    }\n\n    public int getItemsCount() {\n        return adapter != null ? adapter.getItemsCount() : 0;\n    }\n\n    public void setLabel(String label) {\n        this.label = label;\n    }\n\n    public void isCenterLabel(boolean isCenterLabel) {\n        this.isCenterLabel = isCenterLabel;\n    }\n\n    public void setGravity(int gravity) {\n        this.mGravity = gravity;\n    }\n\n    public int getTextWidth(Paint paint, String str) { //calculate text width\n        int iRet = 0;\n        if (str != null && str.length() > 0) {\n            int len = str.length();\n            float[] widths = new float[len];\n            paint.getTextWidths(str, widths);\n            for (int j = 0; j < len; j++) {\n                iRet += (int) Math.ceil(widths[j]);\n            }\n        }\n        return iRet;\n    }\n\n    public void setIsOptions(boolean options) {\n        isOptions = options;\n    }\n\n    public void setTextColorOut(int textColorOut) {\n\n        this.textColorOut = textColorOut;\n        paintOuterText.setColor(this.textColorOut);\n    }\n\n    public void setTextColorCenter(int textColorCenter) {\n        this.textColorCenter = textColorCenter;\n        paintCenterText.setColor(this.textColorCenter);\n    }\n\n    public void setTextXOffset(int textXOffset) {\n        this.textXOffset = textXOffset;\n        if (textXOffset != 0) {\n            paintCenterText.setTextScaleX(1.0f);\n        }\n    }\n\n    public void setDividerWidth(int dividerWidth) {\n        this.dividerWidth = dividerWidth;\n        paintIndicator.setStrokeWidth(dividerWidth);\n    }\n\n    public void setDividerColor(int dividerColor) {\n        this.dividerColor = dividerColor;\n        paintIndicator.setColor(dividerColor);\n    }\n\n    public void setDividerType(DividerType dividerType) {\n        this.dividerType = dividerType;\n    }\n\n    public void setLineSpacingMultiplier(float lineSpacingMultiplier) {\n        if (lineSpacingMultiplier != 0) {\n            this.lineSpacingMultiplier = lineSpacingMultiplier;\n            judgeLineSpace();\n        }\n    }\n\n    public boolean isLoop() {\n        return isLoop;\n    }\n\n    public float getTotalScrollY() {\n        return totalScrollY;\n    }\n\n    public void setTotalScrollY(float totalScrollY) {\n        this.totalScrollY = totalScrollY;\n    }\n\n    public float getItemHeight() {\n        return itemHeight;\n    }\n\n    public int getInitPosition() {\n        return initPosition;\n    }\n\n    @Override\n    public Handler getHandler() {\n        return handler;\n    }\n}"
  },
  {
    "path": "wheelview/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"pickerview\">\n        <attr name=\"wheelview_gravity\">\n            <enum name=\"center\" value=\"17\"/>\n            <enum name=\"left\" value=\"3\"/>\n            <enum name=\"right\" value=\"5\"/>\n        </attr>\n        <attr name=\"wheelview_textSize\" format=\"dimension\"/>\n        <attr name=\"wheelview_textColorOut\" format=\"color\"/>\n        <attr name=\"wheelview_textColorCenter\" format=\"color\"/>\n        <attr name=\"wheelview_dividerColor\" format=\"color\"/>\n        <attr name=\"wheelview_dividerWidth\" format=\"dimension\"/>\n        <attr name=\"wheelview_lineSpacingMultiplier\" format=\"float\"/>\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "wheelview/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"pickerview_timebtn_nor\">#057dff</color>\n    <color name=\"pickerview_timebtn_pre\">#c2daf5</color>\n    <color name=\"pickerview_bg_topbar\">#f5f5f5</color>\n\n    <color name=\"pickerview_topbar_title\">#000000</color>\n    <color name=\"pickerview_wheelview_textcolor_out\">#a8a8a8</color>\n    <color name=\"pickerview_wheelview_textcolor_center\">#2a2a2a</color>\n    <color name=\"pickerview_wheelview_textcolor_divider\">#d5d5d5</color>\n    <color name=\"pickerview_bgColor_overlay\">#60000000</color>\n    <color name=\"pickerview_bgColor_default\">#FFFFFFFF</color>\n\n</resources>\n"
  },
  {
    "path": "wheelview/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- 顶部按钮栏高度 -->\n    <dimen name=\"pickerview_topbar_height\">44dp</dimen>\n\n    <!-- 顶部按钮padding -->\n    <dimen name=\"pickerview_topbar_padding\">20dp</dimen>\n\n    <!-- 顶部按钮文字大小 -->\n    <dimen name=\"pickerview_topbar_btn_textsize\">17sp</dimen>\n    <dimen name=\"pickerview_topbar_title_textsize\">18sp</dimen>\n    <!-- 选项文字大小 -->\n    <dimen name=\"pickerview_textsize\">20sp</dimen>\n</resources>\n"
  },
  {
    "path": "wheelview/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">wheelview</string>\n</resources>\n"
  }
]