Actionscript3.02010.01.12 01:06

외부 데이터를 불러 와서 TextField 에 넣어 줄때, 외부 데이터 문자 길이를 UI 에 맞게 잘러서 나타내는 경우가 있습니다. 기본적으로 String 클래스에서 제공하는 substr 등을 이용하여 문자열을 보기 좋게 자르는데요. 여기서 소개 하는 방법은 substr 과 TextField 의 getLineOffset를 이용하여 한정된 라인에만 글짜를 출력 하는 방법 입니다.

var field:TextField = new TextField();
field.width = 250;
field.wordWrap = true;
field.text = "안녕하세요.이것은 테스트 입니다.안녕하세요.이것은 테스트 입니다.안녕하세요.이것은 테스트 입니다.";
addChild(field);
위의 코드를 출력하면 아래와 같은 결과가 나옵니다.


위와 같이 width 값은 고정되어 있고 wordWrap = true 로 TextField 의 자동 줄바꿈이 설정 되어 있을때 getLineOffset 을 이용하여 원하는 최대 라인수 보다 넘어 갔을때 그 다음 라인의 첫번째 문자 인덱스 값을 가져온 뒤에 그 인덱스의 -2 만큼 String 값을 잘라 버리는 방식 입니다. getLineOffset 의 설명은 아래와 같습니다. 

var field:TextField = new TextField();
field.width = 250;
field.wordWrap = true;
field.text = "안녕하세요.이것은 테스트 입니다.안녕하세요.이것은 테스트 입니다.안녕하세요.이것은 테스트 입니다.";
cutNumLines(field,2);
addChild(field);
function cutNumLines( $field:TextField,$maxLen:int ):void{
	if($field.numLines-1 < $maxLen) return;
	
	var idx:int = $field.getLineOffset($maxLen);
	$field.text = $field.text.substr(0,idx-2)+"..";
}

getLineOffset(lineIndex:int):int
lineIndex 매개 변수로 지정된 행에 있는 첫 문자의 문자 인덱스를 반환합니다.


위의 함수를 실행한 후의 결과는 다음과 같습니다.



'Actionscript3.0' 카테고리의 다른 글

AS3 vs Javascript Performance Test  (0) 2010.01.14
[AS3] TextField 에 한정된 라인에만 글짜 넣기  (0) 2010.01.12
Avoid ints in Actionscript  (10) 2009.11.14
Factory Pattern (AS3)  (0) 2009.10.25
Posted by Flash 동강
Actionscript3.02009.03.17 20:38
Javascript나 Actionscript에서 긴 길이의 문자열을 고정된 너비의 TextField에 집어 넣으려면 substr(startIndex,length) 이나 substring(startIndex,endIndex)을 사용합니다. 원하는 문자의 길이 만큼 파라 미터를 넘겨서 처리 하면 손 쉽게 해결 됩니다.
var field:TextField = new TextField();
addChild(field);   
var str:String = "Flash Actionscript3.0 플레시 액션스크립트";
field.text = str.substring(0,20);
하지만, 위와 같은 방법에는 치명적인 단점이 있습니다. 영어와 한글의 너비값이 차이가 있기 때문에, 영문의 10글짜와 한글의 10글짜의 너비는 큰 차이가 나게 됩니다. 하나의 문자로만 사용하는 경우에는 상관없겠지만, 항상 한글만 쓰거나 하는 경우는 극히 드물고, 특수문자도 
하나의 문자로 인식 하기 때문에 substring 이나 substr 만 가지고는 해결 할 수가 없습니다. 그래서 textfield에 문자를 미리 입력 한 후에 textWidth 값을 체크하여 어느 정도의 문자까지 입력 할수 있는지 확인하는 메소드를 만들어 보았습니다. 
function longStringDot(_field : TextField,_str:String, _width : int):int
{
      var  str_len:int;
      for(var i:int =0; i < _str.length; i++ ){
          _field.text = _str.substr(0,i);
          if(_field.textWidth > _width){
	str_len = i;			
	break;
          }				
      }					
      return (str_len == 0)? _str.length : str_len;			
}
보통 substring 을 이용하여 아래와 같이 코딩을 하지만,
var str:String = "";
var maxLen:int = 20;   // 문자열이 들어 가는 공간크기를 일일히 맞춰줘야 하는 번거로움이 있다.
var feild:TextField = new TextField();
if(str.length > maxLen)
	feild.text = str.substring(0,maxLen);
else
	feild.text = str;
var str:String = "";
var maxWidth:int = 100;     
var feild:TextField = new TextField();
feild.text = str;
if(feild.textWidth > maxWidth)
	feild.text = str.substring(0,longStringDot(feild,str,maxWidth));		
메소드의 파라미터로 TextField를 넘겨 주는 이유는 TextField가 가지고 있는 TextFormat에 따라 textWidth 값이 달라지기 때문 입니다. 요즘 들어 String을 처리 해야 하는 일이 많아 지네요. 좀 정리좀 해야 겠습니다.
Posted by Flash 동강
Actionscript3.02008.12.11 12:53

보통 <b>  와 같은 html 표기법을 처리해 주기 위해서  

TextField 을 사용할 때에는

var txt:TextField = new TextField();

txt.htmlText  =  <b> 태그가 포함된 문서      //보통 openapi 를 이용한 작업시 검색 결과에  <b> 태그 가 붙어서 넘어오게 됩니다. 

TextField 일 경우 htmlText 를 이용해서 간단히 처리해 줄수 있습니다. 그런데, 다른 컴포넌트에 <b>태그 가 포함된 문서를 넣을때는 어떻게 해야 되는 걸까요;;;   

전 이렇게 해 보았습니다. 예를들어 Datagrid 일 경우에 

for(var i:int =0; i < newsXML.length(); i++)
   {
    var txt:TextField = new TextField();
    txt.htmlText = newsXML[i].title;              // <b>태그 가 포함된 문자열을 가지고 있는 XML
    var txt2:TextField = new TextField();
    txt2.htmlText = newsXML[i].description;
    dp.addItem({description:txt2.text,title: txt.text});
   }

 

TextField 를 임의로 생성하고(txt) 그 안에 htmlText 로 newsXML[i].title 을 받습니다.

그리고 txt.text 를(newsXML[i].title 가 html 로 변환된 값을 가지고 있는 변수)

Datagrid 에 연결될 dataProvider 에 넣어 줍니다.

 

 

 

별거 아니지만, 저처럼 삽질 하시는 분 있을꺼 같아서 적어 봅니다.
Posted by Flash 동강
Actionscript3.02008.12.11 12:47


야후에서 나온 미니사전에서, 단어에 밑줄 긋는 기능을 구현해 보려고 참고하며 끄적였던 파일 입니다. TextField 에서 제공하는 메소드를 사용하여 구현하였습니다.

TextField.selectionBeginIndex   :: 텍스트 필드의 선택 시작 위치 property
TextField.selectionEndIndex     :: 텍스트 필드의 선택 끝 위치 property
String.substring(startIndex, endIndex)  :: String을 startIndex와 endIndex를 참조하여 부분 추출하기
비교) String.substr(startIndex, length)  :: String을 startIndex 부터 length 만큼 추출하기

 

  1. import flash.text.TextField;
  2. import flash.events.Event;
  3. import flash.events.FocusEvent;
  4.  
  5. var originInfo = {isFocus:false, beginIndex:0, endIndex:0};
  6. origin_txt.addEventListener(FocusEvent.FOCUS_IN, originFocusIn);
  7. origin_txt.addEventListener(FocusEvent.FOCUS_OUT, originFocusOut);
  8. origin_txt.addEventListener(Event.ENTER_FRAME, originCheckSelection);
  9.  
  10. function originFocusIn(event:FocusEvent):void{
  11.         originInfo.isFocus = true;
  12. }
  13. function originFocusOut(event:FocusEvent):void{
  14.         originInfo.isFocus = false;
  15. }
  16. function originCheckSelection(event:Event):void{
  17.         if(originInfo.isFocus){
  18.                 if(originInfo.beginIndex != event.target.selectionBeginIndex ||
  19.                    originInfo.endIndex != event.target.selectionEndIndex){
  20.                         select_txt.text = event.target.text.substring(event.target.selectionBeginIndex, event.target.selectionEndIndex);
  21.                         originInfo.beginIndex = event.target.selectionBeginIndex;
  22.                         originInfo.endIndex = event.target.selectionEndIndex;
  23.                 }
  24.         }else{
  25.                 select_txt.text = "";
  26.                 originInfo.beginIndex = 0;
  27.                 originInfo.endIndex = 0;
  28.         }
  29. }

 

Posted by Flash 동강