MyCalendar 开发日志 2

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

上周花了不少时间,总算把日历的demo程序(http://blog.csdn.net/h7870181/article/details/8960478)弄清楚了。

关于画边框和数字以及背景的几个函数就不想写列出来,都是很简单的几个函数。重点写一下处理日期计算的函数。calulateDate()。

这个函数的目的是计算当前页面中42个日期的具体排列。42个日期很容易得出,看下自己电脑以及手机上的日历,都是6行7列的一个排列。因为有时候一个月的第一天会出现在周日,而31天的话,5行是不够使的,所以是6行7列。这就需要几件事情需要处理:

1. 判断当月的第一天在日历中的位置;

2. 填充上个月的最后几天;

3. 填充下个月的前几天。

这个思路清楚了以后,再看程序就不难理解了。

private void calculateDate() {
		// Confirm the position of the first day in current month
		calendar.setTime(curDate);
		calendar.set(Calendar.DAY_OF_MONTH, 1);// set the index to the first day
												// of current month
		int dayInWeek = calendar.get(Calendar.DAY_OF_WEEK);// Return the first
															// day of this month
															// is which day in a
															// week, Sunday is 1
															// and Saturday is 7
		Log.d(TAG, "day in week:" + dayInWeek);
		int monthStart = dayInWeek;
		if (monthStart == 1) {
			monthStart = 8;
		}
		monthStart -= 1; // 以星期一位開頭就-2,以星期天為开头就-1
		curStartIndex = monthStart;
		date[monthStart] = 1;// find the position of 1st
		// Fill the days in last month
		if (monthStart > 0) {
			calendar.set(Calendar.DAY_OF_MONTH, 0);// Set the index to the last
													// day of last month
			int dayInmonth = calendar.get(Calendar.DAY_OF_MONTH);// Because it's
																	// the last
																	// day
			for (int i = monthStart - 1; i >= 0; i--) {
				date[i] = dayInmonth;
				dayInmonth--;
			}
			calendar.set(Calendar.DAY_OF_MONTH, date[0]); // record the first
															// day in this page
		}
		showFirstDate = calendar.getTime();
		// this month
		calendar.setTime(curDate);
		calendar.add(Calendar.MONTH, 1);// because we have to get the number of
										// the day in current day, so we need to
										// add one month then go back
		calendar.set(Calendar.DAY_OF_MONTH, 0);
		// Log.d(TAG, "m:" + calendar.get(Calendar.MONTH) + " d:" +
		// calendar.get(Calendar.DAY_OF_MONTH));
		int monthDay = calendar.get(Calendar.DAY_OF_MONTH);// get the number of
															// day in this
															// month.
		for (int i = 1; i < monthDay; i++) {
			date[monthStart + i] = i + 1;
		}
		curEndIndex = monthStart + monthDay;// last day in this month
		// next month
		for (int i = monthStart + monthDay; i < 42; i++) {
			date[i] = i - (monthStart + monthDay) + 1;
		}
		if (curEndIndex < 42) {
			// 显示了下一月的
			// calendar.add(Calendar.DAY_OF_MONTH, 1);
		}
		calendar.set(Calendar.DAY_OF_MONTH, date[41]);
		showLastDate = calendar.getTime();
	}
正如我自己写的注释一样,逐行解释下代码的意思吧:

setTime(curDate),将日历设置成当前月份,这样才能在下一行set(Calendar.DAY_OF_MONTH, 1)函数中将index设置到当月的第一天,

然后再利用get(calendar.DAY_OF_WEEK)函数就可以返回这个月的第一天是当月中的星期几了。注意周日返回1,周六是7。

接下来因为很多日历有自己的模式,比如有的把周日当做一周的第一天,有的把周一当做第一天。所以monthStart -=1(or 2)来把当前的模式设置成自己想要的格式。

举个例子更容易理解。4月1号是周二,monthStart得到的结果是3,因为我是把周日设为每周的第一天,所以,减1后monthStart是2,所以Date[2] =1。 也就是当月矩阵的第3天是1号。(数组从0开始)。


好了,第一天找到了,接下来就开始把上个月的最后几天填进去了。那如何确定上个月有几天呢?

一样的方法。

set(Calendar.DAY_OF_MONTH, 0),经过debug查看dayInmonth的值,我感觉把set函数的第二个参数设置成0的意思是将index回滚到上个月的最后一天,然后再调用get函数当然得到的结果就是上个月的天数了。

接下来的for循环就不用多说了吧。

然后填充当月的数字:

这里为了得到本月总共有多少天,需要先add(calendar.MONTH,1),将index设置到下个月,然后再set(calendar.DAY_OF_MONTH,0)回滚到上个月(也就是当月)的最后一天,然后再get一下,就得到了这个月的天数(30?31?29?28?),然后知道了这个月有多少天,有知道了第一天的位置,很容易填充了,for循环就搞定了。

然后同样的方法,来把下个月的若干天也填充到数组中去。

核心的算法就是这个函数。



今天再次尝试了下全屏的方法,之前在网上看有两种方法:

方法1:

使用xml的方法,在该项目的AndroidManifest.xml文件中,在需要全屏的Activity元素中添加属性

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
这样就可以实现这个Activity的全屏显示,如果只是不要标题栏,即需要保留系统自带的任务栏的话,则使用
android:theme="@android:style/Theme.NoTitleBar"
这样的好处是可以不用在代码中进行修改

方法2:

即使用代码进行修改

在Activity 的OnCreat函数中加入下面的代码:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. requestWindowFeature(Window.FEATURE_NO_TITLE);  
  2. getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,WindowManager.LayoutParams. FLAG_FULLSCREEN);  

使用代码可以动态使该Activity进行全屏,如可实现屏幕双击后进行全屏等

实际开发过程中,我使用修改xml的方法一直不行,每次在虚拟机上都运行不起来,然后尝试了一下在代码中修改,成功了,但是代码一定要在  setContentView(R.layout.activity_main_page) 之前,否则还是会报错。

另外用代码的方法还有个不好的地方是刚开始的时候,上端的标题栏会闪一块黑色,然后过1秒才会变成全屏的。所以一直想尝试在XML中修改,但是可惜都成功不了。先放着吧,回头再看看有没有别的解决办法。
















相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
存储 监控 数据库
Django 后端架构开发:高效日志规范与实践
Django 后端架构开发:高效日志规范与实践
64 1
|
5月前
|
存储 数据采集 JavaScript
深入理解数仓开发(一)数据技术篇之日志采集
深入理解数仓开发(一)数据技术篇之日志采集
|
6月前
|
小程序 前端开发 API
微信小程序全栈开发中的异常处理与日志记录
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的异常处理和日志记录,强调其对确保应用稳定性和用户体验的重要性。异常处理涵盖前端(网络、页面跳转、用户输入、逻辑异常)和后端(数据库、API、业务逻辑)方面;日志记录则关注关键操作和异常情况的追踪。实践中,前端可利用try-catch处理异常,后端借助日志框架记录异常,同时采用集中式日志管理工具提升分析效率。开发者应注意安全性、性能和团队协作,以优化异常处理与日志记录流程。
186 0
|
6月前
|
调度
kettle开发篇-写日志
kettle开发篇-写日志
402 0
|
25天前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
58 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL】根据binlog日志获取回滚sql的一个开发思路
【MySQL】根据binlog日志获取回滚sql的一个开发思路
|
30天前
|
开发框架 缓存 安全
开发日志:IIS安全配置
开发日志:IIS安全配置
开发日志:IIS安全配置
|
1月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
33 1
|
3月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
122 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
3月前
|
小程序 前端开发 API
微信小程序全栈开发中的异常处理与日志记录是一个重要而复杂的问题。
微信小程序作为业务拓展的新渠道,其全栈开发涉及前端与后端的紧密配合。本文聚焦小程序开发中的异常处理与日志记录,从前端的网络、页面跳转等异常,到后端的数据库、API调用等问题,详述了如何利用try-catch及日志框架进行有效管理。同时强调了集中式日志管理的重要性,并提醒开发者注意安全性、性能及团队协作等方面,以构建稳定可靠的小程序应用。
60 1