flash/Tip 에 해당하는 글29 개
2007/11/11   why cannot we embed Cyrillic?
2007/08/28   ConvolutionFilter effect
2007/08/01   Checking user bandwidth (1)
2007/07/10   Flash Player Detection (5)
2007/02/25   Debugging Tool - X-ray
2007/02/12   SWFObject add-on: MouseWheel on Mac
2007/02/12   SWFObject: SWF embed script
2007/02/07   IME-Input Method Editor
2007/01/10   How to sort Objects(Class)
2006/12/26   Blink Effect
2006/11/30   wmode and setInterval
2006/10/17   wmode and performance
2006/10/16   Advanced progressive download
2006/10/12   Optimization of the flash site
2006/09/22   URL Encoding
2006/08/16   ZenDoc 1.0 Released
2006/08/08   ExternalInterface bug (Firefox)
2006/08/06   Static textfield Error?
2006/07/31   Mouse image scroll
2006/07/25   flash 에서의 초기화 문제
2006/06/23   XML Parsing Error
2006/05/30   Limits of flash
2006/05/26   Action 초기화 순서
2006/05/19   Alcon - ActionScript Logging Console
2006/05/14   전역 보안 설정 패널
2006/05/08   이미지 지글거림 없애기
2006/05/02   Clearing All setIntervals
2006/04/29   IE 패치에 대한 Flash Extention
2006/04/26   플래시 백버튼 팁

flash/Tip | 2007/11/11 22:49

다국어(multi-language) 작업시 폰트임베딩 문제는 적어도 누구나  한번 쯤은 겪여 보았을 것이다.
임베드하게되면 너무나도 용량이 커져버리게 되는 아시아국가 문자, 너무나 생소하여 원하는 문자들이 제대로 임베드되었는지 알 수 없는 유럽이나 남미쪽의 라틴계열의 문자들...이 모든것이 웹개발을 하는 개발자들이 유의해야만 하는 사항일 것이다.

용량문제에 있어서는 특별히 디바이스 폰트를 사용하지 않고 임베드를 사용할 경우 어느정도의 용량증가는 필히 감수해야 할 부분이라서 이부분은 제외하고 대신 정확한 폰트 임베드에 대해서만 글을 적어보려고 한다.

제목에서 언급한 키릴문자(cyrillic)는 동유럽쪽에서 많이 사용하는 문자로 러시아나 불가리아,우크라이나와 같은 나라에서 사용하는 문자이다. (e.g.  фваыафиывапывап)
일반적인 라틴문자 이외에 특수한(?)  문자의 대표라 할 수 있는  키릴문자의 임베드에 대해 살펴보겠다.

플래시에서 폰트를 임베드하는 방법은 대표적으로 2가지로 나눌 수 있다.
첫번째는 직접 스테이지에 Text tool 을 사용하여 Dynamic textfield 를 생성하여 임베드하는 방법과,
두번째는 라이브러리에 있는 font symbol(Library-New Font) 을 사용하는 경우이다.

'나는 키릴문자가 제대로 임베드 되는데 왜 안된다고 그러지?' 라고 반문하는 사람이 있을 것이다.
맞는 말이다. 하지만 임베드가 가능하다는 사람은 첫번째 방법으로 직접 임베드를 한 경우 일것이다.

만약 두번째 방법으로 폰트를 임베드하려고 하면 키릴문자는 임베드가 안되었다는 것을 알 수 있을 것이다.(각각의 방법으로 생성된 임베드파일 크기에서 차이가 있음)
이것은 font symbol 을 사용할 경우 폰트 임베딩 방식이 시스템의 코드페이지(codepage)에 따라 달라지게 때문에 발생하는 문제이다. 즉, 국가마다 사용하고 있는 OS의 언어설정에 따라 임베드되는 폰트범위에 차이가 있다는 말이다.
만약 키릴문자를 사용하고 있는 러시아어나 우크라이나어로 OS의 언어 코드페이지가 설정되어있다면 두번째 방법으로도 임베드가 가능할 것이다. 대신, 그쪽 환경에서는 반대로 한글이 임베드가 안될 것이다.

font symbol 을 사용하여 폰트를 임베드하면 OS의 국가코드페이지범위와 Basic Latin, Latin 1 의 범위(unicode standard)까지 임베드가 가능하다. 물론 로컬환경에 따라 다를것이다.(대부분의 코드페이지에서는 라틴문자를 포함한다)
위 범위는 기본 라틴계열의 영어권국가와 프랑스어,독일어,스페인어와 같은 문자를 모두 표현할 수 있다. 하지만 헝가리어 같은 경우 Latin Extended A 까지 포함해야 모두 표현이 가능하다.
따라서 두번째 방법으로 폰트를 적절하게 임베드하는 방식은 코드페이지를 강제로 바꾸는 방법밖에 없다.(제어판-->국가및 언어옵션-->고급-->유니코드를 지원하지 않는 프로그램용 언어-->재부팅)
하지만 이방법은 너무 번거롭다.

Adobe에서도 font symbol 을 이용한 다국어 작업시 폰트 임베드 문제는 로컬시스템 환경에 영향이있으므로 첫번째 방법으로 직접 텍스트 필드를 생성하여 임베드하는 것을 권장하고 있다.

위 모든사항을 고려할 때 가장 안정적으로 다국어용 폰트를 임베드 하려면, 첫번째 방법을 사용해야할 것이다. 또한 임베드하려는 폰트가 해당문자(glyph)가 포함되어있는지 확인해 봐야한다.
대표적인 유니코드 폰트인 Arial 이나 Times New Roman 그리고 폰트뒤에 키릴문자(cyrillic)의 약자인 CYR 또는 CR  과 같은 첨자가 붙는 폰트를 사용할 경우 해당폰트를 표현하는데 무리가 없을것이다.

as3.0 의 경우는 hasGlyphs 과 같은 해당문자의 유무여부를 판단해주는 메서드가 존재하므로 이를 활용하면 좀더 안정적인 폰트 임베드가 가능할 것이다.

근데 왜 actionscript 로 character 임베드범위를 제어 못하게 했을까?....아님 할수 없는것일까?



download sample files...



reference from articles below
http://www.quasimondo.com/archives/000211.php
http://www.actionscript.org/forums/showthread.php3?t=108546&highlight=Cyrillic
http://www.unicode.org/


 
 
태그 : cyrillic, flash, font embedding, unicode
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/104

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기

flash/Tip | 2007/08/28 15:01
Convolution  는 회선기법으로써 입력픽셀과 그 주위의 이웃한 픽셀들을 가중평균(weighted average) 하여 처리하는 기법으로 플래시에서도 ConvolutionFilter 를 지원한다.
다른 필터에 비해 사용빈도에 있어서 떨어지지만 잘만 사용한다면 플래시에서도 포토샵에서 지원하는 여러 효과들의 필터 효과를 낼 수 있을것이다..

인접픽셀들을 이용하기 때문에 나타낼 수 있는 효과는 대부분 이미지의 경계부분(edge)  변형으로 생기는 embossing,blur,sharpen,accented-edge 같은 효과들이다.

convolution 필터는 9개의 파라미터가 존재하는데 일반적으로 아래와 같이 4개를 사용하여 제어를 한다.

ConvolutionFilter(matrixX:Number=0, matrixY:Number=0,matrix:Array=null,divisor:Number=1.0)

여기서 가장 중요한 부분이 matrix 라는 배열 파라미터인데 일반적으로 3x3 행렬을 사용한다.

    0 0 0
    0 1 0      =>  [0,0,0,0,1,0,0,0,0]    형렬표기방법은 좌측과 같이 열단위로 끊어서 작성한다.
    0 0 0 
 <default>

matrix 는 중앙에 있는 값(1)을 기준으로  대칭형태로 사용한다. 이는 인접픽셀과의 가중치 계산을 위한 비율과도 무관하지 않다. 또한 모든 matirx 의 요소 값의 합이 1을 기준으로 크게되면 전체적인
이미지의 밝기(brightness)가 증가하게 되고, 반대로 1보다 작게 되면 밝기가 감소하게 된다.


위에서 볼수 있듯이 matrix 값의 총합이 1이 아닐경우 원본값에서 이미지 밝기에서 차이가 난다.
이런 뜻하지 않은 이미지 밝기의 변화로 인해 의도했던 이미지 효과가 묻혀버리게 되는 일이 발생하는데 이런걸 방지하기 위해 divisor 를 사용하여 값을 조정해준다.
divisor 은 convolution  필터의 4번째 파라미터로서 결과값에 대한 강도를 낮춰주게 된다.
matrix 전체의 총합을 divisor 로 나눈값이 1을 기준으로 설정될수 있는 밝기로 생각하면 된다.

ConvolutionFilter(3,3,[0, 0, 0, 0, 1, 0, 0, 0, 0])
ConvolutionFilter(3,3,[0, 0, 0, 0, 3, 0, 0, 0, 0],3) 

따라서 위 두개의 필터값은 같은 효과를 나타낸다.

<embossing>
embossing 의 matrix 는 양수의 중앙값을 기준으로 좌우의 값의 부호가 반대인 좌우대칭형태
   a   d  -c          -2  -1  0
   b   e  -b   ==>  -1   1   1   ==>    new ConvolutionFilter(3,3,[-2, -1, 0, -1, 1, 1, 0, 1, 2])
   c -d  -a            0   1   2

<sharpening>
sharpening 의 matrix 는 양수의 중앙값을 기준으로 상하대칭형태
   a   b   c          0    -1    0
   d   e   d   ==>  -1   5   -1   ==>    new ConvolutionFilter(3,3,[0, -1, 0, -1, 5, -1, 0, -1, 0])
   c   b   a          0    -1    0

<accented-edge>
accented-edge 의 matrix 는 sharpening 과 비슷한 형태로 음수의 중앙값을 기준으로 상하대칭형태
   a   b   c          0    1    0
   d   e   d   ==>  1   -3   1   ==>    new ConvolutionFilter(3,3,[0, 1, 0, 1, -3, 1, 0, 1, 0])
   c   b   a          0    1    0

위 모든 효과는 중앙값(e) 을 조정하여 효과의 강도를 조정할 수 있다.


download sample files...




 
 
태그 : convolution filter, filter, flash
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/102

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기

flash/Tip | 2007/08/01 12:00

우리나라의 웹환경에서는 초고속 인터넷과 같은 인프라의 발전으로 대역폭(bandwidth)을 고려해야할 만큼 네트워크 속도가 절대적으로 중요하지는 않다.
워낙 전송 속도가 빨라서 왠만한 웹사이트는 로딩시간없이 실시간으로  보여진다. 하지만 이는 특수한 우리나라의 경우에서만 해당하는 사항일뿐 아직까지 대부분의 다른나라에서의 전송속도는 생각하는 것 만큼 빠르지 않다. 좀더 범용적인 사이트의 개발을 위해서는 반드시 고려해야 할 사항이다.

특히 영상위주의 컨텐츠가 포함된 사이트의 경우 사용자의 대역폭을 고려하는 것이 좀더 사용자에게 좋은 컨텐츠를 제공하는 방법이 될 수 있다. 대부분 영상을 보여주는 방법으로 점진적 다운로드 방식(progressive download)을 사용한다. 실시간으로 다운로드 한만큼 플레이하는방식으로 이는 사용자 환경의 대역폭이 서비스의 질을 크게 좌우하게 된다.

영상을 보여주는 데 있어 점진적 다운로드 방식은 영상의 전체적인 용량보다는 영상의 압축률에 더 큰 영향을 받는다. 다시말해 데이타를 로드하면서 플레이하는 방식이기 때문에 비디오의 압축률을 높여 단위시간당 받을 수 있는 용량을 보다 크게 하여 좀더 원할하게 플레이 할 수 있다.

 따라서 미리 사용자의 대역폭을 알아내어 거기에 알맞는 압축률의 비디오를 제공할 수 있는 것이다.
플래시에서 일반적으로 대역폭을 측정하는 방법으로는 일정크기의 샘플파일을 다운로드하여 걸린시간을 측정하여 구할 수 있다. 하지만 이 대역폭은 절대적인 속도를 의미하는 것은 아니다.
네트워크 사용량, 네트웍크 지연과 같은 여러가지 요인에 의해 언제든지 속도가 변경될 수 있다. 항상 측정된 속도로 데이타를 받을 수 있다는 의미가 아니다. 현재 시간에서 대략적인 사용자의 네트워크 속도를 가늠해 볼 수 있는데 의미가 있다. 불안정한 네트워크 일수록 측정 대역폭의 편차가 크게 발생한다.

대역폭 측정의 정확성을 높이기 위해서는 테스트하기 위해 사용하는 샘플의 용량을 크게 하거나,측정하는 테스트의 횟수를 늘려야한다. 하지만 이는 전송속도 측정을 위해 불필요하게 자원을 소모하게 되기 때문에 어느정도 적정선을 유지해야한다.
여기서 제공하는 방법은 샘플파일의 크기를 50~100 KB 로 제한하고 측정횟수를 2회로 한정하였다.
위 조건으로 측정한다고 해도 사용자의 네트워크 속도가 50KB 미만일 경우 100~200KB 를 테스트를위해 최소 2~4초정도의 시간이 걸리게 된다.

<bandwidthCheck class>

import com.dstrict.UB.events.Dispatcher;
import com.dstrict.UB.events.Event;

class com.dstrict.UB.util.system.BandwidthCheck extends Dispatcher {
 
 private var _bandwidthSet:Array;
 private var _bandwidth:Number;
 
 private var _startTime:Number;
 private var _checkCount:Number;
 
 private var _loader:MovieClipLoader;
 private var _container:MovieClip;
 
 public function get bandwidth():Number{
  return _bandwidth;
 }
 
 public function BandwidthCheck() {
  _checkCount=0;
  _bandwidth=0;
  _bandwidthSet=new Array();
 }
 
 public function check():Void{
  _container= _root.createEmptyMovieClip("container", _root.getNextHighestDepth());
  var nocache:Number=Math.random()*1000000;
  _loader=new MovieClipLoader();
  _loader.addListener(this);  
  _loader.loadClip("bandwidthDummy.png?nocache="+nocache,_container);
 }
 
 private function calculateBandwidth():Void{
  for(var i in _bandwidthSet){
   _bandwidth+=_bandwidthSet[i];
   }
  _bandwidth=_bandwidth/_checkCount;
 
  //dispatch a complete event
  startEvent(new Event(Event.COMPLETE,this));
 }
 
 private function onLoadStart(targetMc:MovieClip):Void{
  _startTime=getTimer();
 }
 
 private function onLoadComplete(targetMc:MovieClip):Void{
  _loader.unloadClip(_container);
  var elapsedTime:Number=(getTimer()-_startTime)/1000;  
  _checkCount++;
 
  var progress:Object = _loader.getProgress(targetMc);
  var kilobytes:Number=progress.bytesTotal/1024;  
  var kBps:Number=kilobytes/elapsedTime;
  _bandwidthSet.push(kBps);
 
  if(_checkCount==1){
   check();
  }else{
    calculateBandwidth();
  }
 }
}

<sample code>

var bandwidthCheck:BandwidthCheck=new BandwidthCheck();
bandwidthCheck.addEventListener(Event.COMPLETE,onBandwidthCheck);
bandwidthCheck.check();

function onBandwidthCheck(evt:Event){
 trace("bandwidth----------------->"+evt.target.bandwidth);
}


대역폭(bandwidth) 의 단위로는 KBps(kilobytes per second) 이다. 브라우저 캐쉬로 부터 다운받는것을 방지하기 위해 첨부한 문자열로 인해 반드시 웹상에서 다운받아야 로드할수 있다.



download sample files.......
 


 
 
태그 : As2.0, bandwidth, flash, Tip
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/100
BlogIcon 김진혁 2007/08/24 13:41 ReplyDelete
오.... 글쿠나..

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기

flash/Tip | 2007/07/10 01:28

flash player 9 가 발표된지도 1년이 훌쩍 지난 시점이지만 정식으로 flash CS 가 발표된지 얼마 지나지 않았기 때문에 아직까지는 개발자들의 as3.0 사용빈도도 적을뿐더러 사용자들의 pc 에 설치되어있는 flash player 버전이 8.0 이하 버전들도 상당수 존재한다.
 flash player 보급률 통계(adobe flash player penetration)에 따르면 현재(2007.3) 80% 정도로 배포되어있다. 물론 상당한 배포율이지만 소수의 사용자들을 고려한다면 원하는 컨텐츠를 사용자에게 보여주지 못하는 정도가 무시못할 수치이다.

이렇듯 새로운 버전의 flash player가 발표될때 마다 개발자들은 사용자들이 가지고 있는 flash player 버전을 고려하여 개발을 하고 그것에 맞는 flash player 가 설치 되어있는지의 여부를 체크해야만 한다. 그렇지 않다면 하위버전의 flash player 를 가졌거나 아예 없는 사용자가 사이트를 방문했을 시 영문도 모른 채 빈 화면만 보게 될 것이다.

이전에도 이런 문제를 해결하기 위해 많은 노력이 있었지만 아직 100% 완벽하게 처리할 수 없는 점이 존재한다. 개개인 사용자들의 브라우저 보안설정이나 운영체제의 상이함으로 인해 똑같은 결과를 얻지 못하는 경우가 종종 발생한다.

이글에서는 기존의 방법들중에서 가장 사용하기 편하면서 널리 이용되고 있는 SWFObject 라는 flash embed script 를 이용하여 player 버전체크 뿐만아니라 직접 install 하는 과정을 소개한다.

우선 flash player detection 과정은 크게 3단계로 구분된다.

첫째, 브라우저에서 javascript 사용가능 체크.
둘째, flash player 설치여부.
셋째, flash player 버전 체크.


 
몇몇 일부 사용자들은 브라우저의 javascript 기능을 꺼놓은 경우가 있다.  이럴경우 javascript 를 사용하여 flash detection 을 하는 과정이나 html에 swf 파일을 임베드 하는 과정이 전혀 작동하지 않게 된다. 따라서 가장 먼저 사용자 브라우저의 javascript 기능의 활성화 여부를 체크해야만 한다.
이 단계에서는 간단히 <noscript></noscript> 이용하여  대체 메시지를 출력하여 처리하면 된다.

player 설치 체크와 버전 체크는  SWFObject 에서 처리해 준다.
또한 window 뿐만 아니라 mac 의 주요 웹 브라우저의 flash plugin 감지도 지원해준다.
실제 mac 용 브라우저인 safari, opera 등에서도 문제없이 작동되었다.
자세한 SWFObject  사용법은 이전 포스트 나 아래 관련 링크를 참고하면 된다.

<html code>

<script type="text/javascript" src="swfobject.js"></script>
<body>
 <div id="flashcontent">
  <script>
   document.write("This content requires the Adobe Flash Player 9<a href=http://www.adobe.com/go/getflash/>Get Flash</a>");
  </script>
 </div>
 <script type="text/javascript">
  var so = new SWFObject("example.swf", "example", "600", "200", "9", "#ffffff");
  so.useExpressInstall('expressinstall.swf');
  so.write("flashcontent");
 </script>
 <noscript>
   This content requires  a browser with JavaScript enabled.
 </noscript>
</body>

위 코드는 flash embed 코드이다. SWFObject 에서는 요구하는 버전이 아니거나 존재하는 않을경우  flash 페이지를 대신할 수 있는 div tag 를 제공하는데 이곳에 대체 텍스트나 이미지를 넣어 사용자에게 상황에 맞는 적절한 정보를 제공할 수 있다.
그리고 하단부분에 noscript 태그가 존재하는데 이는 javascript 를 쓸수 없을 경우 실행되는 부분이다.
지금까지는 단순히 적절한 flash player 가 설치되어있는지의 여부를 판단하고 그에 대한 정보를 제공하는 것이 전부였다. 위 코드에 걸리는 사용자는 아마 제공하는 컨텐츠보다 player 버전이 낮을 경우가  대부분일 것이다. 즉, 사이트를 볼수 없는 사용자들 중에는 자바스크립트를 비활성으로 하거나 player 가 아예 설치되어있지 않을 경우보다 설치되어있는 player 의 하위버전으로 인한 문제가 대부분이다. 따라서 좀더 친숙하게 사용자에게 접근하려면 버전체크로 끝나는 것이 아니라 설치까지도 제공해 줄 필요가 있다.

이를 위해 Adobe 에서는  Express Install 을 제공해준다. 이는 플래시 파일내에서 직접 flash player
업그레이드를 진행해 주는 것이다.

SWFObject 에서도 Express Install 을 사용할 수 있게 메소드를 제공해 준다.
 so.useExpressInstall('expressinstall.swf');

위와 같이 사용하면 expressinstall.swf 가 업그레이드를 진행하는 부분으로 반드시 player 버전이
6.0.65 이상으로 작업되어야 한다. 만약 flash player 버전이 9.0 보다 낮을경우 아래와 같은 화면이 보일것이다.

사용자 삽입 이미지

첨부 파일을 확인하면 원하는 형태로 디자인을 변경하여 업그레이드를 진행할 수 있다.
단, express install 을 사용하려면  Adobe 에서 제공하는 업그레이드 과정에서 생성되는 메시지
창의 크기때문에 최소 214*137 px 로 제작해야한다.

express install test (반드시 flash player 를 제거하고 8.0 버전을 설치한후 테스트)

download sample.....


<Installer and UnInstaller>
Window version.
Mac version.
 



<Related articles>
Best Practices for Flash Player Detection
Using Express Install with SWFObject


 
 
태그 : express install, flash detection, flash player, SWFObject
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/99
BlogIcon 지돌스타 2008/02/04 01:11 ReplyDelete
좋은 글 감사합니다.
BlogIcon 기정e 2008/02/04 10:36 Delete
도움이 되셨다니 다행입니다.^^
오리냥 2008/02/11 10:40 ReplyDelete
좋은자료 감사합니다.^ㅇ^)/
BlogIcon 기정e 2008/02/11 19:49 Delete
네.감사합니다~~
후후 2008/11/18 20:07 ReplyDelete
좋은 정보 감사합니다.

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기

flash/Tip | 2007/02/25 23:55
2006 FlashFoward 에서 finalist 에 오른 플래시 실시간 디버깅 툴이다.
플래시의 가장 큰 단점중에 하나가 기타 프로그램언어에 비해 디버깅 기능이 빈약하다는 것이다.
물론 플래시내에서 디버깅 기능을 지원하지만 직관적이지 못한 구조로 대부분 오류코드를 직접 작성해 trace 로 찍어보는 방법이 가장 빠를것이다.
기존에 써오던 Alcon 이라는 디버깅 툴보다도 훨씬 강력한 기능을 가지고 있는 것 같다.

이 툴은 틀별한 과정없이 컴포넌트를 설치하고 타임라인 상에 드래그하여 export 하면 Interface window 를 통해 모든 오브젝트를 runtime 으로 확인하고 수정해볼 수도 있다.

이런 디버깅 툴이 가장 필요할때는 아마 웹상에 올려져있는 플래시 파일을 디버깅할때 일것이다.
이런툴을 사용하지 않고 원하는 데이타가 제대로 들어오는지, 웹상에 올려져 있는 플래시 파일을 디버깅 하려면 자바스크립트로 alert 창을 띄우는 방법밖에 없을것이다.


사용자 삽입 이미지



특히 필터효과 같은 경우 사용자들이 원하는 효과를 얻으려면 많은 테스트를 해보고 그 값 적용하는데 이 툴에서는 필터효과를 실시간으로 적용할수 있고 그 코드값을 복사해서 그대로 사용할수도 있다.

-Features

  • View physical parent/child relationships of all your objects/movieclips in the treeview
  • View all properties/methods associated with an object/movieclip
  • Drill down through any objects/movieclips/arrays in the Datagrid
  • Execute actionscript at runtime. Call any of your methods from the interface at runtime!
  • Control at runtime:
    • MovieClips - Edit all properties, including: Rotate, scale, move, opacity, properties, play, gotoAndPlay/Stop/labelName
    • TextFields - same as movieclips, as well as edit text, HTML text
    • Buttons - same as movieclips
    • video objects (NetStream) - play, pause, stop, view properties in realtime as video plays
    • Sound objects - play, stop, set loops, view ID3 information, all sound properties.
  • Use the _global.tt() to send any object/property to the output panel. Xray.trace() will recurse any object/array and display in the output panel a tabbed relational view of the object/array.
  • Use the search tool to search the output returned.
  • History info - use property settings saved in the history in your FLA or to reset your application to a specific state
  • Filters Panel - use Flash8 filters at run time and copy/paste the code for use in your FLA


    관련사이트
    http://osflash.org/xray

  •  
     
    태그 : Application, debug
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/87

    Name 
    Password 
    Homepage 
      secret
    Comment 
      글쓰기

    flash/Tip | 2007/02/12 17:21
    관련사이트
    http://blog.pixelbreaker.com/flash/swfmacmousewheel/

    다운로드

    mac os 상에서의 Flash Player 는 마우스 휠을 감지하지 못한다. 따라서 이 문제를 해결하려면
    플래시 내부에서 마우스 휠반응을 체크하는 것이 아니라 자바스크립트로 마우스 휠을 감지하여
    플래시로 알려줘야 된다.

    SWFMacMouseWheel 라는 자바스크립트 파일을 사용하여 플래시의 내부 함수를 호출한다.
    그리고 플래시에서는 ExternalInterface를 사용하여 자바스립트에서 호출하는 함수를 받아서
    마우스 휠 반응을 처리한다.

    <actionscript code>

    import flash.external.ExternalInterface;
    import com.pixelbreaker.event.EventBroadcaster;
    /**
     * @author Gabriel Bucknall
     *
     * Class that supports using the mouseWheel on Mac OS, requires javascript class
     * swfmacmousewheel.js
     */
    class com.pixelbreaker.ui.MouseWheel
    {
     private static var isMac:Boolean;
     private static var macBroadcaster:EventBroadcaster;
     
     private static function main():Void
     {
      isMac = System.capabilities.os.toLowerCase().indexOf( "mac" ) != -1;
      if( isMac )
      {
       macBroadcaster = new EventBroadcaster();
       ExternalInterface.addCallback( "externalMouseEvent", MouseWheel, MouseWheel.externalMouseEvent );
      }
     }
     /**
      * Add a listener for using the mouseWheel
      * obj param must have an "onMouseWheel" method to be called.
      */
     public static function addListener( obj:Object )
     {
      if( !isMac ) MouseWheel.main();
      if( isMac )
      {
       macBroadcaster.addListener( obj );
      }else{
       Mouse.addListener( obj );
      }
     }
     
     /**
      * Remove a listener
      */
     public static function removeListener( obj:Object ):Void
     {
      if( isMac )
      {
       macBroadcaster.removeListener( obj );
      }else{
       Mouse.removeListener( obj );
      }
     }
     
     private static function externalMouseEvent( delta:Number ):Void
     {
      macBroadcaster.broadcastMessage( "onMouseWheel", delta );
     }
    }

    <frame code>

    MouseWheel.addListener(this);

    타임라인 상에 MouseWheel Class 를 사용하여 리스너를 생성한다.



    <html code>

    <script type="text/javascript">
         // <![CDATA[
          var so = new SWFObject('test.swf', 'website', '100%', '100%', '8', '#FFFFFF');
          so.useExpressInstall('js/expressinstall.swf');
          so.addParam('menu', 'false');
          so.addParam('scale', 'noscale');
          so.addParam('salign', 'lt');          
         
     
          //change below
         if(so.write('flashcontent')){
            var macmousewheel = new SWFMacMouseWheel( so );
          }
         // ]]>
    </script>

    SWFObject 를 사용하여 swf 파일을 임베드하였다. 마지막 줄 코드만 삽입하면 html
    상에서 플래시로 마우스 휠반응을 감지하여 값을 보낼수 있다.




     
     
    태그 : ExternalInterface, flash, Mac, mouseWheel, Tip
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/85

    Name 
    Password 
    Homepage 
      secret
    Comment 
      글쓰기

    flash/Tip | 2007/02/12 15:46
    SWFObject is a small Javascript file used for embedding Macromedia Flash content. The script can detect the Flash plug-in in all major web browsers (on Mac and PC) and is designed to make embedding Flash movies as easy as possible. It is also very search engine friendly, degrades gracefully, can be used in valid HTML and XHTML 1.0 documents*, and is forward compatible, so it should work for years to come.

    SWFObject는 swf 임베드 자바스크립트 소스이다.

    2006년도 초에 이올라스와의 소송이후 MS에서 IE설계를 바꿔 embed,object 태그의 직접사용을 막아 놓았기 때문에 swf 파일을 html 에 임베드할때 반드시 외부 자바스크립트 파일로 해야지만 플래시 활성화 클릭이 뜨지 않고 보여지게 되었다. 그 이후로 여러 다른 사람들이 만들어 놓은 swf 임베드 javascript 파일 소스를 사용하여 쓰곤했는데 플래시로 변수를 넘겨줄때는 여러모로 불편한 문제가 있었다. 종종 해외사이트에서 사용된 SWFObject 가 오픈 소스였다니....그때는 무심코 넘겼는데 자세히 보니 여러가지로 유용한 점이 많이 있는 것 같다.
    또한 브라우저 종류에 상관없이 모든 플랫폼에 적용되어 범용성 측면에서도 도움이 될 듯 싶다.


    <SCRIPT type=text/javascript>
       var so = new SWFObject("movie.swf", "mymovie", "200", "100%", "7", "#336699");
       so.addParam("quality", "low");
       so.addParam("wmode", "transparent");
       so.write("flashcontent");
    </SCRIPT>

    사용법은 어렵지 않다. SWFObject 객체를 생성해서 파라미터만 넘겨주면 된다. 플래시파일 버전 체크도가능하다. 위에서 보이는 7 이라는 숫자 파라미터가 체크할 Flash Player 버전이다. 여기까지 기존의 임베드 스크립트와 별반 다르지 않다.

    <SCRIPT type=text/javascript>
       var so = new SWFObject("movie.swf", "mymovie", "200", "100", "7", "#336699");
       so.addVariable("variable1", "value1");
       so.addVariable("variable2", "value2");
       so.addVariable("variable3", "value3");
       so.write("flashcontent");
    </SCRIPT>


    위에서와 같이 플래시 파일안으로 쉽게 변수를 넘겨 줄 수 있다. 자바스크립트에 익숙하지 않는 사람에게는 변수 처리하는 과정이 여간 까다로운게 아니다. 브라우저 플랫폼에 따라서 결과 값이 다를수도 있고.... 또한 url 로 붙여서 들어온 변수도 처리해 줄수도 있다. 예를 들어

    http://www.example.com/page.html?variable1=value1&variable2=value2 다음과 같은 주소로 변수가 붙어서 들어왔을 경우

    <SCRIPT type=text/javascript>
       var so = new SWFObject("movie.swf", "mymovie", "200", "100", "7", "#336699");
       so.addVariable("variable1", getQueryParamValue("variable1"));
       so.addVariable("variable2", getQueryParamValue("variable2"));
       so.write("flashcontent");
    </SCRIPT>


    위와 같이 getQueryParamValue 함수를 이용하면 쉽게 플래시 안으로 넘겨줄 수 있다.

    다운로드

    관련 사이트
    http://blog.deconcept.com/swfobject/
     
     
    태그 : flash, SWFObject, Tip, 이올라스
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/84

    Name 
    Password 
    Homepage 
      secret
    Comment 
      글쓰기

    flash/Tip | 2007/02/07 11:41
    IME(System.IME) Class를 이용하면 클라이언트 컴퓨터에서 실행되고 있는 flash player 에서 운영체제의 IME(Input Method Editor) 를 조절할 수 있다. IME 는 사용자의 문자입력을 받을수 있는 요소로서 흔히 사용하는 Input Textfield 나 TextArea, TextInput 와 같은 component 가 있다. 일정한 폼의 형태로 사용자의 텍스트 정보를 받아야 할 경우 흔히 Input Textfield 를 사용한다. 이때 우리나라와 같이 한글, 영문을 같이 병행하여 사용할 경우 사용자들은 한영키 전환을 잊고 입력하는 경우가 자주 발생한다. 이때 사용성을 높여주는 방법으로써 자동으로 입력 해당필드로 이동했을시 IME Mode 를 변경해 주는 것이다.


    class com.dstrict.UB.util.system.IME {
      /**-------------------------------------------------------------------
        * @description IME Mode 설정
      *-------------------------------------------------------------------*/
      public static function setIMEMode(mode:String):Void{
     
       if(System.capabilities.hasIME) {
       
       if(mode=="KOREAN"){
          mode=System.IME.KOREAN;
       }
       if(mode=="ALPHANUMERIC"){
           mode=System.IME.ALPHANUMERIC_HALF;
       }
      }
      System.IME.setConversionMode(mode);
     
     }
    }

    <example code>
     import com.dstrict.UB.util.system.IME;
     IME.setIMEMode("KOREAN"); // 한글전환시
     IME.setIMEMode("ALPHANUMERIC"); // 영문전환시

    각 필드에 포커스 되었을때 원하는 모드에 맞게 설정해 놓으면 사용자의 사용성이 개선될 수 있다.

     
     
    태그 : flash, IME, Tip
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/83

    Name 
    Password 
    Homepage 
      secret
    Comment 
      글쓰기

    flash/Tip | 2007/01/10 00:01

    sortOn (Array.sortOn method)

    public sortOn(fieldName:Object, [options:Object]) : Array

    Sorts the elements in an array according to one or more fields in the array. The array should have the following characteristics:

  • The array is an indexed array, not an associative array.
  • Each element of the array holds an object with one or more properties.
  • All of the objects have at least one property in common, the values of which can be used to sort the array. Such a property is called a field.

    If you pass multiple fieldName parameters, the first field represents the primary sort field, the second represents the next sort field, and so on. Flash sorts according to Unicode values. (ASCII is a subset of Unicode.) If either of the elements being compared does not contain the field that is specified in the fieldName parameter, the field is assumed to be undefined, and the elements are placed consecutively in the sorted array in no particular order.

    오브젝트를 일반적인 단일속성이 아닌 한개 이상의 여러 속성을 기준으로 정렬할시 사용되는 메서드이다. 오브젝트를 정렬할때 종종 사용하던 방법이였는데 이번 프로젝트를 진행하면서 클래스 자체를 정렬할때 사용해 보았는데 역시나 생각한 대로 작동하였다...^^

    클래스는 당연히 오브젝트의 일종이다. 따라서 클래스 안에 있는 멤버 변수들을 기준으로 정렬이 가능하다는 의미다. 자신이 클래스를 사용하여 이미지 갤러리같은 정렬의 기능이 있는 컨텐츠를 제작할시에 아주 유용한 기능일 것이다.


    // widget class : 정렬에 사용될 클래스

    class com.dstrict.UB.project.ces2007.widget.Widget {

      public var _id:String;
      public var _title:String;
      public var _date:Number;

      public function Widget(id:String,title:String,date:Number) {
      _id=id;
      _title=title;
      _date=date;
    }

    }


    // example code

    import com.dstrict.UB.project.ces2007.widget.Widget ;

    var widgetArr:Array=new Array();

    var widget1:Widget=new Widget("vkimone","widget1",20061213);
    var widget2:Widget=new Widget("kimkijeung","widget2",20061110);
    var widget3:Widget=new Widget("Tom","widget3",20061115);
    var widget4:Widget=new Widget("Jane","widget4",20061211);

    widgetArr.push(widget1);
    widgetArr.push(widget2);
    widgetArr.push(widget3);
    widgetArr.push(widget4);

    for(var i=0; i<widgetArr.length ; i++){
    trace(i+"  : "+widgetArr[i]._id+" : "+widgetArr[i]._title+"  ----------->"+widgetArr[i]._date);

    trace
    ("======================================");

    widgetArr.sortOn("_date",Array.NUMERIC| Array.DESCENDING);

    for(var i=0; i<widgetArr.length ; i++){
    trace(i+"  : "+widgetArr[i]._id+" : "+widgetArr[i]._title+"  ----------->"+widgetArr[i]._date);
    }


    //result
    0  : vkimone : widget1  ----------->20061213
    1  : kimkijeung : widget2  ----------->20061110
    2  : Tom : widget3  ----------->20061115
    3  : Jane : widget4  ----------->20061211
    ======================================
    0  : vkimone : widget1  ----------->20061213
    1  : Jane : widget4  ----------->20061211
    2  : Tom : widget3  ----------->20061115
    3  : kimkijeung : widget2  ----------->20061110



    각각의 아이디값과 제목 그리고 날짜 정보를 포함하는 widget 클래스에서 여러개의 객체를 생성한후
    배열에 넣은 다음 오브젝트 속성인 _date 를 기준으로 내림차순으로 숫자 정렬했을때의 결과값이다.
    각 클래스 속성을 기준으로 통채로 정렬이 된다.

    만역 클래스를 이용해 철저히 오브젝트들을 캡슐화(encapsulation)했다면 손쉽게 오브젝트 정렬을 사용할 수 있을 것이다.





  •  
     
    태그 : array, sort, Tip
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/77

    Name 
    Password 
    Homepage 
      secret
    Comment