2010年7月16日金曜日

いまさら聞けないJavaFX 1.3 (2)

Media.sourceはscript-only.

script-onlyとは書き込み権限のことで、参考資料ではアクセス修飾子と呼ばれている。

picture.mediaPlayer.media.source = "aaa.svg";
のように書くためには、sourceの書き込み権限をpublicとかに変更する必要がある。ここを参照。なぜ保護されているかはわかっていない。
だがMediaクラスの変数であるsourceの書き込み権限は変えられないようだ。そこであとからファイルを変えたい場合は、URLを変えるのではなく、オブジェクトを変える。つまり次のような2行で書く。
var svg = Media { source : "aaa.svg" }
picture.mediaPlayer.media = svg;

(2010.7.17追記)と思ったら
picture.mediaPlayer.media = Media { source:"aaa.svg"}
でいいか。他の変数はどうかと思って初めてMediaのAPIをまじまじと見ると、Track[]ってRead onlyなこれって何だろう? media毎に勝手に設定できるなら分かる気がするが、read onlyってことは、元は何になるのか? fxd,flv,mp4などのコンテナでtrack情報が取れるものは何かそうした情報が入ってくるということ? しょうがない、やってみるか。

(2010.7.20 追記)間に追記していると、文章が分断してどうしょうもないが。
とあるmp4のtracks.nameを見ると、"Audio Track"と"Video Track"の2つが入っていた。これは一体何だろう。自分で撮ったビデオをiMovieで書き出したものだと思うので、iMovieで書き出すときに実は何かトラック名を指定出来るか、固定的に設定されてしまうのか。今確認するのは億劫。

(2010.8.16修正) 正:Scene  誤:Stage

ついでにStageSceneのサイズについて悩んだ点を書いておくと、media.width/heightにウィンドウを合わせたいのが人情というもの。でもStageSceneのheightにはウィンドウのタイトルバーの高さが含まれてしまっているので、それを足す。自分のmacの場合、22。

それとStageSceneのwidth/heightはpublic-initなので、Stage { scene:Scene { width : と書いてmp4のwidthを設定することが出来ない。そこでやはりこれもStageを変数に展開した後、新たなSceneのインスタンスにmedia.width/heightを設定して代入すれば良いのだが、実はそもそもStage.scene.widthがゼロでもmedia.widthで表示される。だからStageSceneのwidth/heightさえ合わせてやれば、mediaのサイズで表示される。sceneのサイズとは何だろう。mediaのサイズより小さくしたい場合は、縮小ならMediaView.fitWidthを小さくすれば良いが、等倍のまま部分的に表示したい場合はどうすれば良いか、わからない。何かのデモでアニメーションしながら映像をトリミングするようなものを見た気がするので、何かしら方法があるのだろうが。

(2010.8.16追記-->)と思ったら、

var mmv = MediaView {
mediaPlayer : MediaPlayer {
media : Media {
source:"sample.mp4"
}
}
}

var ms = Stage {
title: "Application title #1"
}

ms.scene = Scene { width:100
height:100
content:mmv
}
mmv.mediaPlayer.play();

これだけだとwidth/heightは利かず、極小サイズで表示されるが、この後、

ms.width = 100;
ms.height = 100;

を追加すると、100x100で表示される。ちなみに

ms.width = 100;
ms.height = 100;
mmv.mediaPlayer.play();

の順でも大丈夫だった。

(<--2010.8.16追記)

APIリファレンスを見ると、Media.sourceはpublic-initのStringだが、
class XMedia extends Media {
override package public var source : String;
}は出来ない。package publicや単にpublicでも同じ。

class DumMedia {
public-init var source:String;
}
class XMedia extends DumMedia {
override public var source : String;
}
は出来るが、同じソースファイル内に書いている(packageを分けていない)ので、比較になっていないかもしれない。が、packageを分けるのが面倒な今。

2 件のコメント:

  1. 通常はStageのwidthとheightは設定せずに、Sceneのwidthとheightを設定するようにしています。
    Sceneのwidth/heightを設定していないときは、AWTのFrameクラスのpackメソッドと同じ動作をしているようです。

    返信削除
  2. skrbさん、コメントありがとうございます。

    すみません、まずStageとScene、間違って書いていました。それから、再度確認したところ、Sceneの初期化時のheight/widthは利かず、後から変更すると利くようです(追記しました)。私が確認した範囲なので間違っていたらごめんなさいです。

    返信削除