新项目Android和ios要做成统一样式,年龄,性别,时间,要做成滚轮效果,Android没有原生控件,只能自己定义,于是我较劲脑汁,终于写出来,本着分享精神,贴出部分代码,直接拷贝就能用。

先看效果图,如果符合你的需求,再采纳

时间

年龄

性别

废话不多说,直接上代码

布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutandroid:id="@+id/activity_main"xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:id="@+id/textView"/><Buttonandroid:text="生日"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/textView"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:id="@+id/button"android:onClick="date"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"/><Buttonandroid:text="时间"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/button"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:id="@+id/button2"android:onClick="time"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"/><Buttonandroid:text="性别"android:onClick="zidingyi"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/button2"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:id="@+id/button3"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"/>
</RelativeLayout>

MainActivity

public class MainActivity extends AppCompatActivity {private Dialog dateDialog, timeDialog, chooseDialog;private TextView mTextView;private List<String> list = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView = (TextView) findViewById(R.id.textView);String[] data = getResources().getStringArray(R.array.list);for (String str : data) {list.add(str);}}/*** chooseDialog*/private void showChooseDialog(List<String> mlist) {DataPickerDialog.Builder builder = new DataPickerDialog.Builder(this);chooseDialog = builder.setData(mlist).setSelection(1).setTitle("取消").setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {@Overridepublic void onDataSelected(String itemValue, int position) {mTextView.setText(itemValue);}@Overridepublic void onCancel() {}}).create();chooseDialog.show();}private void showDateDialog(List<Integer> date) {DatePickerDialog.Builder builder = new DatePickerDialog.Builder(this);builder.setOnDateSelectedListener(new DatePickerDialog.OnDateSelectedListener() {@Overridepublic void onDateSelected(int[] dates) {mTextView.setText(dates[0] + "-" + (dates[1] > 9 ? dates[1] : ("0" + dates[1])) + "-"+ (dates[2] > 9 ? dates[2] : ("0" + dates[2])));}@Overridepublic void onCancel() {}}).setSelectYear(date.get(0) - 1).setSelectMonth(date.get(1) - 1).setSelectDay(date.get(2) - 1);builder.setMaxYear(DateUtil.getYear());builder.setMaxMonth(DateUtil.getDateForString(DateUtil.getToday()).get(1));builder.setMaxDay(DateUtil.getDateForString(DateUtil.getToday()).get(2));dateDialog = builder.create();dateDialog.show();}private void showTimePick() {if (timeDialog == null) {TimePickerDialog.Builder builder = new TimePickerDialog.Builder(this);timeDialog = builder.setOnTimeSelectedListener(new TimePickerDialog.OnTimeSelectedListener() {@Overridepublic void onTimeSelected(int[] times) {mTextView.setText(times[0] + ":" + times[1]);}}).create();}timeDialog.show();}public void time(View v) {showTimePick();}public void date(View v) {showDateDialog(DateUtil.getDateForString("1990-01-01"));}public void zidingyi(View v) {showChooseDialog(list);}
}
DataPickerDialog
public class DataPickerDialog extends Dialog {private Params params;public DataPickerDialog(Context context, int themeResId) {super(context, themeResId);}private void setParams(DataPickerDialog.Params params) {this.params = params;}public void setSelection(String itemValue) {if (params.dataList.size() > 0) {int idx = params.dataList.indexOf(itemValue);if (idx >= 0) {params.initSelection = idx;params.loopData.setCurrentItem(params.initSelection);}}}public interface OnDataSelectedListener {void onDataSelected(String itemValue, int position);void onCancel();}private static final class Params {private boolean shadow = true;private boolean canCancel = true;private LoopView loopData;private String title;private String unit;private int initSelection;private OnDataSelectedListener callback;private final List<String> dataList = new ArrayList<>();}public static class Builder {private final Context context;private final DataPickerDialog.Params params;public Builder(Context context) {this.context = context;params = new DataPickerDialog.Params();}private final String getCurrDateValue() {return params.loopData.getCurrentItemValue();}public Builder setData(List<String> dataList) {params.dataList.clear();params.dataList.addAll(dataList);return this;}public Builder setTitle(String title) {params.title = title;return this;}public Builder setUnit(String unit) {params.unit = unit;return this;}public Builder setSelection(int selection) {params.initSelection = selection;return this;}public Builder setOnDataSelectedListener(OnDataSelectedListener onDataSelectedListener) {params.callback = onDataSelectedListener;return this;}public DataPickerDialog create() {final DataPickerDialog dialog = new DataPickerDialog(context, params.shadow ? R.style.Theme_Light_NoTitle_Dialog : R.style.Theme_Light_NoTitle_NoShadow_Dialog);View view = LayoutInflater.from(context).inflate(R.layout.layout_picker_data, null);if (!TextUtils.isEmpty(params.title)) {TextView txTitle = (TextView) view.findViewById(R.id.tx_title);txTitle.setText(params.title);txTitle.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dialog.dismiss();params.callback.onCancel();}});}if (!TextUtils.isEmpty(params.unit)) {TextView txUnit = (TextView) view.findViewById(R.id.tx_unit);txUnit.setText(params.unit);}final LoopView loopData = (LoopView) view.findViewById(R.id.loop_data);loopData.setArrayList(params.dataList);loopData.setNotLoop();if (params.dataList.size() > 0) loopData.setCurrentItem(params.initSelection);view.findViewById(R.id.tx_finish).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();params.callback.onDataSelected(getCurrDateValue(),loopData.getCurrentItem());}});Window win = dialog.getWindow();win.getDecorView().setPadding(0, 0, 0, 0);WindowManager.LayoutParams lp = win.getAttributes();lp.width = WindowManager.LayoutParams.MATCH_PARENT;lp.height = WindowManager.LayoutParams.WRAP_CONTENT;win.setAttributes(lp);win.setGravity(Gravity.BOTTOM);win.setWindowAnimations(R.style.Animation_Bottom_Rising);dialog.setContentView(view);dialog.setCanceledOnTouchOutside(params.canCancel);dialog.setCancelable(params.canCancel);params.loopData = loopData;dialog.setParams(params);return dialog;}}
}
DatePickerDialog
public class DatePickerDialog extends Dialog {private static  int MIN_YEAR = 1900;private static  int MAX_YEAR = 2100;private Params params;public DatePickerDialog(Context context, int themeResId) {super(context, themeResId);}private void setParams(DatePickerDialog.Params params) {this.params = params;}public interface OnDateSelectedListener {void onDateSelected(int[] dates);void onCancel();}private static final class Params {private boolean shadow = true;private boolean canCancel = true;private LoopView loopYear, loopMonth, loopDay;private OnDateSelectedListener callback;}public static class Builder {private final Context context;private final DatePickerDialog.Params params;private Integer minYear;private Integer maxYear;private Integer selectYear;private Integer selectMonth;private Integer selectDay;private Integer minMonth;private Integer maxMonth;private Integer minDay;private Integer maxDay;public Builder(Context context) {this.context = context;params = new DatePickerDialog.Params();}public Builder setMinYear(int year){minYear=year;return this;}public Builder setMaxYear(int year){maxYear=year;return this;}public Builder setMinMonth(int month){minMonth=month;return this;}public Builder setMaxMonth(int month){maxMonth=month;return this;}public Builder setMinDay(int day){minDay=day;return this;}public Builder setMaxDay(int day){maxDay=day;return this;}public Builder setSelectYear(int year){this.selectYear=year;return this;}public Builder setSelectMonth(int month){this.selectMonth=month;return this;}public Builder setSelectDay(int day){this.selectDay=day;return this;}/*** 获取当前选择的日期** @return int[]数组形式返回。例[1990,6,15]*/private final int[] getCurrDateValues() {int currYear = Integer.parseInt(params.loopYear.getCurrentItemValue());int currMonth = Integer.parseInt(params.loopMonth.getCurrentItemValue());int currDay = Integer.parseInt(params.loopDay.getCurrentItemValue());return new int[]{currYear, currMonth, currDay};}public Builder setOnDateSelectedListener(OnDateSelectedListener onDateSelectedListener) {params.callback = onDateSelectedListener;return this;}public DatePickerDialog create() {final DatePickerDialog dialog = new DatePickerDialog(context, params.shadow ? R.style.Theme_Light_NoTitle_Dialog : R.style.Theme_Light_NoTitle_NoShadow_Dialog);View view = LayoutInflater.from(context).inflate(R.layout.layout_picker_date, null);view.findViewById(R.id.tv_cancel).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dialog.dismiss();params.callback.onCancel();}});Calendar c = Calendar.getInstance();final LoopView loopDay = (LoopView) view.findViewById(R.id.loop_day);loopDay.setArrayList(d(1, 30));if(selectDay!=null){loopDay.setCurrentItem(selectDay);}else{loopDay.setCurrentItem(c.get(Calendar.DATE));}//loopDay.setNotLoop();final LoopView loopYear = (LoopView) view.findViewById(R.id.loop_year);loopYear.setArrayList(d(MIN_YEAR, MAX_YEAR - MIN_YEAR + 1));if(selectYear!=null){loopYear.setCurrentItem(selectYear-MIN_YEAR+1);}else{loopYear.setCurrentItem(MAX_YEAR);}loopYear.setNotLoop();final LoopView loopMonth = (LoopView) view.findViewById(R.id.loop_month);loopMonth.setArrayList(d(1, 12));if(selectMonth!=null){loopMonth.setCurrentItem(selectMonth);}else{loopMonth.setCurrentItem(c.get(Calendar.MONTH));}loopMonth.setNotLoop();final LoopListener maxDaySyncListener = new LoopListener() {@Overridepublic void onItemSelect(int item) {Calendar c = Calendar.getInstance();boolean needFixed=true;if(minYear!=null){if(Integer.parseInt(loopYear.getCurrentItemValue())==minYear ){if(minMonth!=null){if(Integer.parseInt(loopMonth.getCurrentItemValue())<minMonth){loopMonth.setCurrentItem(minMonth - 1);}}}else if(Integer.parseInt(loopYear.getCurrentItemValue())<minYear){loopYear.setCurrentItem(minYear-MIN_YEAR);}}if(maxYear!=null){if(Integer.parseInt(loopYear.getCurrentItemValue())==maxYear ){if(maxMonth!=null){if(Integer.parseInt(loopMonth.getCurrentItemValue())>maxMonth){loopMonth.setCurrentItem(maxMonth - 1);}}}else if(Integer.parseInt(loopYear.getCurrentItemValue())>maxYear){loopYear.setCurrentItem(maxYear-MIN_YEAR);}}c.set(Integer.parseInt(loopYear.getCurrentItemValue()), Integer.parseInt(loopMonth.getCurrentItemValue()) - 1, 1);c.roll(Calendar.DATE, false);if(needFixed){int maxDayOfMonth = c.get(Calendar.DATE);int fixedCurr = loopDay.getCurrentItem();loopDay.setArrayList(d(1, maxDayOfMonth));// 修正被选中的日期最大值if (fixedCurr > maxDayOfMonth) fixedCurr = maxDayOfMonth - 1;loopDay.setCurrentItem(fixedCurr);}}};final LoopListener dayLoopListener=new LoopListener() {@Overridepublic void onItemSelect(int item) {if(minYear!=null && minMonth!=null && minDay!=null&& Integer.parseInt(loopYear.getCurrentItemValue())==minYear&& Integer.parseInt(loopMonth.getCurrentItemValue())==minMonth&& Integer.parseInt(loopDay.getCurrentItemValue())<minDay){loopDay.setCurrentItem(minDay-1);}if(maxYear!=null && maxMonth!=null && maxDay!=null&& Integer.parseInt(loopYear.getCurrentItemValue())==maxYear&& Integer.parseInt(loopMonth.getCurrentItemValue())==maxMonth&& Integer.parseInt(loopDay.getCurrentItemValue())>maxDay){loopDay.setCurrentItem(maxDay-1);}}};loopYear.setListener(maxDaySyncListener);loopMonth.setListener(maxDaySyncListener);loopDay.setListener(dayLoopListener);view.findViewById(R.id.tx_finish).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();params.callback.onDateSelected(getCurrDateValues());}});Window win = dialog.getWindow();win.getDecorView().setPadding(0, 0, 0, 0);WindowManager.LayoutParams lp = win.getAttributes();lp.width = WindowManager.LayoutParams.MATCH_PARENT;lp.height = WindowManager.LayoutParams.WRAP_CONTENT;win.setAttributes(lp);win.setGravity(Gravity.BOTTOM);win.setWindowAnimations(R.style.Animation_Bottom_Rising);dialog.setContentView(view);dialog.setCanceledOnTouchOutside(params.canCancel);dialog.setCancelable(params.canCancel);params.loopYear = loopYear;params.loopMonth = loopMonth;params.loopDay = loopDay;dialog.setParams(params);return dialog;}/*** 将数字传化为集合,并且补充0** @param startNum 数字起点* @param count    数字个数* @return*/private static List<String> d(int startNum, int count) {String[] values = new String[count];for (int i = startNum; i < startNum + count; i++) {String tempValue = (i < 10 ? "0" : "") + i;values[i - startNum] = tempValue;}return Arrays.asList(values);}}
}

代码太多就不一一贴出来了,有需要直接下载完整demo 地址如下 百度网盘

http://pan.baidu.com/s/1bpCO7Np

Android仿ios年龄滚轮大全相关推荐

  1. android rebound平移,Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout

    Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout 前言 IOS 拖拽回弹给用户的体验不得不赞然后 Android 原生的 API 各种不支持, 于是乎出现的很多仿 IO ...

  2. android仿ios弹框_在“提示”框中:iOS外观(在Android上运行),Google Maps作为Time Machine,下载Wii游戏保存...

    android仿ios弹框 Once a week we round up some great reader tips and share them with everyone. Read on t ...

  3. android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...

  4. android 密码解锁程序,android 仿ios数字密码解锁界面的实例

    如下所示: 每个Android开发人员都知道,现在android的解锁最常用的就是九宫格解锁,ios的解锁常用的是数字密码解锁.而我们在开发工程中,很多时候,都需要android和ios进行结合.有的 ...

  5. Android仿IOS解锁密码界面-自定义view系列(6)

    Android仿IOS解锁密码界面-自定义view系列 功能简介 主要实现步骤-具体内容看github项目里的代码 xml相关属性设置 Android Studio 代码 Android技术生活交流 ...

  6. android 按钮回弹效果,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

  7. Android仿IOS滑动关机-自定义view系列(6)

    Android仿IOS滑动关机-自定义view系列 功能简介 GIf演示 主要实现步骤-具体内容看github项目里的代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击 ...

  8. Android仿IOS吸边弹簧阻尼移动组件SpringMovingView-自定义view系列(3)

    () Android仿ios吸边弹簧阻尼效果的移动组件SpringMovingView 功能简介 Android技术生活交流 Gif演示 实现步骤 java代码 Android技术生活交流 更多其他页 ...

  9. android 布局回弹,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

最新文章

  1. 【小题目】输入三个数字表示年月日,输出这一天在这一年是第几天
  2. xdocument查找节点值_二叉查找树(java)
  3. 【第九课】MriaDB密码重置和慢查询日志
  4. poj 1182 食物链(高级的带权并查集)
  5. Python Flask Web 第十课 —— flask-wtf
  6. 【Git/Github学习笔记】Github的使用介绍
  7. 五子棋(机器人随机下棋简单版本)
  8. 为什么算法工程师也叫调参狗?
  9. 云台山风景美如画,四大网红打卡景点等你来!
  10. 刨根问底:什么是yum源,yum的工作原理又是什么
  11. blender布尔运算差值看不出效果/blender布尔差值无效
  12. matlab小车运动轨迹增量式PID控制
  13. 动物拼图代码html,制作动物拼图美术教案
  14. P3287 [SCOI2014]方伯伯的玉米田
  15. Tensorflow入门——自制数据集:将未经处理的图片制成npy格式的数据集
  16. 大数据分析的几种方法
  17. Mac 环境下 Java JDK 的安装与环境变量配置详解(已完美解决)
  18. Linux C应用编程-1-文件IO
  19. realsense D435 D435i D415深度相机在ros下获得RGB图、左右红外摄像图、深度图、IMU数据
  20. Learning Python Part II 之 赋值语句(Assignments)

热门文章

  1. 从AP微积分看美国的微积分教育
  2. 上海这边的租房行情(浦东/张江)
  3. 目录树结构的数据库设计思考
  4. 初始C语言——梦开始的地方
  5. ethtool Linux网卡详解
  6. excel 批量替换换行符
  7. MT4_应用于外汇交易的量化模型
  8. ubuntu下个人觉得必备,好用的应用软件
  9. 十大经典排序总结(C++/C 实现)
  10. 史蒂夫·乔布斯(Steve Jobs)——苹果公司CEO