├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── city.json │ └── city2.json │ ├── java │ └── cn │ │ └── qqtheme │ │ └── androidpicker │ │ ├── AddressInitTask.java │ │ ├── AssetsUtils.java │ │ ├── CustomHeaderAndFooterPicker.java │ │ └── MainActivity.java │ └── res │ ├── anim │ ├── popup_in.xml │ └── popup_out.xml │ ├── layout │ ├── activity_main.xml │ ├── picker_footer.xml │ └── picker_header.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ └── values │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── import-summary.txt ├── library ├── .gitignore ├── ColorPicker │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── cn │ │ │ └── qqtheme │ │ │ └── framework │ │ │ ├── picker │ │ │ └── ColorPicker.java │ │ │ └── widget │ │ │ └── ColorPanelView.java │ │ └── res │ │ └── drawable-hdpi │ │ ├── color_picker_cursor_bottom.png │ │ └── color_picker_cursor_top.png ├── Common │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── cn │ │ │ └── qqtheme │ │ │ └── framework │ │ │ ├── AppConfig.java │ │ │ ├── popup │ │ │ ├── BottomPopup.java │ │ │ ├── ConfirmPopup.java │ │ │ └── Popup.java │ │ │ └── util │ │ │ ├── CompatUtils.java │ │ │ ├── ConvertUtils.java │ │ │ ├── DateUtils.java │ │ │ ├── LogUtils.java │ │ │ └── ScreenUtils.java │ │ └── res │ │ └── values │ │ └── styles.xml ├── FilePicker │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── cn │ │ │ └── qqtheme │ │ │ └── framework │ │ │ ├── adapter │ │ │ └── FileAdapter.java │ │ │ ├── entity │ │ │ └── FileItem.java │ │ │ ├── picker │ │ │ └── FilePicker.java │ │ │ ├── util │ │ │ ├── FileUtils.java │ │ │ └── StorageUtils.java │ │ │ └── widget │ │ │ └── MarqueeTextView.java │ │ └── res │ │ └── drawable-hdpi │ │ ├── file_picker_file.png │ │ ├── file_picker_folder.png │ │ ├── file_picker_home.png │ │ └── file_picker_updir.png └── WheelPicker │ ├── .gitignore │ ├── build.gradle │ └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── cn │ └── qqtheme │ └── framework │ ├── picker │ ├── AddressPicker.java │ ├── ChineseZodiacPicker.java │ ├── ConstellationPicker.java │ ├── DatePicker.java │ ├── MyTimePicker.java │ ├── NumberPicker.java │ ├── OptionPicker.java │ ├── SexPicker.java │ ├── TimePicker.java │ └── WheelPicker.java │ └── widget │ └── WheelView.java ├── publish.cmd ├── screenshots ├── address.gif ├── address.png ├── chinesezodiac.gif ├── color.gif ├── constellation.gif ├── custom.gif ├── date.gif ├── dir.gif ├── file.gif ├── number.gif ├── option.gif └── time.gif ├── settings.gradle └── 仿ios弹出框效果 ├── build.gradle └── src └── main ├── AndroidManifest.xml ├── java └── com │ ├── gghl │ └── view │ │ ├── wheelcity │ │ ├── AddressData.java │ │ ├── ItemsRange.java │ │ ├── OnWheelChangedListener.java │ │ ├── OnWheelClickedListener.java │ │ ├── OnWheelScrollListener.java │ │ ├── WheelAdapter.java │ │ ├── WheelRecycle.java │ │ ├── WheelScroller.java │ │ ├── WheelView.java │ │ └── adapters │ │ │ ├── AbstractWheelAdapter.java │ │ │ ├── AbstractWheelTextAdapter.java │ │ │ ├── AdapterWheel.java │ │ │ ├── ArrayWheelAdapter.java │ │ │ ├── NumericWheelAdapter.java │ │ │ └── WheelViewAdapter.java │ │ └── wheelview │ │ ├── ArrayWheelAdapter.java │ │ ├── JudgeDate.java │ │ ├── MainActivity123.java │ │ ├── NumericWheelAdapter.java │ │ ├── OnWheelChangedListener.java │ │ ├── OnWheelScrollListener.java │ │ ├── ScreenInfo.java │ │ ├── WheelAdapter.java │ │ ├── WheelMain.java │ │ └── WheelView.java │ └── zf │ └── iosdialog │ ├── MainActivity.java │ └── widget │ ├── ActionSheetDialog.java │ └── MyAlertDialog.java └── res ├── anim ├── actionsheet_dialog_in.xml └── actionsheet_dialog_out.xml ├── drawable-hdpi ├── Thumbs.db ├── app_icon.png ├── toast_actionsheet_bottom_normal.9.png ├── toast_actionsheet_bottom_pressed.9.png ├── toast_actionsheet_middle_normal.9.png ├── toast_actionsheet_middle_pressed.9.png ├── toast_actionsheet_single_normal.9.png ├── toast_actionsheet_single_pressed.9.png ├── toast_actionsheet_top_normal.9.png ├── toast_actionsheet_top_pressed.9.png ├── toast_alert_bg.9.png ├── toast_alert_btn_left_pressed.9.png ├── toast_alert_btn_right_pressed.9.png ├── toast_alert_btn_single_pressed.9.png └── toast_trans_bg.png ├── drawable ├── actionsheet_bottom_selector.xml ├── actionsheet_middle_selector.xml ├── actionsheet_single_selector.xml ├── actionsheet_top_selector.xml ├── alertdialog_left_selector.xml ├── alertdialog_right_selector.xml ├── alertdialog_single_selector.xml ├── wheel_bg.xml └── wheel_val.xml ├── layout ├── activity_main.xml ├── main.xml ├── timepicker.xml ├── toast_view_actionsheet.xml ├── toast_view_alertdialog.xml ├── wheelcity_cities_layout.xml └── wheelcity_country_layout.xml ├── values-v11 └── styles.xml ├── values-v14 └── styles.xml └── values ├── color.xml ├── dimens.xml ├── strings.xml └── styles.xml /.gitignore: -------------------------------------------------------------------------------- 1 | /*.iml 2 | /gradlew 3 | /*/*.iml 4 | /gradle 5 | /.idea 6 | /gradlew.bat 7 | bin/ 8 | gen/ 9 | .gradle/ 10 | build/ 11 | /*/build/ 12 | local.properties 13 | proguard/ 14 | *.log 15 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /*.iml -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | 5 | buildTypes { 6 | release { 7 | //是否zip优化 8 | zipAlignEnabled true 9 | //是否移除无用的资源 10 | shrinkResources true 11 | //是否混淆 12 | minifyEnabled true 13 | //混淆配置文件 14 | proguardFile 'proguard-rules.pro' 15 | } 16 | } 17 | 18 | } 19 | 20 | dependencies { 21 | compile 'com.alibaba:fastjson:1.1.46.android' 22 | compile 'com.github.florent37:viewanimator:1.0.2' 23 | compile project(':library:WheelPicker') 24 | compile project(':library:FilePicker') 25 | compile project(':library:ColorPicker') 26 | // compile 'cn.qqtheme.framework:WheelPicker:1.1.0' 27 | // compile 'cn.qqtheme.framework:FilePicker:1.1.0' 28 | // compile 'cn.qqtheme.framework:ColorPicker:1.1.0' 29 | } 30 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\android-develop\android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/cn/qqtheme/androidpicker/AddressInitTask.java: -------------------------------------------------------------------------------- 1 | package cn.qqtheme.androidpicker; 2 | 3 | import android.app.Activity; 4 | import android.app.ProgressDialog; 5 | import android.os.AsyncTask; 6 | import android.widget.Toast; 7 | 8 | import com.alibaba.fastjson.JSON; 9 | 10 | import java.util.ArrayList; 11 | 12 | import cn.qqtheme.framework.picker.AddressPicker; 13 | 14 | /** 15 | * 获取地址数据并显示地址选择器 16 | * 17 | * @author 李玉江[QQ:1032694760] 18 | * @version 2015/12/15 19 | */ 20 | public class AddressInitTask extends AsyncTask> { 21 | private Activity activity; 22 | private ProgressDialog dialog; 23 | private String selectedProvince = "", selectedCity = "", selectedCounty = ""; 24 | private boolean hideCounty=false; 25 | 26 | /** 27 | * 初始化为不显示区县的模式 28 | * @param activity 29 | * @param hideCounty is hide County 30 | */ 31 | public AddressInitTask(Activity activity,boolean hideCounty) { 32 | this.activity = activity; 33 | this.hideCounty=hideCounty; 34 | dialog = ProgressDialog.show(activity, null, "正在初始化数据...", true, true); 35 | } 36 | 37 | public AddressInitTask(Activity activity) { 38 | this.activity = activity; 39 | dialog = ProgressDialog.show(activity, null, "正在初始化数据...", true, true); 40 | } 41 | @Override 42 | protected ArrayList doInBackground(String... params) { 43 | if (params != null) { 44 | switch (params.length) { 45 | case 1: 46 | selectedProvince = params[0]; 47 | break; 48 | case 2: 49 | selectedProvince = params[0]; 50 | selectedCity = params[1]; 51 | break; 52 | case 3: 53 | selectedProvince = params[0]; 54 | selectedCity = params[1]; 55 | selectedCounty = params[2]; 56 | break; 57 | default: 58 | break; 59 | } 60 | } 61 | ArrayList data = new ArrayList(); 62 | try { 63 | String json = AssetsUtils.readText(activity, "city.json"); 64 | data.addAll(JSON.parseArray(json, AddressPicker.Province.class)); 65 | } catch (Exception e) { 66 | e.printStackTrace(); 67 | } 68 | return data; 69 | } 70 | 71 | @Override 72 | protected void onPostExecute(ArrayList result) { 73 | dialog.dismiss(); 74 | if (result.size() > 0) { 75 | AddressPicker picker = new AddressPicker(activity, result); 76 | picker.setHideCounty(hideCounty); 77 | picker.setSelectedItem(selectedProvince, selectedCity, selectedCounty); 78 | picker.setOnAddressPickListener(new AddressPicker.OnAddressPickListener() { 79 | @Override 80 | public void onAddressPicked(String province, String city, String county) { 81 | if (county==null){ 82 | Toast.makeText(activity, province + city, Toast.LENGTH_LONG).show(); 83 | } else { 84 | Toast.makeText(activity, province + city + county, Toast.LENGTH_LONG).show(); 85 | } 86 | } 87 | }); 88 | picker.show(); 89 | } else { 90 | Toast.makeText(activity, "数据初始化失败", Toast.LENGTH_SHORT).show(); 91 | } 92 | } 93 | 94 | } 95 | -------------------------------------------------------------------------------- /app/src/main/java/cn/qqtheme/androidpicker/AssetsUtils.java: -------------------------------------------------------------------------------- 1 | package cn.qqtheme.androidpicker; 2 | 3 | import android.content.Context; 4 | 5 | import cn.qqtheme.framework.util.ConvertUtils; 6 | import cn.qqtheme.framework.util.LogUtils; 7 | 8 | /** 9 | * 操作安装包中的“assets”目录下的文件 10 | * 11 | * @author 李玉江[QQ:1023694760] 12 | * @version 2013-11-2 13 | */ 14 | public class AssetsUtils { 15 | 16 | /** 17 | * read file content 18 | * 19 | * @param context the context 20 | * @param assetPath the asset path 21 | * @return String string 22 | */ 23 | public static String readText(Context context, String assetPath) { 24 | LogUtils.debug("read assets file as text: " + assetPath); 25 | try { 26 | return ConvertUtils.toString(context.getAssets().open(assetPath)); 27 | } catch (Exception e) { 28 | LogUtils.error(e); 29 | return ""; 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/cn/qqtheme/androidpicker/CustomHeaderAndFooterPicker.java: -------------------------------------------------------------------------------- 1 | package cn.qqtheme.androidpicker; 2 | 3 | import android.app.Activity; 4 | import android.support.annotation.Nullable; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.animation.AccelerateInterpolator; 8 | import android.widget.Button; 9 | import android.widget.TextView; 10 | 11 | import com.github.florent37.viewanimator.AnimationListener; 12 | import com.github.florent37.viewanimator.ViewAnimator; 13 | 14 | import cn.qqtheme.framework.picker.OptionPicker; 15 | 16 | /** 17 | * 自定义顶部及底部 18 | *

19 | * Author:李玉江[QQ:1032694760] 20 | * Email:liyujiang_tk@yeah.net 21 | * DateTime:2016/1/29 14:47 22 | * Builder:Android Studio 23 | */ 24 | public class CustomHeaderAndFooterPicker extends OptionPicker { 25 | 26 | public CustomHeaderAndFooterPicker(Activity activity) { 27 | super(activity, new String[]{ 28 | "C/C++", "Java", "PHP", "Swift", "Node.js", "C#", "HTML5" 29 | }); 30 | setTitleText("请选择你最擅长的语言"); 31 | setSelectedItem("PHP"); 32 | } 33 | 34 | @Override 35 | public void show() { 36 | super.show(); 37 | ViewAnimator.animate(getRootView()) 38 | .duration(2000) 39 | .interpolator(new AccelerateInterpolator()) 40 | .slideBottom() 41 | .start(); 42 | } 43 | 44 | @Override 45 | public void dismiss() { 46 | ViewAnimator.animate(getRootView()) 47 | .duration(1000) 48 | .rollOut() 49 | .onStop(new AnimationListener.Stop() { 50 | @Override 51 | public void onStop() { 52 | CustomHeaderAndFooterPicker.super.dismiss(); 53 | } 54 | }) 55 | .start(); 56 | } 57 | 58 | @Nullable 59 | @Override 60 | protected View makeHeaderView() { 61 | View view = LayoutInflater.from(activity).inflate(R.layout.picker_header, null); 62 | TextView titleView = (TextView) view.findViewById(R.id.picker_title); 63 | titleView.setText(titleText); 64 | return view; 65 | } 66 | 67 | @Nullable 68 | @Override 69 | protected View makeFooterView() { 70 | View view = LayoutInflater.from(activity).inflate(R.layout.picker_footer, null); 71 | Button submitView = (Button) view.findViewById(R.id.picker_submit); 72 | submitView.setText(submitText); 73 | submitView.setOnClickListener(new View.OnClickListener() { 74 | @Override 75 | public void onClick(View v) { 76 | dismiss(); 77 | onSubmit(); 78 | } 79 | }); 80 | Button cancelView = (Button) view.findViewById(R.id.picker_cancel); 81 | cancelView.setText(cancelText); 82 | cancelView.setOnClickListener(new View.OnClickListener() { 83 | @Override 84 | public void onClick(View v) { 85 | dismiss(); 86 | onCancel(); 87 | } 88 | }); 89 | return view; 90 | } 91 | 92 | } 93 | -------------------------------------------------------------------------------- /app/src/main/res/anim/popup_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/anim/popup_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 |