Flashの超・超初心者ネタです。。。 凄く久しぶりの Flash で操作に戸惑いながら、mp3 再生しようと思って MediaController で作ってみる・・・
再生できない!(爆)
ずっと前に、FLVPlayer を利用した記憶があったが、Flash コンポーネントには、MediaController と MediaDisplay と MediaPlayBack がある。 何だか、MediaController の使い方がよくわからなかったので、MediaPlayBack コンポーネントにしたらうまくいった。 この3つのコンポーネントの違いは、Flasher じゃないのと調べる気力がないのでやめます(苦)
MediaPlayBack を配置してインスタンス名をつける。 (例では、soundPlayer とした) [as3]
[/as3] fla ファイルのタイムラインの最初に記述。
[as3] var debug = false; var setting = new Array(); setting['sound_dir'] = "sounds/"; [/as3] 気休めにファイルを分割して設定ファイルを作成。
[as3] soundPlayer.controllerPolicy = "on"; soundPath = setting['sound_dir'] + sound_file_name; soundPlayer.autoPlay = false; soundPlayer.contentPath = soundPath; soundPlayer.load(); [/as3] sound_file_name は、htmlからの引数です。
引数は、FlashVars で渡してやります。 (例の場合、sound_file_name=19.mp3)
Xcode4 になってから Analize が優秀で、自分のコードが間違ってたりリークの原因を察知して 教えてくれます。
例えば、カスタムクラスを viewDidLoad なんかで生成して使い回したい場合、@synthesize してやりますが、以下のコードはあまり好ましくありません。
if (self.section == nil) self.section = [[Section alloc] init];
init したインスタンスを、self で経由しているのが問題。
if (self.section == nil) {
Section *_section = [[Section alloc] init];
self.section = _section;
[_section release];
}
と init → release と明示的にしてやるのが安全。
Xcode4.2 にしたら警告の検知の精度が向上し、バグ潰しも効率的になってきたかと。 そして UIActionSheet のスタイル「actionSheetStyle」に警告が。 以前から自分が間違って設定していたみたいです(汗)。。。
actionSheet.actionSheetStyle = UIBarStyleBlackTranslucent;
UIBar じゃなくて UIActionSheet の設定は、
actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
ただ定義を見てみると UIActionSheet も UIBar も同じ順番なので、何とか同じで動いてるのでしょう。
typedef enum {
UIActionSheetStyleAutomatic = -1, // take appearance from toolbar style otherwise uses 'default'
UIActionSheetStyleDefault = UIBarStyleDefault,
UIActionSheetStyleBlackTranslucent = UIBarStyleBlackTranslucent,
UIActionSheetStyleBlackOpaque = UIBarStyleBlackOpaque,
} UIActionSheetStyle;
ただ、将来的に UI の仕様が変わってしまうので警告は出来るだけ潰しておかないとです。
仕事がかなり立て込んでる中、2日間みっちり講習受けて Titanuim認定試験(TCAD)にギリギリ受かった。
75% 合格で 81% ... 危ない。 というか意外と問題が難しい。
てか本当は Titanium でアプリ作らないと意味がないんだけど・・・。 でも、仕事がきても集中砲火になりそうで困ったりする。
と、このところ JavaScript まみれな俺でした。
さんざん悩まされました。 2000 x 1000 ピクセル級の画像を何枚も一度に読み込んで、サムネイルでループを回していたので明らかに
UIImageView のメモリリーク
imageNamed をやめてキャッシュを無くす方法もだめで、ちゃんとサイズ縮小しようとネットで検索したところ、「カメラアプリの作り方 (3) - 写真を縮小して表示する」の方法で解決しました。
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];
CGSize size = {300, 300};
UIGraphicsBeginImageContext(size);
CGRect rect;
rect.origin = CGPointZero;
rect.size = size;
[image drawInRect:rect];
UIImage *newImage;
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Context 具体的には UIGraphicsBeginImageContext() と UIGraphicsEndImageContext() を利用して新たに画像を生成する方法です。
これは思いつかない方法でした。
UIScrollView のスクロールってデフォルトでは「びよーん」て引っ張れるけど、これをやめる方法。 delegate メソッドで CGPoint とって・・・とか考えたら。
プロパティ一発でした
[scrollView setBounces:NO];
なんと言う脱力感。。。 よくソース見ろよというネタでした。
関係ないですけど、ScrollView のデリゲートメソッド集の Wiki がありました。 UIScrollViewDelegate
ムービーを再生するには、MediaPlayer.framework をインポートし、MPMoviePlayerController を利用する事で、比較的簡単に実装する事ができます。
[iPhone] メディアプレイヤーで動画再生を参考に実装してみる。
- (void)playMovie:(NSString *)movieName {
NSString *path = [[NSBundle mainBundle] pathForResource:movieName ofType:@""];
NSURL *url = [NSURL fileURLWithPath:path];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
[player setShouldAutoplay:NO];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(finishPreload:)
name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
object:player];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(finishPlayback:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:player];
[player.view setFrame:CGRectMake(0, 0, 640.0f, 400.0f)];
[self.view addSubview:player.view];
}
- (void)finishPreload:(NSNotification *)aNotification {
MPMoviePlayerController *player = [aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
object:player];
}
- (void)finishPlayback:(NSNotification *)aNotification {
MPMoviePlayerController *player = [aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:player];
[player stop];
[player.view removeFromSuperview];
[player release];
}
NSNotificationCenter を利用して、プリロードや終了などを通知しています。 .h ファイルを見る限り delegate メソッドが記載されてないので、この方法なんでしょうね。
ただ、上記の場合は、自動連続再生とか複数に対応する場合のコードですかね? 普通に再生するだけなら Notification は使わなくてもいいんじゃないかな?と思います。
なので、手動でコントロールする場合は、MPMoviePlayerController を @synthesize してアクセスすればよいかと。 その際、メモリリークしないように release とかどこかしらでしないといけないと思いますが・・・。
- (void)playMovie:(NSString *)movieName {
NSString *path = [[NSBundle mainBundle] pathForResource:movieName ofType:@""];
NSURL *url = [NSURL fileURLWithPath:path];
initWithContentURL:url];
if (self.moviePlayer != nil) [moviePlayer release];
self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
[self.moviePlayer setShouldAutoplay:NO];
[self.moviePlayer.view setFrame:CGRectMake(0, 0, 640.0f, 400.0f)];
[self.view addSubview:self.moviePlayer.view];
}
CoreAnimation で View を点滅させてみる。
- (void)blinkImage:(UIImageView *)target {
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.duration = 1.0f;
animation.autoreverses = YES;
animation.repeatCount = HUGE_VAL;
animation.fromValue = [NSNumber numberWithFloat:1.0f];
animation.toValue = [NSNumber numberWithFloat:0.5f];
[target.layer addAnimation:animation forKey:@"opacityAnimation"];
}
CABasicAnimation で opacity を設定。 無限ループは HUGE_VAL 定数を利用する。
--2012/05/19追加
- (void)blinkImage:(UIImageView *)target {
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
animation.duration = 1.0f;
animation.repeatCount = HUGE_VAL;
animation.values = [[NSArray alloc] initWithObjects:
[NSNumber numberWithFloat:1.0f],
[NSNumber numberWithFloat:0.0f],
[NSNumber numberWithFloat:1.0f],
nil];
[target.layer addAnimation:animation forKey:@"blink"];
}
vimの画面分割コマンドはよく忘れてしまう。 ということで、viエディターでの画面分割 を参考にメモ。
:sp 画面を上下に分割 :sp ファイル名 指定したファイルを分割した画面に表示
ちなみに、既に開いているファイルは swp するので注意。
Ctrl-w をベースとしたショートカット
Ctrl-w w 画面間の移動 Ctrl-w p 画面間の移動 Ctrl-w k 上画面移動 Ctrl-w j 下画面移動 Ctrl-w l 右画面移動 Ctrl-w h 左画面移動 Ctrl-w + 画面を一行分大きくする Ctrl-w - 画面を一行分小さくする Ctrl-w = 画面サイズを同じにする
:e パス
ファイルを開く場合、現在開いているパスから相対パスで指定でき、[Tab]キーでファイルパスを補完できる。
これで、マウス使わずに他のファイルを参考したりコピペとかできるけど、作業効率的にどっちがよいかな?