自定义View之_日历控件

来源:互联网 发布:淘宝c店全屏装修 编辑:程序博客网 时间:2024/06/05 03:46

    今天又有新的需求了,喏,这个就是


    这里呢需要一个日历,点击连个小的三角形可以进入到下一个月或者上一个月,左右滑动也是实现类似上面两个小三角形的功能,其中有三个橘黄色的圆圈,是到时候后台会返回给我的三个指定日期,我只需要像上图一样,高亮显示就行了。

    刚开始呢,准备找第三方的,后来一想,这个东西还是挺简单的,用第三方的不好维护,有新需求了改起来不太方便,于是决定自己写一个玩一下。下面是后来的成品。


    额~好像差不多的样子哈。

    进入正题。。。。。。

第一步:定最大的格局

    大致一看,继承自LinearLayout比较好,总共差不多7行,每一行也是一个LinearLayout,前两行是固定的,第一行是固定的三个元素,两个翻页的按钮,一个文本框,第二行是固定的周一到周日的英文首字母,从第三行开始,数据会动态的发生变化。

第二步:完成静态的东西

    静态的东西指的就是上面两行,第一行,两个ImageView,一个TextView,为了显示好看,将TextView权重设为1,两个ImageView两边显示,方便适配,下面那一行,七个TextView,权重各为1,平分成七块显示。分别设置其颜色和字体大小即可。

第三步:完成动态变化的部分

    剩下5行都是会变化的,为什么说是5行呢,因为一个月最少也是28天,这样如果正好1号是星期六,那么只需要4行,其他的所有情况都需要5行,所以就弄5行。然后,添加35个TextView到页面上,这些权重啊什么的也就不细说了。接下来,我们需要做的是计算指定年份,指定月份的第一天是星期几,当然,这个自己不想算,用api也可以很快获取,因为,我们需要知道我们从什么哪个位置开始写下1,然后我们还需要知道指定年月的当月天数,因为有了这个数字我们才能知道我们什么时候结束绘制文字。

  1. //获取指定年份指定月份的第一天的位置
  2.    private int getFisrtDayOfMonth(int year, int month) {
  3.        Calendar cal = Calendar.getInstance();
  4.        // 设置年份
  5.        cal.set(Calendar.YEAR, year);
  6.        // 设置月份
  7.        cal.set(Calendar.MONTH, month - 1);
  8.        // 获取某月最小天数
  9.        int firstDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
  10.        // 设置日历中月份的最小天数
  11.        cal.set(Calendar.DAY_OF_MONTH, firstDay);
  12.        return cal.get(Calendar.DAY_OF_WEEK);
  13.    }
  14.    //获取指定年份指定月份的第一天的位置
  15.    private int getDaysOfMonth(int year, int month) {
  16.        Calendar cal = Calendar.getInstance();
  17.        cal.set(Calendar.YEAR, year);
  18.        cal.set(Calendar.MONTH, month - 1);
  19.        return cal.getActualMaximum(Calendar.DATE);
  20.    }

    好了,有了这些东西,我们要做的就是判断啊,给TextView设置文字啊啥的。。。

第四步:为指定年月日花圈圈

    其实,也就是对传进来的字符串数组进行遍历,找到指定的那一天,在日历上对指定的那一天的TextView设置一个背景而已。

第五步:添加左右滑动的手势

    最后重写OnTouchEvent方法,判断是左滑还是右滑即可。在判读左右方向的时候,有一点需要注意一下,我们不能单单判断x方向上的位移,就给出结论向左还是向右,我们要根据x和y方向上位移量的比较,首先判断用户是在上下滑动还是在左右滑动,只有x方向上的偏移量大于y方向上的偏移量的时候才能去认定到底是左滑还是右滑。

    首先声明,由于我们的项目需求在这儿,所以没有做过多的扩展,功能略显单调,不过,可以自己扩展啊,没有完美的控件,只有适合自己的才是最好的。

    我是Cretin,一个可爱的小男孩。

    项目Github地址:https://github.com/MZCretin/CalendarViewDemo

    欢迎指点。



0 0
原创粉丝点击