diff --git a/src/小米便签代码精读.txt b/src/小米便签代码精读.txt new file mode 100644 index 0000000..013028f --- /dev/null +++ b/src/小米便签代码精读.txt @@ -0,0 +1,122 @@ +private void updateDateControl() { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1); + mDateSpinner.setDisplayedValues(null); + for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) { + cal.add(Calendar.DAY_OF_YEAR, 1); + mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal); + } + mDateSpinner.setDisplayedValues(mDateDisplayValues); + mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); + mDateSpinner.invalidate(); + }// 对于星期几的算法 + + private void updateAmPmControl() { + if (mIs24HourView) { + mAmPmSpinner.setVisibility(View.GONE); + } else { + int index = mIsAm ? Calendar.AM : Calendar.PM; + mAmPmSpinner.setValue(index); + mAmPmSpinner.setVisibility(View.VISIBLE); + }// 对于上下午操作的算法 + } + + private void updateHourControl() { + if (mIs24HourView) { + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); + } else { + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); + }// 对与小时的算法 + } + + + +使用一个循环遍历一周的每一天。对于每一次迭代: +日历向前增加一天。 +将格式化后的日期(格式为 "MM.dd EEEE",即月、日和完整的星期几名称)存储到 mDateDisplayValues 数组中。 +设置并显示选择器的值: +mDateSpinner.setDisplayedValues(mDateDisplayValues); +mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); +mDateSpinner.invalidate(); +将新的日期值设置到选择器中。 +将当前选择设置为中间的日期(即当前日期)。 +调用 invalidate() 方法以刷新选择器的显示。 +2. updateAmPmControl() 方法 +这个方法根据时间格式(24 小时或 12 小时)管理 AM/PM 控件的可见性和当前值。 +设置小时限制: +if (mIs24HourView) { + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); +} else { + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); +} +如果是 24 小时模式,则将小时选择器的最小值和最大值设置为对应的常量(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW 和 HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW)。 +如果是 12 小时模式,则将最小值和最大值设置为对应的常量(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW 和 HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW)。 +总结 +updateDateControl() 方法负责准备一周的日期,居中显示在选择器中,并格式化为用户友好的形式。 +updateAmPmControl() 方法管理 AM/PM 选择器的可见性和当前值,依据时间格式的不同进行相应的处理。 +updateHourControl() 方法根据用户选择的时间格式设置小时选择器的范围。 +这些方法共同提供了一个用户友好的界面,允许用户方便地选择日期和时间,适应不同的时间表示方式。 + + + +Calendar cal = Calendar.getInstance(); +创建日历实例:这里使用 Calendar.getInstance() 创建一个日历对象 cal,它包含当前日期和时间。 +cal.setTimeInMillis(mDate.getTimeInMillis()); +设置日历时间:mDate 是一个 Calendar 类型的对象,这行代码将 cal 的时间设置为 mDate 的值。这使得 cal 从当前日期变为用户选择的日期。 +cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1); +调整日期以居中显示: +DAYS_IN_ALL_WEEK 应该是一个常量,代表一周的天数(通常是7)。 +这行代码从 cal 中的当前时间减去一周的一半天数(例如,7/2=3.5,向下取整后是3),再减去1,使得当前日期居中于即将显示的日期范围内。比如,如果今天是周四,它会向回调整到上周一。 +mDateSpinner.setDisplayedValues(null); +清空选择器的当前值:在填充新的日期值之前,首先清空 mDateSpinner 中已有的显示值,确保显示的是更新后的日期。 +for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) { + cal.add(Calendar.DAY_OF_YEAR, 1); + mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal); +} +填充日期显示值: +这个循环运行 7 次(从 0 到 6),为每一天设置显示值。 +cal.add(Calendar.DAY_OF_YEAR, 1); 将当前日历日期增加一天。 +DateFormat.format("MM.dd EEEE", cal) 将日期格式化为 "MM.dd 星期几" 的形式,如 "11.19 星期一"。 +将格式化后的结果赋值给 mDateDisplayValues 数组的相应索引。 +mDateSpinner.setDisplayedValues(mDateDisplayValues); +设置选择器显示新值:将刚才填充的七个日期值设置到 mDateSpinner 中,以便用户可以从中选择。 +mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); +设置当前选择的值:将选择器的当前值设置为数组的中间值,即显示区域的中心日期。例如,若原本是 7 天,且当前日期在中间,则设置为 3(表示第四天)。 +java +mDateSpinner.invalidate(); +刷新选择器:调用 invalidate() 方法以确保 UI 更新并重新绘制选择器,保证用户看到最新的日期选择。 +2. updateAmPmControl() 方法 +这个方法负责更新 AM/PM 控件的显示,主要是根据用户选择的时间格式来调整可见性。 +if (mIs24HourView) { + mAmPmSpinner.setVisibility(View.GONE); +} else { +判断时间格式: +mIs24HourView 是一个布尔值,如果为 true,则表示使用 24 小时格式。在这种情况下,AM/PM 选择器不需要显示,所以调用 setVisibility(View.GONE) 隐藏选择器。 +int index = mIsAm ? Calendar.AM : Calendar.PM; +设置 AM/PM 的索引: +mIsAm 是一个布尔值,表示当前是否为上午。 +这里根据 mIsAm 来设置 index:如果 mIsAm 为 true,则 index 被设置为 Calendar.AM,否则设置为 Calendar.PM。 +mAmPmSpinner.setValue(index); +设置 AM/PM 选择器的当前值:为 AM/PM 选择器设置刚刚计算的索引值,确保用户选择了正确的 AM 或 PM。 +mAmPmSpinner.setVisibility(View.VISIBLE); +显示 AM/PM 选择器:如果不是 24 小时格式,显示 AM/PM 选择器(设置可见性为可见)。 +3. updateHourControl() 方法 +这个方法负责根据时间格式更新小时控制的上下限。 +if (mIs24HourView) { + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); +} else { +判断时间格式: +如果 mIs24HourView 为 true,则设置小时选择器的最小值和最大值为对应的 24 小时值。比如,可能最小值为 0(午夜),最大值为 23(晚上 11 点)。 +mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); +mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); +设置 12 小时格式的小时限制:如果不是 24 小时格式,设置小时选择器的最小值和最大值为对应的 12 小时值。这通常是 1 到 12(例如,1 AM 到 12 PM)。 +总结 +updateDateControl() 方法负责为用户提供一周的日期选择,并将当前日期居中显示在选择器中。通过循环构建日期字符串并设置到 UI 中,保证了界面的友好性和可操作性。 +updateAmPmControl() 方法确保 AM/PM 选择器根据用户的时间格式进行适当的显示与隐藏,提供了良好的用户体验。 +updateHourControl() 方法根据时间格式的不同动态调整小时的选择范围,确保用户选择的时间是有效的。 \ No newline at end of file