TextFieldメモ(1) 外部css/TextFormat

ActionScript3.0 — Tags: , , — chimanaco @ 2:28 PM このエントリをはてなブックマークに追加

TextFieldの装飾関係はTextFormatを適用させれば色々できるのですが結構使えなくて、xhtml/cssであっさりできる「デフォルトでは下線があってオンマウスで下線非表示」なんてこともできません。そこで外部cssを使って実装してみます。

参考にさせて頂いたページ

TextFieldにはスタイルシートを適用させることができます。といってもサポートされているのスタイルプロパティはさほど多くありません。(ここで確認できます。)

以下のcssを適用させてみます。

p
	{
	color:#000000;
	font-size:14;
	leading:10;
	}

a
	{
	color:#FF0000;
	text-decoration:underline;
	}

a:hover
	{
	text-decoration:none;
	}

.textGreen
	{
	font-weight:bold;
	color:#006600;
	}

line-heightが使えないのでleadingとプロパティを代わりに使っています。数値の単位はだいぶ違うけど。asの方はこんな感じ。

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.net.URLLoader;
	import flash.text.StyleSheet;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFieldAutoSize;

	public class TextTest extends Sprite
	{
		//css読込
		private var cssLoader:URLLoader;

		//コンストラクタ
		public function TextTest():void {
			init();
		}

		public function init():void
		{
			//外部css読込
			var cssRequest:URLRequest = new URLRequest("text.css");
			cssLoader = new URLLoader();
			cssLoader.load(cssRequest);
			cssLoader.addEventListener(Event.COMPLETE, onCssLoaded);
		}

		function onCssLoaded(event:Event):void
		{
			try
			{
				//Text
				var myText:String = "<p>";
				myText += "そりゃもうあんた、<br>";
				myText += "<a href='http://chimanaco.net/blog/'>リンクしちゃうし</a><br>";
				myText += "<span class='textGreen'>色も変えちゃうよ</span>";
				myText += "</p>"; 

				//TextField
				var tf:TextField = new TextField();
				tf.x = 50;
				tf.y = 50;
				tf.width = 200;
				tf.multiline = true;
				tf.autoSize = TextFieldAutoSize.LEFT;
				tf.wordWrap = true;
				tf.border = true;
				tf.borderColor = 0x000000;

				//css適用
				var ss:StyleSheet = new StyleSheet();
				ss.parseCSS (cssLoader.data);
				tf.styleSheet = ss;

				tf.htmlText = myText;

				//表示リストに追加
				addChild(tf);

			}
			catch (err:TypeError)
			{
				trace(err.message);
			}			

		}

	}
}

外部cssの読込が完了したら、TextField作成→css適用→表示リストに追加という流れです。少しはまったのが、cssの適用を実際にテキストを入れる、

tf.htmlText = myText;

より後に記述してしまうとちゃんと適用されません。ちょっと考えれば当たり前の話ですが。

やりたかった:hoverの指定も効いてるしこれでできたーと想いきや問題あり。leadingで行間を指定したところに、autoSizeでサイズ調整を行うと、テキストを選択してマウスカーソルを上下に動かすとスクロールしてしまいます。マウスホイールでもスクロールしちゃう(win)。autoSizeを入れないと表示がおかしくなるので取るわけにもいかないし…解決策はnondelion.com様の記事にありました。そのやり方の1つが、

いったん autoSize を設定して、その height を保存した後で、 autoSize を TextFieldAutoSize.NONE に、height を 保存した height + leading の値 にする。

ということでleadingをasの方で指定する必要があり、cssからはleadingの設定を削除。

p
	{
	color:#000000;
	font-size:14;
	}

asの方でtextFormatを使ってleadingの設定を行い、

//leading
const LEADING_SIZE:Number = 10;
//TextFormat
var textFormat:TextFormat = new TextFormat();
textFormat.leading = LEADING_SIZE;

以下の設定を行う。

var h:Number = tf.height;
tf.autoSize = TextFieldAutoSize.NONE;
tf.height = h + LEADING_SIZE;

というわけでスクロール問題は解決。しかしtextFieldもう少し使いやすくできんものか…。
あと、SyntaxHighlighterの中で打ち消し文字を使うにはどうすればいいんだろ?

0 Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

Comments links could be nofollow free.

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2010 chimanaco blog | powered by WordPress with Barecity