这两天有在做一个Calendar,相当是在模仿手机自带Calendar所做的。效果如下:
而做这个Calendar的时候有五个要求:
1.显示当天日期
2.显示当前时间
3.区分小时
4.区分过去与将来
5.进入显示前后8小时
那么如图所示,最上面的红色为一个TextView,显示当天日期;有一条蓝色的线显示当前时间;区分小时也就是显示出24小时,在左侧;而区分过去与将来则是用灰色和白色来区分;这个图就是进入App所显示的画面,显示了前后的8个小时。而图中的绿色是我所添加的事件要显示的颜色,在这里就先不介绍了。
那么在这里面遇到的问题有:
1.如何显示当前日期?
这个就容易解决了,在Java中有一个Calendar这个类,用这个类可以很轻松的获取当前日期,并在TextView中显示。
//显示当前日期
mCalendar = Calendar.getInstance();
mHours = mCalendar.get(Calendar.HOUR_OF_DAY);
int year = mCalendar.get(Calendar.YEAR);
int month = mCalendar.get(Calendar.MONTH) + 1;
int day = mCalendar.get(Calendar.DAY_OF_MONTH);
int week = mCalendar.get(Calendar.DAY_OF_WEEK);
String Sweek = null;
switch (week) {
case 1:Sweek = "周一";break;
case 2:Sweek = "周二";break;
case 3:Sweek = "周三";break;
case 4:Sweek = "周四";break;
case 5:Sweek = "周五";break;
case 6:Sweek = "周六";break;
case 7:Sweek = "周日";break;
}
mTextTime.setText(year + "." + month + "." + day + " " + Sweek);
2.如何实现显示当前时间?
由于我们是以ListView来区分小时的,所以我们只要先获取当前时间的分钟数,再除以60,得到的分数再乘以ListView每一个Item的高度,那么在相对就的Position中去画,就好办了。
mCalendar = Calendar.getInstance();
// 取得当前时间
mNumOne = mCalendar.get(Calendar.MINUTE);
mNumTwo = mNumOne / 60;
mTimes = (int) (mNumTwo * Height);
//画当前时间线
mPaint.setColor(Color.BLUE);
canvas.drawRect(0,mTimes, Height * 9, mTimes + 2, mPaint);
3.怎么实现区分过去与将来?
区分过去与将来,那官方给的思路就是在当前时间线以上和下面,以不同颜色来进行处理,让人一目了然。
而要实现这个功能,就要先找到当前时间以前的Position,然后再将它们画成灰色;找到当前时间所在Position,然后当前时间线以上为灰色,以下还是白色。
4.怎么实现进入显示前后8小时?
这就需要用到一个ListView的方法了,mList.setSelection()在参数中传入不同的整数,就会让App在进入以后置顶不同的ListView了。例如,mList.setSelection(7),会将ListView的第7项显示在手机屏幕的最顶端