想要知道关于更多自定义View的实例,请参考:android自定义View索引

先上个效果图,走着。

好了,看完效果图是不是觉得很炫酷呢,不但可以在一个月内进行选取,跨月也是可以的。

如果没有做过日历的同学可能是没什么思路的,那么我再给张图,走着。。。

看完这个是不是有点想法了,好像没那么难了,主要使用到了几个基本控件和一个GridView。

啊!你不知道GridView?

那没办法了,自己百度去吧。

下面开始我的表演

一般的自定义View需要继承View,这个就不需要了,我们直接继承了RelativeLayout。

然后重写他的几个构造器,一般的话重写前俩个即可。

这里我写了个initView,那么我们所有的视图基本上都在这里面进行处理。

具体的代码比较长,这里就不方便贴了,我讲几个重点:

1:月份前面的空格部分

2:子项点击效果的处理

3:子项应该显示什么背景图

4:点击翻页时数据的更新

下面一一

简单分析

1:月份前面的空格部分

这里我们看见空格其实就是正常的GridView子项,只是去掉了背景和文字,那么我们在传入的List数据里面弄几个零,当我们发现集合为零时就不显示背景和文字即可。

2:子项点击效果的处理

实际上就是GridView的子项点击处理,处理其实没有什么大不了,只是需要注意我们的手指是第几次按下去即可,可以用个变量代替,我暂且用了status,那么就我们上面的效果图status应该有三种状态,第一次按下显示选择起始点,第二次按下结束点,第三按下取消所有的状态,嗯,做到思路清晰也没什么难的。

3:子项应该显示什么背景图

这里我们的子项应该有四种状态

一是无背景图;

二是起始点的背景图;

三是结束点背景图;

四是中间选中部分。

四种我们只需新建四个drawable文件即可,绘制不难。

4:点击翻页时数据的更新

这里说的翻页就是指上面的月份左右选择时,那么我们需要做的就是更新上面的标题部分和下面的日期部分即可。

最后的我还提供了一个接口给大家,用来返回你获取到的数据

public interface CalendarTime{
void showData(SaveData fromData, SaveData toData);
}

返回了俩个时间,一个是起始时间,一个结束时间,大家需要使用时只需要设置监听器即可

public void setOnTimeLisenter(CalendarTime calendarTime) {
this.calendarTime = calendarTime;
}

每当子项被点击的时候都会进行返回,不过具体要什么时候返回你们都是可以自行进行更改的,没毛病。

讲了这么多大家应该有个疑惑,那就是日期的数据从哪里来的?

不要慌,我这里提供了CalendarUtils一个工具类,可以提供各种关于日期的处理和获取,不过最终都是结合系统的Calendar类进行使用的,大家可以去看一看。

说了这么多大家应该心里也有点数了,是不是想跃跃欲试,下面的话我代码也会贴上,自己可以对着看一下。