我对此感到有些困惑。我想确定两个不透明度int值。一个应该增加,另一个应该减少一小时。
想象一下,一天由4部分组成。夜晚,日出,日和日落。每个部分都有图片 覆盖的两个图像。夜晚有夜景和日出图像。在午夜,夜间图像的不透明度为255,而日出实际上是不可见的。
虽然时间流逝到例如4点钟,夜间图像的不透明度降低,而日出的不透明度增加。晚上5点,图像不透明度为0,而日出图像的不透明度为255。
因此,在我想要计算两个不透明度值的4个部分中的每个部分中,一个增加另一个不透明度值。在每个部分中,不透明度从255变为0,在另一侧从0到255。
这就是我在几小时内分离各部分的方法
switch (hour) {
//night to sunrise
case 23: case 0: case 1: case 2: case 3: case 4:
[self setSetting:1 andOpacity:opacIn andOpacity:opacOut];
break;
//sunrise to day
case 5: case 6: case 7: case 8: case 9: case 10:
[self setSetting:1 andOpacity:opacIn andOpacity:opacOut];
break;
//day to sunset
case 11: case 12: case 13: case 14: case 15: case 16:
[self setSetting:4 andOpacity:opacIn andOpacity:opacOut];
break;
//sunset to night
case 17: case 18: case 19: case 20: case 21: case 22:
[self setSetting:2 andOpacity:opacIn andOpacity:opacOut];
break;
}
我尝试使用此解决方案
int opacIn = hour * 10;
if (opacIn >= 230) {
opacIn += 25;
}
int opacOut = 255 - opacIn;
这个问题是这决定了参考一整天的不透明度。所以它只从255到0一次。但我希望每天的每个部分都能采用这种方式。
有关于此的任何想法吗?我怎样才能确定每个部分的不透明度?
答案 0 :(得分:3)
看起来你需要一些旧的模块算术。你的一天被分为四个部分,每部分六个小时;您希望每小时更改一些值,并且每个段中的相应小时数具有相同的值。
首先,将目标值除以步数:
// Avoid magic numbers
#define MAX_OPACITY 255
#define HOURS_PER_SEGMENT 6
#define OPACITY_STEP (MAX_OPACITY / HOURS_PER_SEGMENT)
请注意,如果您将switch语句的case
作为列读取,则列中的每个值都具有相同的结果模6。这是关键字;每次检查时间时,找出您在当前细分中的位置:
// For purposes of opacity, it's as if 11PM is the first hour of the day
int shifted_hour = hour + 1;
if( 24 == shifted_hour) shifted_hour = 0;
int segment_pos = shifted_hour % HOURS_PER_SEGMENT;
现在你可以非常简单地获得不透明度值:
int opacIn = segment_pos * OPACITY_STEP;
int opacOut = MAX_OPACITY - opacIn;
你也可以取消switch
:
int segment_index = shifted_hour / 6;
[self setSegment:segment_index withOpacityIn:opacIn withOpacityOut:opacOut];