반응형
브라우저 정렬시 가로정렬은 문제가 없는데 세로정렬이 문제가 됩니다.
정확하게 세로가운데 정렬을 지원하는 기능이 없기 때문인데요...
지금 알려드리는 소스는 IE6에서도 잘 작동하는 소스입니다.
삽질하며 알아낸 소스라서 다른 더 좋은 방법이 있는지는 모르겠지만 여튼 공유해봅니다.

일단 소스를 보시죠...





SWF Tag

삽입될 swf는 크기가 960 x 720으로 상정했는데요. 
크기가 고정된 swf가 있어야합니다. 그 크기를 기준으로 가운데 정렬시킬 위치를 알아내기 때문입니다.
그리고 swf 태그를 감싸는 <div> 태그가 있고 그걸 또 감싸는 <div> 태그가 있고,
swf 태그 위에 <img> 태그가 있는데요...
IE6 에서는 top 속성을 %로 지정하면 적용되지 않는 버그가 있습니다. 
그래서 img를 하나 두고 img 높이를 50%로 하면 그만큼 swf를 내리기 때문에 가운데 정렬되는 효과가 있습니다.

자~ 이렇게 하면 가운데 정렬되는 <div>를 얻을 수 있습니다. 그 안에 플래시를 삽입하던 다른 어떤걸 삽입하던 하면 되겠죠?

반응형
반응형
글 옮기는 과정에서 코드부분이 날아갔네요...
글 수정하면서 결론만 남깁니다~

코딩을 할 때 가끔 이런 코딩을 합니다.
if( isValid == true){ ... }
isValid가 Boolean 값이라면 "== true" 부분은 써줄 필요는 없지만 가독성을 위해서인데요...

갑자기 if(true)와 if(true == true) 중 어떤게 더 빠를까라는 의문으로 몇가지 좀 해봤는데요~

true 또는 객체를 비교연산하지 않고 그냥 쓰는 것이 가장 빠르게 나왔습니다.
오히려 true == true 연산이 객체를 그냥 써준것 보다 느리네요... 역시 비교연산을 한번 더 하기 때문인 것 같습니다.

그리고 비교연산 중에서는 같은 형끼리의 연산이 다른 형끼리의 연산보다 월등히 빠르게 나왔네요...
obj != null는 형변환이 필요없지만 obj == true는 형변환이 필요하죠...
Boolean(obj) == true는 강제 형변환 후 같은 형끼리 비교연산을 하기 때문에 빠른 것 같은데...
특이한 것은 Boolean(obj)입니다.
당연히 Boolean값이라 true를 써준것과 같지 않을까라고 생각했는데요... 그렇지가 않네요...
정확한 이유는 모르겠으나 Boolean은 원시타입이 아니라 Boolean이라는 객체이기 때문인 것 같습니다.
Boolean(obj) == true연산시에는 obj객체를 Boolean 타입으로 형변환 후 valueOf():Boolean 메서드를 사용해 true와 비교연산하는 것 같고,
Boolean(obj)만 써준 경우는 obj객체를 Boolean 타입으로 형변환 후 toString():String 메서드를 사용하기 때문에 다시 형변환이 필요해서 아닐까 추측해봅니다. ^^;;

결론적으로 다른 형끼리 비교연산을 하지 않는 다면 아무렇게나 써도 속도에 크게 지장을 주지 않는다는 거죠...
5십만번 연산을 해야 10밀리세컨드 정도 차이가 나네요... 하지만 다른 형끼리의 비교연산은 조심해야겠네요... 1초정도 차이가나니까요...

마지막으로 빠른 순서대로 정리해봤어요~ (왼쪽으로 갈수록 빠름니다.)
true <- obj <- true==true, Boolean(obj) == true <- obj != null <- obj == true <- Boolean(obj)



반응형
반응형

데이터 바인딩이란?

어떤 객체의 데이터를 다른 객체가 참조할 때 데이터가 변경되면 변경된 정보가 곧바로 참조하는 객체들에게 전달되는 기술입니다.

간단하게 말씀드리면 컴포넌트가 업데이트 하는 순간, 참조하는 다른 컴포넌트로 변경된 정보가 전파되는 것이죠.

사용방법에는 다음 세가지가 있습니다.

1. 중괄호 문법 ( { } )

2. <mx:Binding>

3. BindingUtils

대부분의 플렉스 컴포넌트는 데이터 바인딩을 지원하기 때문에

중괄호를 이용한 바인딩은 다들 해보셨을거라 생각됩니다.


바인딩의 작동 방식

데이터 바인딩은 내부적으로 이벤트기반으로 작동합니다.

따라서 객체의 프로퍼티 값이 변하면 기본적으로 propertyChange 이벤트를 발생 시키고 이 이벤트에 따라 바인딩을 받는 객체가 값을 갱신하는 것이죠...


사용자 정의 클래스에서의 바인딩


클래스 전체를 Bindable 지정

package test
{
	import flash.events.EventDispatcher;
	
	[Bindable]
	public class A
	{
		private var _a:String;
		
		public function get a():String
		{
			return _a;
		}
		
		public function set a(a:String):void
		{
			_a = a;
		}
	}
}
클래스의 모든 멤버변수에 대해 바인딩을 설정하는 것 입니다.
코드 보시는 바와 같이 클래스 이름 위에 [Bindable] 메타 태그를 써주는 것 외에는 어떠한 설정도 필요 없습니다.
참~ 쉽죠~
신경안써도 되지만 이 상태에서는 모든 멤버변수 변화에 따라 propertyChange 이벤트가 발생합니다.
get/set 메소드가 있던 없던 상관 없습니다. 멤버속성의 변화에 따라 이벤트를 발생시키니까요...

일부 멤버변수만 Bindable 지정
package test
{
	import flash.events.EventDispatcher;
	
	public class A
	{
		[Bindable]
		private var _a:String;
		private var _b:String;
		
		public function get a():String
		{
			return _a;
		}
		
		public function set a(a:String):void
		{
			_a = a;
		}
		
		public function set b(b:String):void
		{
			_b = b;
		}
		public function get b():String
		{
			return _b;
		}
	}
}

멤버변수 _a 만 바인드 시켰습니다. a 메소드로 접근하면 바인드 되지만 b 메소드로 접근하면 바인드 이벤트가 발생하지 않습니다.

사용자 정의 바인딩 이벤트 발생
일단 사용자 정의 바인딩 이벤트가 왜 필요한지 말씀드리겠습니다. 1. 특정 변수의 변화를 추적해야하는 경우 2. 좀더 효율적인 바인딩을 해야하는 경우 1번은 말 그대로라서 설명이 필요없을듯 하고요... 2번에 대해 설명드리겠습니다. 위에서 멤버변수에 변화가 생기면 propertyChange 이벤트가 발생한다고 말씀드렸는데요... 모두 똑같은 이벤트를 발생하기 때문에 바인딩을 받는 객체 입장에선 수정이 되든 안되든 모든 변수를 업그래이드해야합니다. 이것을 방지하기 위해서 사용자 정의 바인딩 이벤트를 발생시키는 것이죠... 일단 코드먼저 보세요...
 
package test
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	[Bindable]
	public class A extends EventDispatcher
	{
		// [Bindable(event="aEvent")]
		// get/set에 쓰지 않고 이곳에만 쓰면 propertyChange도 발생하기 때문에 사용의도에서 벗어나게 됩니다. 
		private var _a:String;
		private var _b:String;
		
		[Bindable(event="aEvent")]
		public function get a():String
		{
			return _a;
		}
		
		public function set a(a:String):void
		{
			_a = a;
			dispatchEvent(new Event("aEvent"));
		}
		
		public function set b(b:String):void
		{
			_b = b;
		}
		public function get b():String
		{
			return _b;
		}
	}
}

일단 지금까지의 코드와 다른 점은 EventDispatcher 클래스를 상속받고 있다는 점입니다. 
원래 Bindable로 설정하는 클래스는 모두 EventDispatcher를 상속받아야하지만 [Bindable] 메타태그가 있으면 컴파일러가 자동으로 상속을 시켜줬기 때문에 명시적으로 써주지 않아도 됐던 겁니다. 
하지만 사용자 정의 바인딩 이벤트에서는 23라인과 같이 사용자 정의 이벤트를 반드시 디스패치 해주어야 합니다. 
따라서 EventDispatcher를 꼭 상속받아야 하는 것이죠... 그리고 사용자 정의 바인딩 이벤트는 반드시 [Bindable] 메타태그를 get/set 메서드 위에 써줘야 합니다. 
멤버변수명 위에 [Bindable] 메타태그를 써주니 일반 이벤트인 propertyChange도 같이 발생하네요... 단 get과 set 둘 중 한곳에만 써주면 됩니다. 여기서 b 멤버변수는 여전히 propertyChange 이벤트를 발생하기 때문에 기본적인 바인딩이 됩니다. 

 공부하면서 정리한거라 부족하지만 바인딩을 적용시키는데 조금이나마 도움이 되길 바랍니다. ^^;;
반응형

+ Recent posts