こんな感じ。
イベントハンドリング
Core Animation の CALayer は 表示専用クラスでマウスイベントの受付はできない。どちらかといえばアニメーションに必要な値やルールを保持するモデルに近い(たしかリファレンスでもそう解説されていた)。イベントの受付は CALayer をホストしている NSView で行う。
SimpleCap の範囲選択キャプチャの場合、画面を全体を覆う NSView があって、そこへ CALayer を並べることで今回のアニメーションを表示している。こんなイメージ。
なので各 CALayer の上にマウスカーソルが載ったかどうかの判定は CALayerではなくそれらをホストする NSView で行う。
流れはこんな感じ。
1. ユーザがマウス移動 ↓ 2. ホストNSView の mouseMoved: が呼ばれる SelectionHistoryLayer のメソッドをマウス位置を引数にして呼び出す ↓ 3. すべての CALayer についてテストを行う。 該当した場合、そのCALayerの背景色を変える。 また直前の CALayer の背景色を元に戻テストは CALayer にもメソッドが用意されているが、それを使わず自前でベタにNSPointInRectを使って行っている。こんな感じ。
for (NSValue* selectionValue in [selectionHistory arrayOrderBySize]) { NSRect rect = [selectionValue rectValue]; if (NSPointInRect(cp, rect)) { [self setHoveredLayer:[self layerForRect:rect]]; hit = YES; break; } }
当然ながらマウス移動だけでなくクリックされた時の処理も最初の受付は NSView が行う。
Responses
Leave a Response