Creative Wrong Answer

ExternalInterface 세번째 입니다.

ExternalInterface가 뭔지 전혀 모르겠다 하시는 분은
2009/12/30 - [Flex/ExternalInterface] - ExternalInterface 기본기
이 포스트를 먼저 읽어 보고 오시면 됩니다.

자바스크립트에는 유용한 기능들이 많습니다.
가장 많이 사용하는 window 객체에는 브라우저의 정보 및 페이지 정보를 알아올수 있는 메서드들이 포함되어있는데 페이지 정보는 location에 들어있습니다. 그중 몇가지를 살펴보면 아래와 같습니다.

window.location.href
주로 페이지 이동시에 많이 사용했던 속성인데 저 자체로는 현재 페이지의 정보를 가지고 있습니다.

아무사이트나 들어간 후에 주소창에 javascript:window.location.href 라고 쓰게 되면 현재 페이지 주소가 나타납니다.
자바스크립트는 클라이언트에서 직접 실행되는 스크립트이기 때문에 기본 메서드 같은 경우 이런식으로 브라우저 주소창에 쓰면 대부분 실행됩니다.

window.location.hostname
페이지의 호스트 주소 정보를 반환합니다.

window.location.pathname
호스트 네임 뒤로 실제 페이지까지의 경로를 반환합니다.

window.location.search
주소 부분에서 get방식으로 넘어온 파라미터 부분을 반환합니다.
이게 중요합니다.
플렉스에서 get방식의 파라미터를 받아올때에도 이것을 사용합니다.

간단하게 예제를 봅시당.

주소 예제 : http://rinn.kr/post/aa.html?blogID=rinn&name=퍼플린

window.location.href : http://rinn.kr/post/aa.html?blogID=rinn&name=퍼플린
window.location.hostname : rinn.kr
window.location.pathname : /post/aa.html
window.location.search : ?blogID=rinn&name=퍼플린

딱 보면 뭘 어떻게 사용해야 할지 감이 오실꺼라 생각됩니다.

HTML 페이지나 플렉스 어플리케이션에서 새창으로 다른 어플리케이션을 띄우면서 파라미터를 넘겨줘야 하는 경우가 생기는 상황이 많이 발생합니다.
내부에 로드 하는 경우는 여러가지 방법으로 데이터를 교환 할수 있지만 브라우저 자체가 달라지는 경우 에는 좀 힘들게 됩니다.

플렉스에서 넘어온 파라미터를 받는 Application.application.parameters 같은 경우 flashVar 로 넘어오는 것만 받을수 있습니다.
따라서 플렉스의 swf 를 임베드 할때에 파라미터를 같이 세팅 해줘야 하고 자바스크립트로 배열을 미리 만들어놓는다거나 해서 받아오도록 처리했었습니다.
데이터가 많아지거나 가변적이거나 할 경우 이런 방법은 꽤나 버그를 유발할수 있는 소지가 많습니다.

직접 주소를 가져다가 그냥 짤라서 사용하기만 하면 되니 이쪽이 더 쉬울꺼라 생각됩니다.

어플리케이션간에 파라미터 이동을 나만 고민 하지는 않았겠지요.
당연합니다 구글에 이미 사용이 가능한 소스도 있습니다


public static function getParameterValue(key:String):String
{ 
	var value:String;
	var uparam:String = ExternalInterface.call("window.location.search.toString");
	
	if(uparam==null)
	{
    	return null;
    }
    var paramArray:ArrayCollection = new ArrayCollection(uparam.split('&'));
    for(var x:int=0; x-1)
    	{
    		value = (p.replace((key + '='), '')).replace('?','');
    		x=paramArray.length;
    	}
    }
    
    return value;
}
깔끔하게 키값으로 받아올수 있도록 구현되어있습니다.


ExternalInterface.call("window.location.search.toString");

이렇게 직접 호출한 놈을 가지고 파싱해서 키에 맞는 value 값을 리턴해줍니다.

아래의 소스는 key-value 의 object로 넘어온 놈들을 전부 리턴 해주는 함수 입니다.


public static function getAllParameters():Object
{
	var _params:Object = {};
	var uparam:String = ExternalInterface.call("window.location.search.toString");
	
	if(uparam==null)
	{
    	return null;
    }
	
	uparam = uparam.replace('?','');
	
	var params:Array = uparam.split('&');
	var length:uint = params.length;
	
	for (var i:uint=0,index:int=-1; i<length; i++) 
	{
		var kvPair:String = params[i];
		if((index = kvPair.indexOf("=")) > 0)
		{
			var key:String = kvPair.substring(0,index);
			var value:String = kvPair.substring(index+1);
			_params[key] = value;
		}
	}
	return _params;
}

이처럼 자바스크립트를 사용할수 있는 Externalinterface는 활용할수 있는 부분이 꽤 많습니다.
이 글을 보시게 되는 분들도 좋은 방법이 있으면 저한테도 공유좀 부탁드립니다 -ㅅ-;;;




ps.
전체를 가져오는 소스와 키로 받아오는 소스는 제작자가 다른 소스 입니다.
북마크를 날려먹은 관계로 원본 블로그 주소를 찾을수가 없군요.
이곳저곳에서 퍼다가 링크 걸어놓은 주소는 있는거 같은데.. 쩝;
아시는분은 댓글로 남겨주시면 제작자 블로그 링크를 추가 하도록 하겠습니다.

저작자 표시 비영리 동일 조건 변경 허락
신고

Comment +2

  • 트랙백 감사합니다. ExternalInterface를 이용해 JS의 API를 사용하는 것은 좋은 방법이긴 하지만 약점도 있습니다. 바로 웹브라우져에서 동작하지 않고 독립 Flash Player에서 동작하거나 AIR에서 동작하는 경우입니다. 이때는 ExternalInterface를 이용하는 것자체가 무의미합니다. 물론 반드시 웹브라우져에서 동작한다는 것을 가정한다면 상관없습니다. ^^

    • 브라우저에서만 가능 하다는 내용은 기본기쪽을 쓰면서 언급 하기는 했습니다.

      아무래도 작업 하는쪽이 웹쪽만 작업 하다보니 별 생각없이 사용하게 되는거 같어요 ㅎㅎ

by 퍼플린 | 2009/07/30 13:53

selectedIndex를 변경시켜주는 시점을 결정하기 위해서 list가 업데이트가 끝났다는 이벤트를 받아서 완료되면 인덱스를 수정해주는 것이다. 이처럼 Flex나 Flash는 몇몇 method를 제외하고는 비동기로 동작하기 때문에 데이터의 수정이나 삭제 입력시에 ...

 

위글에서 이어지는 포스트이니 이전글을 보고 오는것도 좋다.
------------------------------------------------------

 

이전 글에서 리스트 내부의 아이템을 위로 옮기는 걸 했는데.

보면 알겠지만 뭔가 부족하다..

 

리스트가 길어질경우 현제 옮기고 있는 아이템이 리스트에서 보이지 않고 스크롤을 해야 보이기 때문에 위치이동이 많을 경우 스크롤을 내려서 확인 하고 하는등 애로사항이 꽃피게된다.

 

그래서 이번에는 하는김에 상하로 움직이는 것과 움직임에 맞춰서 스크롤 포지션을 옮겨주는 것을 구현해서 마무리 짓도록 하자.

 

Flex에는 horizontalScrollPosition, verticalScrollPosition, maxhor..등등..

스크롤 위치에 관한 속성이 미리 정의 되어있기 때문에 저걸 살짝만 건드려주면 원하는 결과를 얻을수 있다.

 

여기서는 List 컴포넌트를 사용하고 있기 때문에 가로 스크롤은 제외하고 세로스크롤만을 가지고 만든다.

 

스크롤포지션 값은 리스트에서 보여지는 갯수(rowCount)와 전체 개수를 기준으로 결정된다.

이것을 maxVerticalScrollPosition 값으로 알수 있다.

 

만약 데이터가 4개 이고 rowCount가 4라면.. maxVerticalScrollPosition값은 0이다.

데이터가 4개이고 rowCount가 3이라면 maxVerticalScrollPosition 값은 1이다.

한화면에 보여줄수 있는 것이 세개인데 데이터는 네개 이므로 아래로 한번더 스크롤 할수 있다.- 이런뜻이다.

 

이것만 알고 있으면 쉽게 구현이 가능하다.

 

소스코드를 보자.

 

 

import mx.events.FlexEvent;

private var arrData:Array;
private var idx:int;
private var posFlag:Boolean;

private function init():void
{
	arrData = [];
	arrData.push({label:"데이터1", data:"data1"});
	arrData.push({label:"데이터2", data:"data2"});
	arrData.push({label:"데이터3", data:"data3"});
	arrData.push({label:"데이터4", data:"data1"});
	arrData.push({label:"데이터5", data:"data2"});
	arrData.push({label:"데이터6", data:"data3"});
	arrData.push({label:"데이터7", data:"data1"});
	arrData.push({label:"데이터8", data:"data2"});
	arrData.push({label:"데이터9", data:"data3"});
	list.dataProvider = arrData;
}

private function posUp():void
{
	if(list.selectedItem && list.selectedIndex != 0)
	{
		idx= list.selectedIndex;
		posFlag = true;
		
		var tmpArr:Array = arrData.splice(idx,1);
		arrData.splice(idx -1,0,tmpArr[0]);
		list.dataProvider = arrData;
		list.addEventListener(FlexEvent.UPDATE_COMPLETE, setListIndex);
	}
}

private function posDown():void
{
	if(list.selectedItem && list.selectedIndex != arrData.length-1)
	{
		idx = list.selectedIndex;
		posFlag = false;
		
		var tmpArr:Array = arrData.splice(idx,1);
		arrData.splice(idx+1,0,tmpArr[0]);
		list.dataProvider = arrData;
		list.addEventListener(FlexEvent.UPDATE_COMPLETE, setListIndex);
	}
}

private function setListIndex(e:FlexEvent):void
{
	list.removeEventListener(FlexEvent.UPDATE_COMPLETE, setListIndex);
	list.selectedIndex = idx-1;
	
	if(posFlag)
	{
		list.selectedIndex = idx-1;
	}
	else
	{
		list.selectedIndex = idx+1;
	}
	var pos:int = list.selectedIndex-list.rowCount+1;
	list.verticalScrollPosition = (pos > 0)? pos:0;
}

 

추가된것은 별게 없다

 

posUp 함수는 선택된놈을 위로 올리는것 posDown은 내리는것 posFlag는 위로 올리는지 아래로 내리는지에 대한 Flag이다.

list는 List 컴포넌트고 해당 리스트의 rowCount는 4로 세팅되어있다.

 

마지막 setListIndex 함수를 보면

var pos:int = list.selectedIndex-list.rowCount+1;
list.verticalScrollPosition = (pos > 0)? pos:0;

 

이부분이 스크롤을 세팅해주는 부분이다.

 

selectedIndex를 기준으로 스크롤포지션을 세팅해준다.

조금만 보면 쉽게 이해할 수 있을꺼라 생각된다.

 

 

posUp 함수와 posDown 함수는 인덱스를 +1 해주느냐 -1 해주느냐의 차이밖에 없기 때문에 합쳐서 만들수도 있을꺼고. posFlag같은 경우도 이벤트를 받아서 처리한다던지 하게 되면 소스코드는 훨씬 간단하게 수정될 것이다.

 

선택된 놈이 가운데에 오게 한다거나 하는 것도 숫자놀이를 조금 하면 쉽게 세팅할 수 있을꺼라 생각한다.

 

이부분은.. 혹시나 이글을 읽는분께 -ㅅ-;;

신고

Comment 0

리스트의 아이템을 선택해서 위치를 위로 올려주는 프로그램이다.

 

private var arrData:Array;
private var idx:int;
			
private function init():void
{
	arrData = [];
	arrData.push({label:"데이터1", data:"data1"});
	arrData.push({label:"데이터2", data:"data2"});
	arrData.push({label:"데이터3", data:"data3"});
	list.dataProvider = arrData;
}
			
private function posUp():void
{
	if(list.selectedItem && list.selectedIndex != 0)
	{
		idx= list.selectedIndex;
		var tmpArr:Array = arrData.splice(idx,1);
		arrData.splice(idx -1,0,tmpArr[0]);
		list.dataProvider = arrData;
		list.selectedIndex = idx-1;
		trace(list.selectedIndex);
	}
}

 

List 컴포넌트의 아이디는 list 이고 버튼을 클릭하면 posUp()함수가 호출된다.

 

dataProvider 로 쓰이는 arrData 배열을 편집해서 선택한것을 한단계 위로 올리고 그것을 다시 List의 dataProvider로 세팅해준다.

 

이후에 list의 selectedIndex를 idx-1 값으로 즉 이전 선택 인덱스-1의 값으로 만들어준다. 위 코드로 만들게 되면 한번은 실행이 정상적으로 되는 것처럼 보인다.

세번째 데이터를 선택하고 버튼을 눌러서 posUp()을 호출하면 화면상에서 보이는 위치와 선택된 상태가 바뀐다. 즉, selectedIndex가 2 에서 1로 바뀌는 것처럼 보인다.

하지만 아랫줄의 trace 값에서 list.selectedIndex를 찍어보면 1이 아니고 2로 나온다..

 

이전의 selectedIndex가 그대로 호출되는 것이다.

 

 한번더 버튼을 누르면 2번이 1번으로 올라가지 않고 2,3 번이 위치를 바꾸는 기현상이 일어난다.

 

 

이 코드를 정상 작동하게 만들기 위해서는 아래처럼 수정한다.

import mx.events.FlexEvent;
			
private var arrData:Array;
private var idx:int;
			
private function init():void
{
	arrData = [];
	arrData.push({label:"데이터1", data:"data1"});
	arrData.push({label:"데이터2", data:"data2"});
	arrData.push({label:"데이터3", data:"data3"});
	list.dataProvider = arrData;
}
			
private function posUp():void
{
	if(list.selectedItem && list.selectedIndex != 0)
	{
		idx= list.selectedIndex;
		var tmpArr:Array = arrData.splice(idx,1);
		arrData.splice(idx -1,0,tmpArr[0]);
		list.dataProvider = arrData;
		list.addEventListener(FlexEvent.UPDATE_COMPLETE, handler);
	}
}
			
private function handler(e:FlexEvent):void
{
	list.selectedIndex = idx-1;
}

 

selectedIndex를 변경시켜주는 시점을 결정하기 위해서 list가 업데이트가 끝났다는 이벤트를 받아서 완료되면 인덱스를 수정해주는 것이다.

 

 

이처럼 Flex나 Flash는 몇몇 method를 제외하고는 비동기로 동작하기 때문에 데이터의 수정이나 삭제 입력시에 해당 행위가 끝났는지를 파악해서 이후의 작업을 하는 것이 중요한 경우가 있다.

list.dataProvider = arrData;
list.selectedIndex = 1;

이렇게 실행시켰을때 코드 한줄 차이로 바로 아래에 있지만 list.selectedIndex=1이 호출되는 시점에서 list.dataProvider가 null 일수도 있다.

이런 문제는 발생하는 경우도 있고 어떤때는 정상적으로 실행되는것처럼 보이기도 하기 때문에 인지하지 못하고 있으면 어디에서 문제가 생겼는지 찾지 못해서 머리를 쥐어뜯게 되는 경우가 생길수도 있다.

 

이벤트를 이해하고 정상적으로 처리될 수 밖에 없도록 프로그래밍을 하는것이 최고의 방법일 것이다.

 

 

List 상하로 변경하기 2 - 스크롤포지션 세팅

신고

Comment +3

  • 이 포스트 덕에 많은 도움이 되었습니다.
    감사합니다.

  • selectedIndex를 변경하는건 바로 변경이 되지를 않네요. selectedItem을 이용하여 array에서 지정된 index에 해당하는 아이템을 찾은후에

    list.selectedItem = arrData[idx-1];

    위와 같이 하면 이벤트 처리 없이 선택할 수도 있겠네요.

    • 도움이 됐다니 다행입니다.

      item이나 index나 사실은 똑같은 놈을 가리키고 있으니 어느쪽을 사용해도 별 문제는 없다고 생각합니다.

      다만 이벤트를 사용하는 것이 아무래도 런타임에 발생하는 오류의 빈도를 줄일 수 있다라는 것이 포스트의 요지입니다.

      관리만 잘된다면 이벤트가 편하긴 하죠. 직관적으로 코드 읽기는 역시 직접 세팅이 좋지만요 ㅎㅎ

package {
	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.net.URLRequest;
	
	[SWF(width="1000", height="1000", frameRate="24", backgroundColor="#FFFFFF")]
	
	public class bitmapDataHandle extends Sprite
	{
		private var container:Sprite;
		private var bitmap:Bitmap;
		private var loader:Loader;
		public function bitmapDataHandle()
		{
			loader = new Loader();
			loader.load(new URLRequest("cat.jpg"));
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadHandler);
		}
		
		private function loadHandler(e:Event):void
		{
			loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadHandler);
			bitmap = loader.content as Bitmap;
			loader.unload();
			
			container = new Sprite();
			container.addChild(bitmap);
			container.addEventListener(MouseEvent.CLICK, clickHandler);
			addChild(container);
			
		}
		
		private function clickHandler(e:MouseEvent):void
		{
			var pixelValue:uint = bitmap.bitmapData.getPixel(mouseX,mouseY);
			trace("x : "+mouseX+" y: "+mouseY);
			trace("선택한 곳의 색상값 : "+pixelValue.toString(16));
		}
	}
}

까페에 질문글이 올라와서 급조한 테스트..

bitmapData에는 pixel을 이용해서 여러가지 작업을 할수 있다. 그중에 getPixel은 선택한 곳의 해당 픽셀값을 가져온다.

 

getPixels () 메서드  

public function getPixels(rect:Rectangle):ByteArray
언어 버전: ActionScript 3.0
런타임 버전: AIR 1.0, Flash Player 9

픽셀 데이터의 사각형 영역에서 바이트 배열을 생성합니다. 픽셀별로 부호 없는 정수(곱하지 않은 32비트 픽셀 값)를 바이트 배열에 씁니다.

매개 변수

rect:Rectangle — 현재 BitmapData 객체의 사각형 영역입니다.

반환값
ByteArray — 해당 Rectangle의 픽셀을 나타내는 ByteArray입니다.

오류
TypeError — rect가 null입니다.
getPixels () 메서드  
public function getPixels(rect:Rectangle):ByteArray
언어 버전: ActionScript 3.0
런타임 버전: AIR 1.0, Flash Player 9

픽셀 데이터의 사각형 영역에서 바이트 배열을 생성합니다. 픽셀별로 부호 없는 정수(곱하지 않은 32비트 픽셀 값)를 바이트 배열에 씁니다.

매개 변수

rect:Rectangle — 현재 BitmapData 객체의 사각형 영역입니다.

반환값
ByteArray — 해당 Rectangle의 픽셀을 나타내는 ByteArray입니다.

오류
TypeError — rect가 null입니다.

 

테스트 함수 만들고 포토샵에서 나오는 컬러 코드와 비교 해봤을때.

 

x : 530 y: 376
선택한 곳의 색상값 : 584b42

 

이렇게 출력된 좌표의 색상값을 포토샵에서 찍어보면 594b42 로 나온다.

 

몇군데 좌표를 테스트 해봤지만 포토샵과 똑같이 나오지는 않는것 같다.

하지만 사람눈으로 구별할수 있을만큼의 차이는 나지 않는다.

신고

Comment +2

웹이나 디비에서 데이터를 가져온 텍스트의 경우 저장하는 방법에 따라서 개행이 /r/n 으로 넘어오는 경우가 있다.

 

이 경우 플레시는 한줄 개행이 아니고 두줄로 처리 해서 텍스트 필드의 라인간격이 두배로 나오는 경우가 생기게 되는데 이때는 넘어오는 텍스트에서 /r을 검색해서 삭제 해버리면 된다.

 

이럴때 사용하는 함수..

private function removeCarriageReturn(str:String):String
{
	var myPattern:RegExp = /r/g;
	str = str.replace(myPattern,"");
	return str;
}

함수이름이 내용보다 긴것 같지만 무슨 상관이랴~

 

/r 은 캐리지리턴이라부르고 입력커서를 라인의 맨 앞으로 보낸다

/n은 라인피드라고 해서 커서를 다음줄로 내리게 된다.

 

 예전에는 두개가 모여야 한줄의 개행이었던걸로 알고 있는데 요즘에는 걍 n만 쓰면 대부분이 정상적으로 라인이 바뀐다.

신고

Comment 0

  private function mcToBitmap(mc:MovieClip):Array
  {
   var bitmapData:BitmapData = new BitmapData(mc.width, mc.height,true);
   var bitmapArray:Array = [];
   var totalFrame:int = mc.scenes[0].numFrames;
   trace(totalFrame);
   
   for(var i:int=0; i<totalFrame; i++)
   {
    mc.gotoAndStop(i+1);
    bitmapData.draw(mc);
    bitmapArray.push(bitmapData.clone());
    bitmapData.dispose();
   }
   
   return bitmapArray;
  }

 

무비클립을 인수로 받고 각 프레임의 bitmapData를 추출해서 Array로 넘겨준다.

반사이미지 만들어주는 오픈소스를 가져다 썼는데 이놈이 인수를 무비클립만 받는다.. 거기서 반사 이미지까지 만들어진 무비클립을 내쪽에서 처리하려면 다시 비트맵 데이터로 넘겨 받아야 하는경우가 있어서 만들게 됐다.

 

무비클립은 Scene이 한개인놈만 되고.. 안에서 scenes.length로 for문을 한번더 돌리면 모든 씬의 모든 프레임에 있는 데이터를 bitmapData로 가져올수도 있다.

 

뭐 필요한 경우가 있겠지 -ㅅ-;;;;

신고

Comment +2

  • kisspa 2009.08.10 14:05 신고

    totalFrame이 1보다 크면 위의 소스는 에러가 납니다.

    bitmapData.dispose();
    는 객체를 반환하는것으므로...for문 밖에 넣어주던가 해야 겠네요

    • 감사합니다~

      이게 쓸려고 했다가 상황이 바껴서 다르게 처리하게 되서 안쓰게 되버려서 여러가지 경우에 대한 테스트를 하지 못했군요.

      시간이 되면 테스트 해보고 수정하도록 하겠습니다~

AS3 에서 폰트를 동적으로 embed 하기 위해서 폰트 SWF파일을 만들게 되는데 용량을 줄이기 위해서 필요한 설정이 unicodeRange이다.

 

숫자나 영문 한글 라틴 지원한다면 중국어 일어등 필요한 범위만을 embed하게 되므로 용량이 줄어들지만 범위 이외의 문자는 표시 되지 않기 때문에 그 범위를 벗어나는 텍스트는 절대 나오지 않는다 라는 확신이 있을때 지정해서 사용하는편이 좋다.

 

 괜히 개발 해놨다가 글이 안올라가는거 같아요 이런 소리 듣고 나면 버그가 있는줄 알고 검내 찾다가.. 범위 이외라서 올라간 글이 단지 안보이는 것뿐이라는 것을 알고나면 허탈해질수도 있다.

package
{
	import flash.display.Sprite;

	public class Default extends Sprite
	{
		[Embed(systemFont='나눔고딕 Bold', fontName='나눔고딕 Bold', mimeType = "application/x-font"
		 , unicodeRange = "U+0020-U+007E,U+1100-U+11F9,U+3000-U+303F,U+3131-U+318E,U+327F-U+327F,U+AC00-U+D7A3,U+FF01-U+FF60,U+0020-U+0020,U+0041-U+005A,U+0061-U+007A,U+0030-U+0039,U+002E-U+002E,U+0020-U+002F,U+0030-U+0039,U+003A-U+0040,U+0041-U+005A,U+005B-U+0060,U+0061-U+007A,U+007B-U+007E")]
		public static var embedFont:Class;
	}
}

 

나눔고딕을 포함하는 SWF를 만드는 코드이다.

 

Embed 할때 source로 ttf 폰트파일 주소를 쓰지 않고 systemFont를 써서 만들었는데 ttf를 직접 주소를 주고 만들었을때 cs4 문제인지 fp10의 문제인지 폰트가 보이지 않는 문제가 있다.

 

- 이부분은 정확한 문제를 찾아서 포스팅을 작성해야할것 같다.

외국 포럼에서도 CS4 사용해서 embed Font를 만들때 Bold, Italic 이 보이지 않는다는 말들이 있는데 해결방법을 아직 못찾았다.

 

 ****** Unicode Range **********

영문 : U+0020-U+0020,U+0041-U+005A,U+0061-U+007A

숫자 : U+0030-U+0039,U+002E-U+002E

한글 : U+0020-U+007E,U+1100-U+11F9,U+3000-U+303F,U+3131-U+318E,U+327F-U+327F,U+AC00-U+D7A3,U+FF01-U+FF60

라틴 : U+0020-U+002F,U+0030-U+0039,U+003A-U+0040,U+0041-U+005A,U+005B-U+0060,U+0061-U+007A,U+007B-U+007E

 

이외에 일어나 중국어 등은.. -ㅅ-;; 너무 길어서 패스..

신고

Comment 0

폰트 동적 추가하기 fontKR.swf 에 font Class가 들어있고 linkage 네임은 font_kr로 되어있다.
package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
import flash.text.AntiAliasType;
import flash.text.Font;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;

public class FontLoadTest extends Sprite
{
private var fontLibrary:Class;
private var font:Font;

public function FontLoadTest()
{
init();
}

private function init():void
{
loadFont("fontKR.swf");
}

private function loadFont(url:String):void
{
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, fontLoaded);
loader.load(new URLRequest(url));
}

private function fontLoaded(e:Event):void
{
fontLibrary = e.target.applicationDomain.getDefinition("font_kr") as Class;
Font.registerFont(fontLibrary);
var fontArray:Array = Font.enumerateFonts(false);
font = fontArray[0];
trace(font.fontName);

buildText();
}

private function buildText():void
{
var tf:TextField = new TextField();
tf.defaultTextFormat = new TextFormat(font.fontName,40,0);
tf.embedFonts = true;
tf.antiAliasType = AntiAliasType.ADVANCED;
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = "나눔고딕 Light ℃";

addChild(tf);
}
}
}
fontLibrary = e.target.applicationDomain.getDefinition("font_kr") as Class; 로딩된 폰트가 들어있는 SWF를 linkage이름으로 클래스화 시키고 Font.registerFont(fontLibrary); 폰트에 등록하면 사용할수 있다.
신고

Comment 0