android自定义观点之实现日历界面实例

  

现在网上有很多自定义观点实现日历的演示,今天讲一讲如何自己实现这个自定义。

  

看一下最终效果图:

  

 android自定义观点之实现日历界面实例

  

在这个自定义视图中,我使用了各种奇技淫巧的方法来实现这个日历,真是费尽心思。废话少说,开始进坑。

  

<>强界面分析

  

头部是一个textview,显示年份和月份,然后下边一行是星期几,这两行可以固定住,不随月份切换而进出屏幕。

  

再下边就是我们自定义视图的主角,每个月的天数。目前规定是星期日为每星期第一天。上个月的天数填充满第一行,下个月的前几天填充完最后一行,颜色设置为灰色,本月日期中的周一至周五设置为红色,周六周日设置为青色,特殊日期设置为绿色,并且在右上角填充特殊标识符,用四分之三的圆弧包裹(上个月和下个月的日期没有)。

  

此处还有个小细节,每月的总行数会不断改变,但是视图的总高度并未改变,所以视觉效果会不一样。

  

<>强构造方法

        公共MyCalendar(上下文语境){   超级(上下文);   }      公共MyCalendar(上下文语境,@Nullable AttributeSet attrs) {   超级(上下文,attrs);      }   之前      

主要是实现上面两个构造方法,第一个是用来在java代码中使用的,第二个是用来在xml布局文件中使用的。

  

<强>暴露的接口

  

目前接口共有下面几个,设置当前日期(CustomDate CustomDate), setWeekendHighLight(布尔b), setSpecialDay (int [] int)

  

其中第一个是必须要设置的,否则是不会显示任何东西,第二个设置的是否周末高亮,第三个设置的是特殊显示的日期,第四个是设置是否可以点击前一个月或者后一个月的日期,默认为不设置,后期可以根据自己需求增加其他接口。

     /* *   *暴露接口,设置日期   *   * @param customDate   */公共空间设置当前日期(CustomDate CustomDate) {   日志。d(标签,customDate.toString ());   这一点。日期=customDate;   firstDayOfWeek=date.getFirstDayOfWeek ();   日志。d(标签,(date.getMonth() + 1) +“月1号是星期”+ firstDayOfWeek);   lastDayOfWeek=date.getLastDayOfWeek ();   lineCount=calculateLineNum () + 1;   lastMonthTotalDays=date.getLastMonthDays ();   }/* *   *暴露接口,设置是否周末高亮   *   * @param b   */公共空间setWeekendHighLight(布尔b) {   这一点。weekendHighlight=b;   }      公共空间setSpecialDay (int [] int) {   这一点。的日子=整数;   }/* *   *暴露接口,设置是否可以点击前一个月和后一个月的日期   *   * @param b   */公共空间setCanClickNextOrPreMonth(布尔b) {   这一点。canClickNextOrPreMonth=b;   }      之前      

在这里说明一下计算显示行数的方法,首先要注意我们获取的星期数与实际的星期几会有一个增加一天的问题,也就是当前是星期4,那么你获取的int将会是5 .

     /* *   *获得应该设置为多少行   *   * @return   */私人int calculateLineNum () {   monthDaySum=date.getTotalDayOfMonth ();   返回(firstDayOfWeek - 1 + monthDaySum)/7;   }   之前      

我们将第一天是星期几减去一后加上这个月总共多少天,就可以获得最后一天是在什么位置,然后除以七取商的整数部分,然后在进一法即可获得应该显示多少行。

  

<强> onSizechanged方法

  

onSizechanged方法中已经可以获得显示的尺寸了,此时我们需要做一些工作:

        保护空白>/* *   *切分为每天   */私人空间cutGrid () {   cellWidth=(浮动)viewWidth/ROW_COUNT;   cellHeight=(浮动)viewHeight/lineCount;   这一点。半径=数学。分钟(cellWidth/2, cellHeight/2);   for (int i=0;我& lt;lineCount;我+ +){   for (int j=0;j & lt;ROW_COUNT;j + +) {   点。添加(新PointF (cellWidth * j + cellWidth/2, cellHeight *我+ cellHeight/2));   }   }   }   之前      

cellWidth是每天的宽度,其中ROW_COUNT是一个常量7,表示每周7天;cellHeight是每行的高度,linecount是一个变量,需要我们根据日期计算,后边会说到,半径是我们绘制区域的半径,这个值是我们取宽度和高度中较小的值的一半,然后我们将每个方格中心坐标点利用双重循环放入一个List

android自定义观点之实现日历界面实例