ページ

2008年12月8日月曜日

吹き出しウィンドウ(5)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

フェードアウト効果を追加する。その為に FukidashiControllerに状態変数を追加する。

 状態(0) FUKIDASHI_STATE_HIDE  非表示状態 ※初期状態
 状態(1) FUKIDASHI_STATE_SHOW メッセージ表示状態
 状態(2) FUKIDASHI_STATE_FADEOUT フェードアウト途中の状態

クライアントコードから showMessage: が送られると状態(0)から状態(1)へ遷移する。しばらくメッセージを表示した後、タイマーによって状態(1)から状態(2)への遷移が起きる。この状態ではウィンドウの透明度が徐々に上がり(すなわちフェードアウトが進み)、最後に何も表示されなくなり状態(0)へ戻る。

下記は状態遷移用メソッド。状態(1) FUKIDASHI_STATE_SHOWへの遷移で NSTimerを起動している。

- (void)changeState:(int)state
{
switch (state) {
case FUKIDASHI_STATE_HIDE:
[_window orderOut:self];
break;

case FUKIDASHI_STATE_SHOW:
if (_state != FUKIDASHI_STATE_HIDE && [_timer isValid]) {
[_timer invalidate];
}
_count = 0;
[_window setContentSize:[_view areaSize]];
[_window setAlphaValue:1.0];
[_window makeKeyAndOrderFront:self];
_timer = [NSTimer timerWithTimeInterval:FUKIDASHI_TIME_INTERVAL
target:self
selector:@selector(callBack:)
userInfo:nil
repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
break;

case FUKIDASHI_STATE_FADEOUT:
_count = 0;
break;
default:
break;
}
_state = state;
}


タイマーの処理はこんな感じ。
- (void)callBack:(NSTimer*)timer
{
_count++;
switch (_state) {
case FUKIDASHI_STATE_SHOW:
if (_count >= (int)((float)_showtime/FUKIDASHI_TIME_INTERVAL)) {
[self changeState:FUKIDASHI_STATE_FADEOUT];
}
break;
case FUKIDASHI_STATE_FADEOUT:
if (_count >= (int)(FUKIDASHI_FADEOUT_TIME/FUKIDASHI_TIME_INTERVAL)) {
[self changeState:FUKIDASHI_STATE_HIDE];
[timer invalidate];
} else {
[_window setAlphaValue:(1.0-_count*FUKIDASHI_TIME_INTERVAL/FUKIDASHI_FADEOUT_TIME)];
}
break;
default:
break;
}
}




サンプル:Fukidashi-4.zip