- 2008年10月27日 02:54
- flash
自分用メモ。
leading で行間を指定しつつ、autoSize でサイズ調整を行うと、テキストを選択したときにスクロールしてしまう。
その原因と解決方法について書いてみる。
まずは、実際に leading + autoSize を設定。
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
const SAMPLE_TEXT:String = "テストテストテストテストテストテストテストテストテストテストテスト
テストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテス
トテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテ
ストテストテスト";
const LEADING_SIZE:Number = 4;
var textFormat:TextFormat = new TextFormat();
textFormat.leading = LEADING_SIZE; // leading を設定
var textField:TextField = new TextField();
textField.defaultTextFormat = textFormat;
textField.width = 300; // 横幅固定
textField.multiline = true; // 複数行設定
textField.wordWrap = true; //折り返し設定
textField.text = SAMPLE_TEXT;
textField.autoSize = TextFieldAutoSize.LEFT;
addChild( textField );
表示されたテキストを選択して、マウスカーソルを上下に動かすとスクロールする。Windows だとマウスホイールでスクロールしても動いてしまう。
この現象の原因
いろいろ検証してみた結果、スクロールしてしまうのは leading + autoSize を設定したときの height の値が誤りが原因だと判明。leading を設定すると、行間だけではなく最終行の下にもleading 値分のマージンができてしまうようだ。そのマージンが height に反映されていないためにスクロールしてしまうようだ。
解決策1
いったん autoSize を設定して、その height を保存した後で、 autoSize を TextFieldAutoSize.NONE に、height を 保存した height + leading の値 にする。
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
const SAMPLE_TEXT:String = "テストテストテストテストテストテストテストテストテストテストテスト
テストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテス
トテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテ
ストテストテスト";
const LEADING_SIZE:Number = 4;
var textFormat:TextFormat = new TextFormat();
textFormat.leading = LEADING_SIZE;
var textField:TextField = new TextField();
textField.defaultTextFormat = textFormat;
textField.width = 300; // 横幅固定
textField.multiline = true; // 複数行設定
textField.wordWrap = true; //折り返し設定
textField.text = SAMPLE_TEXT;
textField.autoSize = TextFieldAutoSize.LEFT;
var h:Number = textField.height;
textField.autoSize = TextFieldAutoSize.NONE;
textField.height = h + LEADING_SIZE;
addChild( textField );
選択してもスクロールしても動かない。
解決策2
テキストの選択とマウスホイールによるスクロールができないようにする。
textField.selectable = false;
textField.mouseWheelEnabled = false;
- Newer: Refsign Magazine を制作しました
- Older: 2008 夏〜秋 近況報告
