기다려주세요: 이미지가 로딩할때 돌아가는 스피너(Spinner)
이 예제는 네트웍 너머의 이미지가 로딩되는 동안 보여지고 이미지가 완전하게 로드되었을때 한번에 사라지는 살아있는 스피너(spinner)를 어떻게 만드는지 보여줍니다.
Loading an image from Flickr.com
Flickr.com에서 이미지 로드하기
코드 이해하기
이 샘플의 핵심은 ImageLoadingSpinner 클래스 입니다. 그것은 특정 이미지 위에 스피너를 그리는 커스텀 노드 입니다. 이 클래스는 이미지의 프로그레스(progress) 변수를 관찰합니다. 프로그레스가 100에 다다랐을때 이미지 아래에서 보여지는 이 스피너는 사라져 버립니다. 이러한 처리는 Figure 1에서 보이는 것처럼 내부 프로그레스 변수에 의해서 처리됩니다.
public class ImageLoadingSpinner extends CustomNode {
public var image:Image;
public var width:Integer = 50;
public var height:Integer = 50;
var spinnerAnim:Timeline;
var fadeAnim:Timeline;
var progress = bind image.progress on replace {
if(progress >= 100) {
fadeAnim.start();
}
}
Figure 1: Monitoring the Image's Progress
이 클래스의 나머지 부분은 실제 스피너를 만듭니다. 그것은 중앙의 주위를 회전하는 네개의 원들의 그룹입니다. 이것은 0 부터 3까지 루프를 돌면서 중앙에서 파생된 반투명 원을 만들고 각도 변수에 오프셋(offet)을 더해서 회전하는 Figure 2의 코드로 처리됩니다. 각도 변수가 움직였을때 원들은 더욱 생기있게 됩니다.
override public function create():Node {
var angle = 0;
var spinner = Group {
content: [
// grey background
Rectangle { width: bind width height: bind height fill: Color.DARKGRAY },
//spinning circles
Group {
translateX: bind width/2
translateY: bind height/2
content: for(n in [0..3]) {
Circle { fill: Color.rgb(255,255,255,0.5)
centerX: 30 centerY: 30 radius: 50 rotate: bind angle+n*90
}
}
}
]
};
spinnerAnim = Timeline {
repeatCount: Timeline.INDEFINITE
keyFrames: [
at(0s) { angle => 0 tween Interpolator.LINEAR },
at(2s) { angle => 360 tween Interpolator.LINEAR }
]
};
spinnerAnim.start();
Figure 2: Spinner Code
실제로 create 함수에서 리턴되는 노드는 이미지와 이미지 최상단에 있는 스피너를 포함하는 그룹입니다. 페이드 애니메이션은 스피너의 불투명도를 0.5초 정도 낮추고 CPU 사이클이 너무 낭비되지 않도록 애니메이션을 멈춥니다.
fadeAnim = Timeline {
keyFrames: [
at(0s) { spinner.opacity => 1.0 tween Interpolator.LINEAR },
KeyFrame {
time: 0.5s values: spinner.opacity => 0.0 tween Interpolator.LINEAR
action: function():Void { spinnerAnim.stop(); }
},
]
};
return Group {
content: [ ImageView { image: image }, spinner ]
}
Figure 3: Fade Animation
예지하기
이 예제는 움직이는 슬라이드쇼 안의 스피너들 사이에 다른 애니메이션이 적용된 스피너들이나 다수의 이미지를 로딩하는 스피너를 만듦으로써 확장될수 있습니다.
Josh Marinacci썬마이크로시스템즈의 엔지니어