android Calendar4.0源码分析之Dayview
事件Event的绘制在drawEvents中完成的。
在drawEvents中,绘制event之前会先通过geometry.computeEventRect(date, left, top, cellWidth, event)测量每个event在视图中所占据的矩形区域。然后调用drawEventRect绘制一个矩形,再调用drawEventText绘制文字。
测量event的geometry是一个EventGeometry类的对象,测量矩形区域上下位置的重要依据是这个event的起始时间和结束时间以及时间单位的高度cellHeight,因为dayview是一个可以垂直缩放的View因此这个cellHeight是可变的。所以在使用EventGeometry测量之前必须保证cellHeight是正确的,反映在程序中就是当每个单元格的高度变化之后调用EventGeometry的setHourHeight(mCellHeight)方法;而测量左右位置的依据主要是某个event所在的小时有多少个event,该event属于第几个, 这个过程是 Event.computePositions(mEvents, minimumDurationMillis)计算出来的,computePositions将上述的两个值分别赋予Event的mMaxColumns和mColumn两个成员变量。然后EventGeometry的方法computeEventRect根据这两个变量值得出每个event具体的左右位置:
float colWidth = (float) (cellWidth - (maxCols + 1) * mCellMargin) / (float) maxCols;
event.left = left + col * (colWidth + mCellMargin);
event.right = event.left + colWidth;