·  这节,我们通过wheelview来模仿一个简易的正点闹钟。

  我这里不说wheelview来龙去脉,只阐述几个简单的方法,如果,想看一看具体wheelview的内容,请看下面两篇文章:

  android 时间控件概述Android 实现 WheelView

要实现正点闹钟,我们需要在程序中加入相应的滚轮的源代码,导入相应的源代码的结构如下所示:

  从图,我们可以得出来这样子的结论:

  ①其滚轮控件不是简简单单的完成日期时间选择,而且可以完成数字,字符串的选择,因此可以做手机的密码箱或者滚动的地址选择控件。

  ②此简单的框架(类库),运用大量的监听者,可想而知,把经典设计模式——观察者模式运用到了机制。

  好了,不东扯葫芦西扯瓢了,说一说本文的重点,时间控件的实现了。老样子,我们看代码:

    /**
* @Description: TODO 弹出日期时间选择器
*/
private void showDateTimePicker() {
Calendar calendar = Calendar.getInstance();
final int year = calendar.get(Calendar.YEAR);
current_year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DATE);
// 添加大小月月份并将其转换为list,方便之后的判断
String[] months_big = { "1", "3", "5", "7", "8", "10", "12" };
String[] months_little = { "4", "6", "9", "11" }; final List<String> list_big = Arrays.asList(months_big);
final List<String> list_little = Arrays.asList(months_little); dialog = new BaseDialog(PublicDefine.context);
dialog.setTitle("请选择日期");
// 找到dialog的布局文件 View view = LayoutInflater.from(PublicDefine.context).inflate(
R.layout.date_month_layout, null);
//年
final WheelView wv_year = (WheelView) view.findViewById(R.id.years);
wv_year.setAdapter(new NumericWheelAdapter(start_year, end_year));// 设置"年"的显示数据
wv_year.setCyclic(true);// 可循环滚动
wv_year.setLabel("年");// 添加文字
wv_year.setCurrentItem(year - start_year);// 初始化时显示的数据
// 月
final WheelView wv_month = (WheelView) view.findViewById(R.id.monthes);
wv_month.setAdapter(new NumericWheelAdapter(1, 12));
wv_month.setCyclic(true);
wv_month.setLabel("月");
wv_month.setCurrentItem(month); // 日
final WheelView wv_day = (WheelView) view.findViewById(R.id.days);
wv_day.setCyclic(true);
// 判断大小月及是否闰年,用来确定"日"的数据
if (list_big.contains(String.valueOf(month + 1))) {
wv_day.setAdapter(new NumericWheelAdapter(1, 31));
} else if (list_little.contains(String.valueOf(month + 1))) {
wv_day.setAdapter(new NumericWheelAdapter(1, 30));
} else {
// 闰年
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
wv_day.setAdapter(new NumericWheelAdapter(1, 29));
} else {
wv_day.setAdapter(new NumericWheelAdapter(1, 28));
}
}
wv_day.setLabel("日");
wv_day.setCurrentItem(day - 1); // 添加"年"监听
OnWheelChangedListener wheelListener_year = new OnWheelChangedListener() {
public void onChanged(WheelView wheel, int oldValue, int newValue) {
int year_num = newValue + start_year;
// 判断大小月及是否闰年,用来确定"日"的数据
if (list_big.contains(String
.valueOf(wv_month.getCurrentItem() + 1))) {
wv_day.setAdapter(new NumericWheelAdapter(1, 31));
} else if (list_little.contains(String.valueOf(wv_month
.getCurrentItem() + 1))) {
wv_day.setAdapter(new NumericWheelAdapter(1, 30));
} else {
if ((year_num % 4 == 0 && year_num % 100 != 0)
|| year_num % 400 == 0) {
wv_day.setAdapter(new NumericWheelAdapter(1, 29));
} else {
wv_day.setAdapter(new NumericWheelAdapter(1, 28));
}
}
} @Override
public void onEnd() {
// TODO Auto-generated method stub
int day=wv_day.getCurrentItem();
day=day>wv_day.getAdapter().getItemsCount()-1?day-wv_day.getAdapter().getItemsCount():wv_day.getCurrentItem();
wv_day.setCurrentItem(day);
}
};
// 添加"月"监听
OnWheelChangedListener wheelListener_month = new OnWheelChangedListener() {
public void onChanged(WheelView wheel, int oldValue, int newValue) {
int month_num = newValue + 1;
// 判断大小月及是否闰年,用来确定"日"的数据
if (list_big.contains(String.valueOf(month_num))) {
wv_day.setAdapter(new NumericWheelAdapter(1, 31));
} else if (list_little.contains(String.valueOf(month_num))) {
wv_day.setAdapter(new NumericWheelAdapter(1, 30));
} else {
if (((wv_year.getCurrentItem() + start_year) % 4 == 0 && (wv_year
.getCurrentItem() + start_year) % 100 != 0)
|| (wv_year.getCurrentItem() + start_year) % 400 == 0) {
wv_day.setAdapter(new NumericWheelAdapter(1, 29));
} else {
wv_day.setAdapter(new NumericWheelAdapter(1, 28));
}
}
} @Override
public void onEnd() {
// TODO Auto-generated method stub
int day=wv_day.getCurrentItem();
day=day>wv_day.getAdapter().getItemsCount()-1?day-wv_day.getAdapter().getItemsCount():wv_day.getCurrentItem();
wv_day.setCurrentItem(day);
}
};
wv_month.addChangingListener(wheelListener_month);
wv_year.addChangingListener(wheelListener_year);
// 根据屏幕密度来指定选择器字体的大小 int textSize = 20; wv_day.TEXT_SIZE = (int) (textSize*RTools.getSreenDensity(PublicDefine.context));
wv_month.TEXT_SIZE = (int) (textSize*RTools.getSreenDensity(PublicDefine.context));
wv_year.TEXT_SIZE=(int) (textSize*RTools.getSreenDensity(PublicDefine.context));
Button btn_sure = (Button) view.findViewById(R.id.btn_datetime_sure);
Button btn_cancel = (Button) view
.findViewById(R.id.btn_datetime_cancel); // 确定
btn_sure.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// 如果是个数,则显示为"02"的样式
String parten = "00";
DecimalFormat decimal = new DecimalFormat(parten);
// 设置日期的显示
select_month = wv_month.getCurrentItem() + 1;
select_day = wv_day.getCurrentItem() + 1;
select_year=wv_year.getCurrentItem()+start_year;
String aa = (wv_year.getCurrentItem()+start_year)+"-"+(decimal.format((wv_month.getCurrentItem() + 1))
+ "-" + decimal.format((wv_day.getCurrentItem() + 1)));
date_select.setText(aa); dialog.dismiss();
}
});
// 取消
btn_cancel.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
dialog.dismiss();
}
});
// 设置dialog的布局,并显示
dialog.setContentView(view);
dialog.show();
}

  由这长段的源代码,我们可以得出这样的总结了:

  ①获取当前的日期,显示到相应的时间选择器中。

  ②利用大小月天数,对相应的大小月天数进行保存。

  ③添加相应的填充器,对月份滚轮,年分滚轮的数据进行了一系列的填充。

  ④并且根据月份,是否闰年等相关的条件, 对其天数的滚轮进行了填充。

⑤也是我重点要提的一个方法,对其移动后的时间滚轮所指向的天数进行调整,这是解决一个什么问题了,就是倘若滚动到3月31日时候,月份再次拨回四的时候,此时应该指向4月1日啊。这个就是onend方法所做的事情了。

综上所述,一个闹钟app就此ok了,其效果如下图:

最新文章

  1. mysql修改为utf8格式
  2. List.Sort用法
  3. Ubuntu下如何将普通用户提升到root权限
  4. SpringMVC后缀
  5. Git ~ 大杀器之一 远程仓库 ~ Git
  6. 理解 __declspec(dllexport)和__declspec(dllimport)
  7. UML建模文章总结
  8. linux常用命令(查看某些软件是否已安装)
  9. Jquery创建JSON对象
  10. Jsoup代码解读之二-DOM相关对象
  11. javascript-数组的常用方法
  12. 【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用
  13. lager_transform未定义错误
  14. MySQL-count(*)和count(1)的查询区别
  15. codeforces285B
  16. 细说Django的中间件
  17. HDU - 1061-快速幂签到题
  18. SA的一个辣鸡trick
  19. Entity Framework Core的坑:Skip/Take放在Select之前造成Include的实体全表查询
  20. Python基础学习(第4天)

热门文章

  1. 邻接矩阵实现图的存储,DFS,BFS遍历
  2. Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP
  3. Lvs+Keepalived+Mysql
  4. ==与equals与hashCode的区别联系。
  5. .NET开源了,Visual Studio开始支持 Android 和 iOS 编程并自带Android模拟器
  6. Go 面试题(附答案解析)
  7. Revit API创建几何实体Solid并找到与之相交的元素
  8. Snmp学习总结(六)——linux下安装和配置SNMP
  9. 在简历中使用STAR法则
  10. C#编程(六十六)----------表达式树总结