- ベストアンサー
スクロールバーが一番下まで来たときにボタンを表示させる方法について
- スクロールバーを適用したテキストフィールドで、ボタンを一番下までスクロールバーが来た時に表示させたいです。しかし、どのように条件を設定すればよいのかわからず困っています。
- 自作のスクロールボタンでは、ボタンを押したときにmaxscrollなら表示するという条件設定で実現できましたが、コンポーネントの場合はどのようにすればよいのかわかりません。
- 使用している環境はWindows XPとFlash MX 2004です。お知恵をいただけると幸いです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
UIScrollBar コンポーネントを制御する UIScrollBar クラスには scrollPosition というプロパティがあります。 スライダの位置を管理しているもので、位置を取得するだけでなく、値を書き換えてスクロール対象の任意の部分を表示することもできます。 スクロール対象がテキストフィールドで縦のスクロールバーとして利用している場合、scrollPosition プロパティにはテキストフィールドの行が入っており、値の範囲は 1 ~テキストフィールドの maxscroll プロパティの値です。 (ヘルプには 0 ~ maxscroll - 1 とありますが、これはどうも誤りのようです) 正攻法で行くならば、scrollPosition の値を監視して maxscroll に達した時にボタンを表示する、というスクリプトでご希望の動作になるかと思います。 ・・・しかし、よく考えてみますと、スライダの位置の単位がテキストフィールドの行であるのならば、スライダの位置とは要するにテキストフィールドの scroll プロパティと同じ意味です。 つまり、何もスクロールバーにこだわらず「テキストフィールドの scroll プロパティを監視して maxscroll に達した時にボタンを表示する」と考えてもいいわけです。 テキストフィールドの scroll プロパティを監視するには、このプロパティが変更された時に呼び出される TextField クラスの onScroller イベントハンドラが便利です。 今回は onScroller イベントを使った例をご紹介します。 -------------------------------------------------------------------- 仮に、ステージにボタンシンボルのインスタンス” btn ”があるとします。 ステージにスクリプトでテキストフィールドを作り、スクロールバーのスライダでテキストの末尾を表示、つまりスライダが下端にある時に btn を表示、それ以外の時は非表示にするものとします。 スクリプトにしますと、大体、次のようになります。 このスクリプトはメインのタイムラインのフレームに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) //ボタンを非表示にしておく btn._visible = false; //空のテキストフィールド(幅200×高さ160)をX=100・Y=100の位置に作成 this.createTextField( "disp" , 0 , 100 , 100 , 200 , 160 ); //テキストフィールドの設定 //複数行・折り返しあり・境界線あり disp.multiline = true; disp.wordWrap = true; disp.border = true; //ダミーのテキストを表示 //(このテキストは作品に合わせて変更してください) disp.text = "・・・・・・・・・・・・・・・\n\n"; disp.text += "あいうえお\n"; disp.text += "カキクケコ\n"; disp.text += "1234567890\n"; disp.text += "ABCDEFG\n\n"; disp.text += "1234567890\n"; disp.text += "hijklmn\n\n"; disp.text += "○×△□\n"; disp.text += "!!!!!!\n" disp.text += "???\n\n"; disp.text += "・・・・・・・・・・・・・・・"; //テキストフィールドの文字サイズを20ptに設定 format = new TextFormat(); format.size = 20; disp.setTextFormat( format ); //スクロールバーを挿入し、テキストフィールドに関連付ける this.attachMovie( "UIScrollBar" , "sc_bar" , 1 , { _x : 300 , _y : 100 , _height : 160 } ); sc_bar.setScrollTarget( disp ); //テキストフィールドのscrollプロパティを監視 disp.onScroller = function() { //末尾を表示している時、ボタンを表示 if( this.scroll >= this.maxscroll ) { btn._visible = true; } //それ以外の時はボタンを非表示にする else { btn._visible = false; } }; ************************** スクリプトで作ったテキストフィールドに UIScrollBar コンポーネントを適用する方法と注意点は、以前 No.2287838 ( http://okwave.jp/kotaeru.php3?q=2287838 )でご紹介しました通りです。 HTML をなしにし、処理の順番が少々違っていますけれど、処理の内容は同じです。 今回のポイントは、テキストフィールドの scroll プロパティを監視する onScroller というイベントハンドラです。 ムービークリップの onEnterFrame などと同じ要領で、予め処理を定義しておくとイベントが起きた時に自動的に処理が行われるようになります。 このイベントは、テキストフィールドの scroll プロパティが更新された時に発生します。 UIScrollBar コンポーネントでは、スライダを動かすと、スライダの位置に応じた行に移動するために関連付けてあるテキストフィールドの scroll プロパティを書き換えます。 つまり、スライダを動かしてスクロールさせた時も onScroller イベントハンドラで定義した関数は呼び出されます。 イベント発生時にすることは、 ・ scroll プロパティを見る ・下端( = maxscroll )に達している時にボタンを表示、それ以外の時は非表示にする の、2点です。 これをそのまま関数にしています。 ボタンが他の階層内にある場合はターゲットパスの誤りにご注意ください。 ************************** 今回は扱いませんでしたが、スクロールバーのスライダの位置を管理している UIScrollBar クラスの scrollPosition プロパティを使っても同じ動作を実現できます。 コンポーネント特有のイベントを利用するには、on アクションでオブジェクトアクションとしてイベント処理を定義する方法と、リスナーオブジェクトというイベントを処理するオブジェクトを登録する方法の2通りがあります。 ただし、今回はスクロールバーを attachMovie で動的に挿入するため、on アクションは使用できません。 Flash のテクニカルノートに、リスナーオブジェクトを使った作例が載っています。 機会がありましたら研究してみてください。 コンポーネントによってイベントの名前などが違いますけれど、処理の流れ自体はどれも共通しています。 ・ Flash テクニカルノート:コンポーネント http://www.adobe.com/jp/support/flash/technotes.html#components
お礼
お礼が遅れて、大変申し訳ありません。 DPEさんのおっしゃる通りにしたところ、見事実現する事ができました。 丁寧に解説してくださり、本当にありがとうございます。