• ベストアンサー

スクロールさせたテキストをボタンクリックで先頭に

テキストフィールドにloadVariablesNumで読み込んだダイナミックテキストをスクロールさせています。この時にスクロールさせたテキストをボタンクリックで先頭に戻したいのですが、どのように手法があるでしょうか?単純に考えると読み込み直すのかなとも思いますが、良い方法がありましたら、アドバイスください。 先に"テキストフィールド+UIScrollBar"の質問で無事解決しましたので、その補足で質問すればよかったのですが、締め切ってしまいましたので、再度、投稿させて頂きました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1700276

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

テキストフィールドを制御する TextField クラスには、表示する行を管理している scroll と maxscroll というプロパティがあります。 scroll が現在表示する行の先頭、maxscroll は scroll プロパティが取り得る最大値(テキストの総行数から、テキストフィールド内に表示可能な行数を引いた値)です。 scroll プロパティを書き換えると、任意の行を表示できます。 先頭を表示するボタンを、ボタンシンボルとして作ります。 ムービークリップで作ると、ターゲットパスの問題が絡んでややこしくなります。ムービークリップにする理由が特にないのであれば、ボタンシンボルで作った方が簡単です。 このボタンを、テキストフィールドと同じ階層に配置します。例えば、テキストフィールドがステージにあるなら、このボタン(のインスタンス)もステージに配置します。 テキストフィールドにはインスタンス名を付けます。ここでは仮に、disp と付けたとします。 先頭に戻すボタンのインスタンスに、クリック時にテキストの先頭を表示するスクリプトを書きます。 このスクリプトは、次のようになります。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  on(release)  {   //テキストの先頭を表示   disp.scroll = 1;  } ちなみに、  on(release)  {   //テキストの末尾を表示   disp.scroll = disp.maxscroll;  } とすると、テキストの最後の部分を表示するボタンになります。 scroll プロパティに決まった値を入れるのではなく、一定の値ずつ加減していくと、テキストをスクロールさせることができます。 これを応用すると、スタッフロールのように流れていくテキストや、押している間、自動的にスクロールさせるボタンなども作れます。 UIScrollBar コンポーネントでも、このプロパティを更新することでテキストをスクロールさせています。 スクロールバーによるスクロールは、スライダが動くたびにスライダの位置から表示する行を決め、scroll プロパティを操作して該当する行を表示する仕組みになっています。

rootster
質問者

補足

DPEさんありがとうございます。 最後の行はdisp.scroll = disp.maxscroll;でうまくいったのですが、最初の行のdisp.scroll = 1;がうまくいきません。disp.scroll = disp.minscroll;で最初の行を表示しますが、これで大丈夫でしょうか? それとこの前のUIScrollBarの質問でその後、不明点が出てしまいまして、大変申し訳ないのですが、この場で質問させてください。 loadVariablesNumで外部テキストを読み込んだ際、HTMLのタグを認識していたのですが、アドバイス頂いた下記のスクリプトを追加した場合、スクロールバーの動作はOKなのですが、タグをそのままテキストとして表示してしまいます。これは回避できないでしょうか? _root.onData = function() { disp.text = _root.sample; }; 質問の手順も滅茶苦茶になってしまい、大変申し訳ありませんが、どうぞ、よろしくお願いします。

その他の回答 (2)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.3

OSやブラウザで表示されるスクロールバーもそうですが、トラックの長さは一定です。 スクロールさせる対象が長いほどスライダが短くなり、その分、トラック内を移動できる距離が長くなります。 しかし、どんなに長い対象をスクロールさせる時でも、スライダはドラッグできなくなるほど短くなるのではなく、ある一定の大きさよりは縮まず、その代わり1度のドラッグで移動する量を調整することで距離を稼いでいます。 UIScrollBar もOSやブラウザのスクロールバーと同様に、どんな長さの対象でもスクロールできるように作られています。 このように汎用的なスクロールバーを作るには、スクリプトの知識はもちろんですが、スクロール対象の長さに応じてスライダの大きさを調整するための計算式を立てられる、数学的なセンスや発想も必要になります。 スクロールさせる長さが常に一定の場合は、スライダの長さや移動量などを調整する必要がありません。 スクロールバーは、トラックの長さがスクロール対象全体の長さ、スライダの長さが画面に表示される部分に対応しており、スライダとは逆の方向にスクロール対象を動かせばいいのです。 テキストだとちょっと難しいですけれど、ムービークリップをスクロールさせるスクロールバーは _x や _y プロパティを使って計算・制御できるので、テキストよりも分かりやすいと思います。 UIScrollBar コンポーネントは実は、スライダを動かした時にイベントが発生して、スライダが動いたことを知らせてくれます。 これを利用して独自のスクロール処理にも応用できるのですが、自作する場合は、何も、スライダが動いた時だけにこだわる必要はありません。 ムービークリップの制御、特に移動とドラッグの処理、それから、ムービークリップから他のムービークリップを制御する方法をマスターしたら、ぜひチャレンジしてみてください。 ------------------------------------------------------------ 押している間スクロールさせるボタンは、ボタンシンボルでは少々面倒なので、ムービークリップシンボルで作ります。 ムービークリップやテキストフィールドの制御をご理解なさっていれば、こちらはスクロールバーほど難しくはないです。 press や release イベントは、ボタンおよびムービークリップをクリックした時やクリックしてボタンを離した、その時1回しか発生しません。 これらのイベントを利用したスクリプトが実行されるのは、イベントが発生した時1度限りです。 ムービークリップには、ムービークリップがステージに存在している間、常に発生している enterFrame というイベントがあります。 enterFrame を利用すると、連続的にスクリプトを実行させることができます。 押している間スクロールさせるには、press イベント発生時にスクロールの処理を開始し、enterFrame イベントのこの特徴を利用して scroll プロパティを書き換え、release イベント発生時にスクロール処理を終了させます。 この作例は長くなりますので、また別の機会に。

rootster
質問者

お礼

ありがとうございます。少しずつ、やっていきます。また、具体的に質問ができるようになりましたら、よろしくお願いします。今回は本当にありがとうございました。

  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

テキストフィールドのインスタンス名を disp にして、disp.scroll = 1; で先頭行が表示されますが。 上手くいかないとは、どのような不具合が起きているのでしょうか。 全く反応がない場合は、テキストフィールドの名前が違う・ボタンがムービークリップインスタンスになっているなどの誤りだと思います。 とりあえず scroll プロパティに 2 や 3 など適当な数字を代入してみて、指定の行に移動できるかどうか確認してみてください。 正常に移動するのなら、1 にすれば先頭に移動できるはずです。 TextField クラスに minscroll というプロパティはありません。 scroll プロパティが取り得る最大値はテキストの長さにより変動しますが、最小値はどのテキストフィールドでも必ず 1 なので、わざわざこのようなプロパティを用意する意味がないからです。 それでも先頭に移動するのは、minscroll が未定義になっていて scroll プロパティに入ってはいけない値が入り、誤動作を防ぐために内部で自動的に 1 に修正されているからではないかと思います。 動作上は別に問題はないですが、正しい使い方とは言えません。 -------------------------------------------------- HTML タグを付けたテキストを表示する時は、テキストフィールドの HTML レンダリングを ON にして、HTML タグを解釈した状態の内容を保持する htmlText というプロパティを書き換えます。 text プロパティを書き換えると、タグが付いたままのテキストが表示されてしまいます。 onData = function の部分を、次のように変更してください。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  _root.onData = function()  {   //HTMLレンダリングをONにする   disp.html = true;   //HTMLタグを解釈して表示   disp.htmlText = _root.sample;  }; テキストフィールドを選択した状態で「プロパティ」パネルを見ると、「単一行」などを設定するリストの横に小さなボタンが3つ並んでいます。 この中の中央のボタン(”<>”ボタン)をクリックして反転させると、HTML のレンダリングが ON になり、disp.html = true; と同じ意味になります。

rootster
質問者

補足

ありがとうございます。DPEさんの言われるとおりでした。はじめにdisp.scroll = 1;で動かなかったのは、恐らくインスタンス名などの間違いで、その後、何度かリトライしながら、最終行の表示はできるようになりましたので、単純にmaxscrollの部分に1を代入してdisp.scroll = disp.1;と謝った記述をしていたようです。何度も確かめたつもりなのですが、お手数をおかけして申し訳ありません。 >それでも先頭に移動するのは、minscroll が未定義になっていて scroll プロパティに入ってはいけない値が入り、誤動作を防ぐために内部で自動的に 1 に修正されているからではないかと思います。 maxscrollで動作するのだから、反対の意味を素人考えで指定したところ、動作したので驚きました。そういう理由なのですね。 DPEさんの回答のおかげで、十分満足するのもが作れそうなのですが、前の回答にあった"押している間、自動的にスクロールさせるボタン""スライダが動くたびにスライダの位置から表示する行を決める"という2点はわたしのレベルでは難しいでしょうか? HTMLのタグの件、問題なく動作しました。何度も本当にありがとうございます。

関連するQ&A