[Flex]UIComponent의 commitProperties()를 override할 때 주의할 점
[공지]이미지나 링크가 깨졌다면 댓글 부탁드립니다.
UIComponent의 commitProperties()를 오버라이드 할때 반드시 super.commitProperties()를 호출하도록 하는 것이 원칙이다. 왜냐하면 UIComponent의 commitProperties()에는 scaleX, scaleY 값이 변경되었을때 사이즈를 재조정하는 로직이 구현되어 있기 때문이다.
만약 Zoom Effect를 이용하면 scaleX, scaleY값이 변경된다. 아래 코드를 보자.
override public function set scaleX(value:Number):void
{
if (_scaleX == value)
return;
_scaleX = value;
invalidateProperties();
invalidateSize();
dispatchEvent(new Event("scaleXChanged"));
}
이 코드는 UIComponent에 구현되어 있는 scaleX이다. UIComponent는 DisplayObject의 scaleX, scaleY 속성을 overide하는데 여기서는 super.scaleX=value 와 같은 코드가 없는 것에 주목하자. 대신 임시변수로 _scaleX=value로 하고 invalidateProperties()를 이용해 commitProperties()를 호출하게 된다.
protected function commitProperties():void
{
if (_scaleX != oldScaleX)
{
var scalingFactorX:Number = Math.abs(_scaleX / oldScaleX);
if (!isNaN(explicitMinWidth))
explicitMinWidth *= scalingFactorX;
if (!isNaN(explicitWidth))
explicitWidth *= scalingFactorX;
if (!isNaN(explicitMaxWidth))
explicitMaxWidth *= scalingFactorX;
_width *= scalingFactorX;
super.scaleX = oldScaleX = _scaleX;
}
if (_scaleY != oldScaleY)
{
var scalingFactorY:Number = Math.abs(_scaleY / oldScaleY);
if (!isNaN(explicitMinHeight))
explicitMinHeight *= scalingFactorY;
if (!isNaN(explicitHeight))
explicitHeight *= scalingFactorY;
if (!isNaN(explicitMaxHeight))
explicitMaxHeight *= scalingFactorY;
_height *= scalingFactorY;
super.scaleY = oldScaleY = _scaleY;
}
if (x != oldX || y != oldY)
dispatchMoveEvent();
if (width != oldWidth || height != oldHeight)
dispatchResizeEvent();
if (errorStringChanged)
{
errorStringChanged = false;
setBorderColorForErrorString();
}
}
위 코드는 UIComponent의 commitProperties()이다. 보다시피 scale값을 가지고 장난을 치는 것을 볼 수 있다. super.scaleX, super.scaleY를 업데이트 하는 것뿐만 아니라 scalingFactorX, scalingFactorY 를 계산하여 _width와 _height의 비율을 조정하고 있다.
이 때문에 만약 commitProperties()를 오버라이드할때 super.commitProperties()를 호출하지 않으면 Zoom Effect가 안먹히는 것을 확인할 수 있을것이다.
override protected function commitProperties():void
{
super.commitProperties();
...(생략)
}
한번 테스트 해보길 바란다. ^^
글쓴이 : 지돌스타(http://blog.jidolstar.com/374)
'Adobe Flash Platform' 카테고리의 다른 글
| 예제로 배우는 Adobe Flex 2주년 기념파티 (6) | 2008/09/27 |
|---|---|
| [Flex] Collection 계열의 클래스와 List 계열 컴포넌트의 데이터 처리 (5) | 2008/09/26 |
| [Flex]UIComponent의 commitProperties()를 override할 때 주의할 점 (6) | 2008/09/24 |
| [Flex] ExcludeClass Metadata 태그 (8) | 2008/09/23 |
| [Flex] Flex Builder에서 나만의 manifest 만들기 (10) | 2008/09/23 |
| [Flex,PHP] Eclipse에서 Flex와 PHP로 작업하기 (7) | 2008/09/17 |




잘 보고 갑니다...
코드가 원래 트릭이죠...
구글 크롬이 빠르다고 하지만...
제가 볼 때는 빠르게 보이도록 한 트릭을 썼을 수도 있지요...
브라우져는 정확도, 안정성, 속도가 가장 중요하다고 생각합니다. 크롬이 정확도와 안정성은 어떨지 모르겠지만 사용자들로 하여금 체감속도가 빠르기 때문에 그만큼 가치가 있다고 봅니다. 어떤 트릭을 썼든지 일단 크롬=빠르다 이런 수식어를 붙였기 때문에 어느정도 성공했다고 봅니다. ^^
Non-visual Component의 경우에도 간혹,
늦게 생성되는 타 오브젝트와 커뮤니케이션을 해야할 경우가 있는데,
이때도 자꾸 commitProperties()와 비슷한 구조로 가게되더라구요. ㅎㅎ
사실 인수자가 Flex의 아키텍쳐 디자인을 이해하고 있다면 별 문제가 없겠지만,
그렇지 않은 경우에는 setter들의 직관성을 떨어뜨리는 것 같아서...
그래서 여러가지 디자인을 시도해 보았는데, 복잡도가 크게 줄지 않아서 계속 고민중이에요.
Null Object 패턴이 현재로서는 그나마 조금 맞아떨어지는 것 같긴 한데,
일반적인 Null Object와는 다르게, null 상태에서, 동작을 queueing 해야하는 것도 그렇고,
또 그 로직 자체가 정말 빈틈이 없는지도 아직 확실치 않고..
코드 양도 괜시리 늘어나는 것 같고.. ㅎㅎ;
그냥 매크로미디어 애들이 잘해놓았단 생각도 들고... (역시 걔들은 돈 들여서 고민한거라 그런지 ㅎㅎ)
네 저도 그러한 문제로 고민을 많이 하지만
코드량이 늘어나고 복잡성이 증가되는 것은 정말 막기 힘들더라구요.
제 능력이 부족한 탓도 있지만 Flex의 완벽하지 못한 SDK의 문제에 대한 대처를 위해 더욱더 Flex SDK를 알아야 할 것 같네요. ^^
안녕하세요~
어려울때마다 들려서 좋은 소스 참고 하고 있습니다.
이곳에 질문을 하는게 맞는지 모르겠지만~ 플렉스에 관련하여 질문을 하렵니다.
1. 현재 Datagrid를 사용하고 있는데, 한 Field에 하나의 아이콘용 그림을 표현하였습니다. (업로드된 파일명에 따라서 그림파일이 바뀜)..
하나의 셀에 여러개의 아이콘을 표현하여 각각의 아이콘의 이벤트를 이끌어 낼 수 있는지 물어보고 싶습니다.
2. Datagrid를 확장해서 Advanced Datagrid를 사용하려고 하는데, 각 Row에 select box를 입력할 수 있나요?
아니면, 그룹으로 묶어져 있는 것(대분류)에만 select box를 표현하고 싶은데 가능할까요?
주말잘보내시고요~
답변 부탁드리겠습니다~~
질문하신 모든 것을 할 수 있습니다.
한 예로...
DataGrid의 속성으로 columns가 있습니다. 여기에는 DataGridColumn을 넣게 되는데 DataGridColumn에 원하시는 컴포넌트를 넣으실려면 DataGridColumn속성인 itemRenderer를 활용하시면 됩니다.
http://blog.flexexamples.com/2008/05/09/using-a-slider-control-as-a-datagrid-column-item-renderer-in-flex/
를 참고해보세요.