スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

RubyCocoaでアニメーション:表示している画像を入れ替える

 今度は、表示している画像を入れ替えてみよう。そのためには、レイヤーのcontents属性を変えてやればいい。新しくchangeボタンを追加して、このボタンがクリックされたら別の画像に変化するようにしてみる。
まずは、AppController.rbにインターフェースとなるib_actionを宣言する。

ib_action :changeContents

 ここでAppController.rbを保存し、MainMenu.nibをダブルクリックしてインターフェースビルダーで、画面にchangeボタンを配置し、AppController.rbとの間にコネクションを貼る。ここまで終わったら、再びXCodeに戻って、changeContentsに以下のコードを記述する。

def changeContents
bitmapImage = OSX::NSBitmapImageRep.imageRepWithContentsOfFile_(
'/Users/takayukiu/Documents/P1000342.jpg')
image = bitmapImage.CGImage()
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.contents=image
end

 見れば分かる通り、単純に別のファイルから新しいimageを作ってレイヤーのcontents属性に代入しているだけである。これでchangeボタンを押せば画像が新しいものに入れ替わる。フィルターの効果もそのまま残っているのが分かるはずだ。
 で、フィルターがあるから若干分かりづらいのだが、切り替わるときに短い時間だがフェードの効果がかかっている。実はこのcontents切り替わり時の効果もプログラムで変更することが出来る。これにはアクションという機能を利用する。詳細な説明は例によってアップルのドキュメントを参照して欲しい。
Core Animationプログラミングガイド;アクション
 いまいち分かりにくいかもしれないが、簡単に言ってしまうと、何かレイヤーの属性を変化させるような操作を行ったときに、自動的に発動するプログラムを登録しておくことが出来るしくみ、と言えばいいのだろうか。今回は、この機能を使って自分で定義した切り替え効果を実行する。

 まずは、使用する切り替え効果を作成する。これはトランジションアニメーションと呼ばれている。詳しい説明はリンク先を読んでもらうとして、さっそく使ってみよう。先ほど作成したchangeContentsで、レイヤーのcontentsにimageを代入している文の直前に、以下のコードを追加する。
transition = OSX::CATransition.alloc.init
transition.duration = 1.5
transition.type =OSX::KCATransitionPush
transition.subtype = OSX::KCATransitionFromRight

 これは、1.5秒かけてふるい画像を新しい画像が右から押し出して行く、という効果になる。次にこれをレイヤーのcontentsが変化したときのアクションとして登録する。
layerActions = OSX::NSMutableDictionary.alloc.init
layerActions.setObject_forKey_(transition,'contents')
layer.actions=layerActions

 これでビルドして実行し、changeボタンをクリックすると、画像が押し出されながら切り替わるようになるはずだ。

……ところが、これでめでたしめでたしとはならないのが厄介なところ。止まっているときにはこれでOKなのだが、アニメーションしている最中にchangeボタンをクリックするとおかしな動きをしてしまう。どうもOS側のバグのようなのだが……。
スポンサーサイト

Comment

Post comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。