개요
본 글에서는 J2ME(Java 2 Platform, Micro Edition) 프로파일과 함께 사용할 수 있는 옵션 패키지인 Scalable 2D Vector Graphics API를 소개하도록 한다. 컴팩트한 확장식 2차원(2D) 그래픽을 렌더링하고 변환하는데 편리하게 사용할 수 있는 이 API는 Java Community Process (JCP)에 JSR 226으로 명시되어 있다. 우선 API와 전형적인 용례를 간략하게 살펴보고, 이 용례를 코드로 예시해 보도록 한다.
개관
JSR 226은 자바가 탑재된 모바일 애플리케이션에서 벡터 기반 2D 그래픽을 렌더링/재생할 수 있게 해준다. 한편, 모바일 업계를 주름잡는 Nokia를 위시한 JSR226의 전문가 그룹은 모두 자사의 장치에 벡터 기반 멀티미디어 컨텐츠를 도입하는 일에 관심을 가지고 있다. 지금 이 글을 쓰고 있는 현 시점에서야 겨우 스펙이 승인되었고, 모두들 레퍼런스가 구현되기를 학수고대하고 있는 상태이다.
모바일 애플리케이션 개발자들에게 있어서 벡터 그래픽은 컴팩트하면서도 확장성이 높다는 두 가지 큰 이점을 가지고 있다. 먼저 아래의 간단한 이미지를 살펴보자.
모바일 애플리케이션 개발자들에게 있어서 벡터 그래픽은 컴팩트하면서도 확장성이 높다는 두 가지 큰 이점을 가지고 있다. 먼저 아래의 간단한 이미지를 살펴보자.
그림 1: 간단한 예제 이미지
GIF 포맷인 경우 이 이미지에는 7,386바이트가 사용되는 반면, 벡터 포맷인 경우에는 사이즈가 693바이트로 전자 경우의 1/10에 불과하다. 그렇다면 이런 축소는 어떻게 가능한 것일까?
GIF 같은 래스터(Raster) 기반 이미지 포맷은 이미지를 구성하는 직사각형 영역의 각 픽셀에 대한 색상 정보를 인코딩하지만 벡터 기반 이미지에서는 픽셀의 색상을 결정하는 드로잉 명령만 포함된다. 이미지의 벡터 표현은 훨씬 더 컴팩트하기 때문에 리소스의 제약을 받는 모바일 장치에 상당히 유리하다.
확장성은 또 하나의 중요한 이점으로, 벡터 이미지는 드로잉 명령어가 해상도의 영향을 받지 않기 때문에 매끄럽게 변환될 수 있다. 그림 2는 앞의 이미지를 축소하고, 뒤집어(flip) 회전시킨 것이다.
그림 2: 변환된 예제 이미지
벡터 이미지의 측정 단위는 추상적(arbitrary)이고 상대적이며, 몇 가지 상수 요소로 곱하거나 나누어 이미지를 화면 크기에 맞도록 변환할 수 있다. 즉, 좌표에 간단한 수학적 연산을 적용함으로써 뒤집기, 회전, 확대, 기울이기(skewing) 등을 포함한 거의 무한한 효과를 낼 수 있다. 또한, 애플리케이션 개발자가 벡터 그래픽을 이용할 경우 화면의 해상도가 서로 다른 장치를 지원하기 위해 별도의 이미지 및 아이콘 세트를 생성할 필요가 없다.
벡터 그래픽의 간결성과 확장성은 애니메이션 분야에서 특히 빛을 발한다. 래스터 기반 애니메이션의 경우에는 웹 페이지의 애니메이션 GIF나 MIDP 게임의 애니메이션 스프라이트처럼 애니메이션의 각 프레임마다 수고스럽게 전체 이미지를 포함시켜야 하지만 벡터 기반 애니메이션에는 변화될 특정 이미지 요소와 그 시점을 지시하는 명령어만 포함하면 된다. 벡터 이미지가 래스터 이미지보다 한 등급 작다면, 결국 벡터 애니메이션이 래스터 애니메이션보다 두 등급이 더 작은 것이기 때문에 모바일 장치에서 멀티미디어 컨텐츠를 전송하고 표시하는 데 이상적이다.
특허권이 있는 Macromedia Flash 플레이어를 기반으로 한 벡터 그래픽과 애니메이션이 웹 상에서 인기를 얻었다면, SVG(Scalable Vector Graphics) 파일 포맷은 그 밖의 분야에서 개방 표준에 특허권이 없는 대안으로 부상한 바 있다. 이 포맷은 W3C(World Wide Web Consortium)에 의해 표준화되며, SVG-Tiny는 SVG의 전체 기능 중에서 모바일 장치에 맞게 조정된 일부 기능을 제공한다. JSR 226은 J2ME 벡터 그래픽을 위한 공식 파일 포맷으로 SVG-Tiny 버전 1.1을 채택하고 있다. W3C는 SVG-Tiny를 ‘프로파일’이라고 부르지만 여기서는 J2ME 프로파일과의 혼동을 피하기 위해 ‘포맷’이라는 용어를 사용하고자 한다.
SVG-Tiny 표준은 또한 애니메이션을 지원하는 구현을 가능케 해준다. 이미지 파일 자체에 내장된 명령어는 타이머 이벤트와 사용자 인풋에 응답하여 이미지 요소들의 위치와 속성을 수정할 수 있다.
좀더 복잡한 상호작용을 위해, JSR 226은 SVG 1.2의 풀 DOM(Document Object Model)의 서브세트인 microDOM과 호환이 되는 API를 채택하는데, 자바 기반 프로그램은 이 API를 이용하여 벡터 이미지 및 애니메이션을 즉석에서 생성/수정할 수 있다.
SVG는 public schema로 잘 문서화되고 코드화된 XML(eXtensible Markup Language) 포맷이며, SVG-Tiny 파일은 작기는 하지만 여전히 SVG 파일이므로 당연히 XML을 포함하고 있다. 다음은 그림 1 ‘brave world’ 이미지를 풀 SVG-Tiny로 표현한 것이다.
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
<svg preserveAspectRatio="xMidYMid meet"
viewbox="10 10 130 55" width="150.0" height="75.0">
<rect x="25" y="25" transform="translate(75 36.375)
rotate(15) translate(-70 -35.375)" fill="#00007E"
width="100" height="22.75" stroke="#000000" stroke-width=".5"/>
<rect x="25" y="25" fill="#FF9800" width="108.5"
height="22.75" stroke="#000000" stroke-width=".5"/>
<text x="30" y="40" fill="#00007E" stroke="#FFFFFF"
stroke-width=".33" xml:space="preserve">Hello brave world.</text>
</svg>
이 문서는 2개의 직사각형과 몇 가지 텍스트를 선언한다. 첫 번째 직사각형은 해당 rect 태그의 transform 속성에 포함된 일련의 변환에 의해 중심 축에서 15도 회전되고, 두 번째 직사각형은 첫 번째 직사각형 위에, 텍스트는 두 번째 직사각형 위에 그려진다.
원본 XML 텍스트는 그다지 컴팩트한 포맷은 아니지만 이 문서는 여전히 압축된 래스터 표현보다도 훨씬 작을 뿐 아니라 육안 판독도 가능하다. XML 텍스트는 압축이 잘 되기 때문에 SVG 문서는 애플리케이션의 JAR 파일에서 상대적으로 작은 공간을 차지한다. JSR 226은 gzip으로 압축된 SVG 문서를 지원하는 구현을 필요로 하며, 확장자 .svgz는 gzip 압축문서를 나타낸다.
원본 XML 텍스트는 그다지 컴팩트한 포맷은 아니지만 이 문서는 여전히 압축된 래스터 표현보다도 훨씬 작을 뿐 아니라 육안 판독도 가능하다. XML 텍스트는 압축이 잘 되기 때문에 SVG 문서는 애플리케이션의 JAR 파일에서 상대적으로 작은 공간을 차지한다. JSR 226은 gzip으로 압축된 SVG 문서를 지원하는 구현을 필요로 하며, 확장자 .svgz는 gzip 압축문서를 나타낸다.
모바일 2D API
JSR 226은 주로 SVG-Tiny 포맷의 기능들과 밀접하게 동조하는 클래스들의 서브세트인 M2G(Mobile 2D Graphics) API를 정의하는 역할을 수행하는데, 그렇다고 해서 이것을 J2SE의
M2G는 벡터 이미지 생성 및 렌더링을 위한 하이 레벨 클래스와 벡터 이미지의 XML 컴포넌트를 DOM(Document Object Model) 트리의 일부로 조작하기 위한 로우 레벨 클래스로 구성된다. 벡터 이미지는
이 클래스들은 표 1에 요약한
Graphics2D 클래스가 제공하는 것과 같은 일반 2D 드로잉 툴킷으로 보기는 어렵다. 분명한 것은 M2G API가 SVG 컨텐츠의 재생과 런타임 조작에 초점을 맞추고 있다는 점이다. M2G는 벡터 이미지 생성 및 렌더링을 위한 하이 레벨 클래스와 벡터 이미지의 XML 컴포넌트를 DOM(Document Object Model) 트리의 일부로 조작하기 위한 로우 레벨 클래스로 구성된다. 벡터 이미지는
ScalableImage의 인스턴스로, 여러분은 이 인스턴스를 해당 클래스의 정적 createImage() 메소드로부터 얻고, ScalableGraphics의 인스턴스를 이용하여 MIDP Graphics 컨텍스트 상에 ScalableImages를 그릴 수 있다. SVGImage는 이벤트 핸들링을 위한 후크(hooks)와 기본적인 DOM 문서에 대한 액세스를 제공하는 ScalableImage의 서브클래스이다. SVGAnimator 클래스는 애니메이션 SVG 컨텐츠를 렌더링하는 커먼 케이스(common case)를 더 편리하게 해준다. MIDP 애플리케이션의 경우, SVGAnimator는 애니메이션 이벤트에 응답하는 화면 업데이트와 이미지에 대한 프로그램적 수정을 자동으로 처리하는 Canvas 오브젝트를 생성?제어하고, 아울러 애니메이션의 재생을 제어하기 위해 비디오 플레이어와 같은 인터페이스를 제공한다. 이 클래스들은 표 1에 요약한
javax.microedition.m2g 및 org.w3c.dom.svg 패키지에 정의되어 있으며 JSR 226 specification에서 상세히 다루고 있다. 한편, 표준 org.w3c.dom 및 org.w3c.dom.events 패키지에 정의된 기본 DOM 클래스와 인터페이스는 SVG DOM 클래스에 의해 확장된다. |
Class or Interface |
Description | |||
|---|---|---|---|---|
javax.microedition.m2g | ||||
ScalableGraphics |
2D 렌더링의 기본이 되는 클래스 | |||
SVGAnimator |
이 클래스는 SVGImage의 업데이트와 애니메이션을 대상 사용자 인터페이스 컴포넌트로 자동 렌더링한다. | |||
SVGEventListener |
이 인터페이스는 플랫폼별 이벤트를 애플리케이션으로 전송하는 데 사용된다. | |||
SVGImage |
이 클래스는 W3C SVG Tiny 1.1 Profile 에 따른 SVG 이미지를 나타낸다. | |||
ExternalResourceHandler |
이 인터페이스는 SVG 컨텐츠 로드에 필요한 외부 리소스를 동기적으로 로드하는데 사용된다. | |||
org.w3c.dom.svg | ||||
SVGAnimationElement |
이 인터페이스는 애니메이션 요소를 나타내며 애니메이션의 타이밍을 제어하는 메소드를 포함한다 . | |||
|
문서 트리의 SVG 요소를 나타낸다 . | ||||
SVGLocatableElement |
이 인터페이스는 외형 (shape), 이미지 , 텍스트 등의 그릴 수 있는 SVG 요소를 나타낸다 . | |||
SVGMatrix |
이 인터페이스는 번역을 수반한 선형 변환에 해당하는 어파인 변환 (affine transformation) a?“ 에 의해 식별되는 ‘ SVG matrix ’ 데이터 유형을 나타낸다 . | |||
SVGPath |
경로 지오메트리를 정의하는 데 사용되는 ‘ SVG path ’ 데이터 유형을 나타낸다 . | |||
SVGPoint |
x 및 y 컴포넌트에 의해 식별되는 ‘ SVG point ’ 데이터 유형을 나타낸다 . | |||
SVGRect |
최소 X, 최소 Y, 폭 , 높이 값으로 구성되는 ‘ SVG rectangle ’ 데이터 유형을 나타낸다 . | |||
SVGRGBColor |
적 , 녹 , 청 컴포넌트로 구성되는 ‘ SVG RGB color ’ 데이터 유형을 나타낸다 . | |||
SVGSVGElement |
SVG 문서 트리의 요소를 나타낸다 . | |||
M2G 애플리케이션 작성하기
M2G 애플리케이션을 작성하려면 먼저 JSR 226의 실질적인 구현이 필요한데, 현재로서는 스펙만 마무리된 상태이고 이를 구현하는 장치도 없고 공식 레퍼런스 구현을 이용할 수도 없는 형편이다. 여러분은 mpowerplayer developer toolkit에 추가 패키지로 제공되는 한정된 시험판을 다운로드하여 사용할 수 있다.
아울러, SVG-Tiny 컨텐츠가 필요하다. 이 글에서는 위의 ‘brave world’ 이미지를 사용하지만 모빌리티 개발 툴메이커 TinyLine에서 더 많은 SVG-Tiny 예제를 구할 수 있다. 여러분은 또한 Sketsa라 불리는 자바 기반의 상용 애플리케이션으로 직접 컨텐츠를 작성할 수도 있는데, 이 애플리케이션은 일러스트레이션 툴처럼 작동하며 SVG를 파일 포맷으로 사용한다.
SVG 컨텐츠를 화면에 표시하는 방법으로는 여러 가지가 있는데, 이중 가장 간단한 방법은 이미지에 대한
아울러, SVG-Tiny 컨텐츠가 필요하다. 이 글에서는 위의 ‘brave world’ 이미지를 사용하지만 모빌리티 개발 툴메이커 TinyLine에서 더 많은 SVG-Tiny 예제를 구할 수 있다. 여러분은 또한 Sketsa라 불리는 자바 기반의 상용 애플리케이션으로 직접 컨텐츠를 작성할 수도 있는데, 이 애플리케이션은 일러스트레이션 툴처럼 작동하며 SVG를 파일 포맷으로 사용한다.
SVG 컨텐츠를 화면에 표시하는 방법으로는 여러 가지가 있는데, 이중 가장 간단한 방법은 이미지에 대한
SVGAnimator를 생성하고 그 Canvas를 화면에 표시하는 것이다. 또 다른 방법은 ScalableImage 인스턴스를 생성하고 ScalableGraphics의 인스턴스를 이용하여 이를 자체 Canvas 또는 CustomItem의 Graphics 컨텍스트 상에 드로잉하는 것이다. 이렇게 하면 프레젠테이션을 제어하기가 더 쉽다는 장점이 있지만 애니메이션 또는 사용자 인터랙션의 결과로 인풋 이벤트와 리페인트(repaints)를 처리해야 하는 책임이 따르게 된다. SVG 애니메이터를 이용하여 2D Graphics 표시하기
정적
일단
createAnimator() 메소드로부터 SVGAnimator의 인스턴스를 획득하여 자신만의 SVGImage를 제공할 수 있다. 애니메이터는 동적 컨텐츠를 위한 모든 사용자 인터랙션과 애니메이션을 처리하기 때문에 SVGAnimator를 이용하는 것은 탁월한 선택이 될 수 있다. play(), pause(), stop(), setTimeIncrement() 메소드는 애니메이션의 재생을 프로그램적으로 제어할 수 있게 해주는데, 이 구현을 통해 동적 행동을 지시하기 위한 원시(native) 사용자 인터페이스를 제공할 수도 있다. 일단
SVGAnimator를 획득하면 이를 애플리케이션에 끼워 넣기는 어렵지 않다. getTargetComponent()를 호출하면 화면에 표시할 수 있는 Canvas의 인스턴스를 반환한다. 다음은 관련 예제이다. public void animationTest()
{
// create an animator to load the content
SVGAnimator animator =
SVGAnimator.createAnimator( image );
// add our custom event listener
animator.setEventListener(
new CustomEventListener( animator ) );
// get the Canvas for this player; requires a cast
Canvas canvas = (Canvas) animator.getTargetComponent();
// add a "back" command
canvas.addCommand( backCommand );
canvas.setCommandListener( this );
// show it
Display.getDisplay(this).setCurrent( canvas );
// start it
animator.play();
}
MIDP 환경에서
그림 3은 폼이 화면에 표시된 모습인데, 구현 방식에 따라 그리고 스타일러스 또는 기타 포인팅 디바이스의 사용 여부에 따라 애니메이터는 사용자와 컨텐츠 간의 상호작용을 허용할 수도 있다. ‘brave world’ 예제의 경우, 동적 컨텐츠는 없지만 텍스트는 선택이 가능하다는 점에 유의한다.

getTargetComponent()로부터 반환되는 값은 MIDP Canvas인데, 비(非) MIDP 환경에서는 이 결과가 native windowing 시스템에 적합할 것으로 사료된다(예: AWT 환경에서 Component). 환경에 적합한 선택이 둘 이상인 경우에는 원하는 클래스의 이름을 createAnimator()에 대한 두 번째 아규먼트로 제공하도록 한다. 그림 3은 폼이 화면에 표시된 모습인데, 구현 방식에 따라 그리고 스타일러스 또는 기타 포인팅 디바이스의 사용 여부에 따라 애니메이터는 사용자와 컨텐츠 간의 상호작용을 허용할 수도 있다. ‘brave world’ 예제의 경우, 동적 컨텐츠는 없지만 텍스트는 선택이 가능하다는 점에 유의한다.

그림 3:
SVGAnimator에 의해 제어되는 Canvas 애니메이터와의 상호작용
‘brave world’ 이미지는 애니메이션이 아니지만, 약간의 프로그래밍으로 상호작용을 추가할 수 있다.
JSR 226의 DOM 지원은 프로그램이 이미지의 구조를 변경할 수 있게 해준다.
JSR 226의 DOM 지원은 프로그램이 이미지의 구조를 변경할 수 있게 해준다.
SVGImage도 다른 XML 문서와 마찬가지로 DOM 오브젝트 트리로 표현되며, M2G API는 친숙한 XML 조작 기법을 사용하여 이미지를 수정할 수 있게 해준다. 트리의 각 노드는 SVGElement이며 인접한 부모 및 자식 노드로 네비게이트하기 위한 메소드를 제공한다. 노드를 수정하려면 자식 노드를 추가/제거하거나, 해당 요소 클래스에 캐스팅하고 그 클래스의 메소드를 호출하여 변경하면 된다. SVGEventListener 인터페이스는 애플리케이션이 SVGAnimator의 Canvas로부터 사용자 인풋 이벤트를 수신할 수 있게 해준다. 다음 예제는 DOM API를 이용하여 사용자의 화살표 키를 통한 인풋에 응답하여 이미지를 확대/축소하고 회전시키는 경우이다. {
int gameAction = canvas.getGameAction( keyCode );
switch ( gameAction )
{
case Canvas.UP:
scale( 0.10f );
break;
case Canvas.LEFT:
rotate( -10.0f );
break;
case Canvas.DOWN:
scale( -0.10f );
break;
case Canvas.RIGHT:
rotate( 10 );
break;
default:
// leave unchanged
}
}
private void rotate( final float delta )
{
// put ourselves on the animator's thread
animator.invokeLater( new Runnable()
{
public void run()
{
// execute the transformation
Document document = svgImage.getDocument();
SVGSVGElement root = (SVGSVGElement)
document.getDocumentElement();
root.setCurrentRotate( root.getCurrentRotate() + delta );
}
} );
}
private void scale( final float delta )
{
// put ourselves on the animator's thread
animator.invokeLater( new Runnable()
{
public void run()
{
// execute the transformation
Document document = svgImage.getDocument();
SVGSVGElement root = (SVGSVGElement)
document.getDocumentElement();
root.setCurrentScale( root.getCurrentScale() + delta );
}
} );
}
SVGImage.getDocument()는 애니메이터가 렌더링하는 문서에 레퍼런스를 제공한다. 플레이어가 애니메이션을 실행하거나 다른 동적 컨텐츠를 업데이트 중일 수도 있기 때문에, 변경내용을 애니메이션 쓰레드와 동기화할 때 주의하지 않으면 예기치 않은 장애가 발생할 수도 있다. SVGAnimator's invokeAndWait() 및 invokeLater() 메소드는 애니메이션 쓰레드 상에서 코드가 실행되도록 하기 위해 AWT의 경우와 비슷하게 작동한다. 2D 컨텐츠 직접 렌더링하기
SVG 이미지의 렌더링 위치와 방식을 철저히 제어하고 싶다면
정적
아래의 예제에서는
ScalableGraphics 클래스를 이용하여 Canvas, Layer, 또는 CustomItem 인스턴스의 paint() 메소드로 전달된 Graphics 오브젝트 상에 직접 ScalableImage를 드로잉할 수 있다. 정적
createInstance() 메소드를 인보크하여 ScalableGraphics의 인스턴스를 생성한다. 드로잉 전에 먼저 bindTarget() 메소드를 이용하여 확장 그래픽스 인스턴스를 페인트 메소드로 전달된 그래픽스 오브젝트에 바인딩해야 한다. 작업이 완료된 후에는 releaseTarget()을 호출하는 것을 잊지 않도록 하고, 일단 바인딩이 설정되면 render() 메소드를 이용하여 각각의 이미지를 드로잉하면 된다. 아래의 예제에서는
render()에 대한 각 호출 전에 setViewportHeight() 및 setViewportWidth() 메소드를 호출하여 ‘brave worl’ 이미지를 다양한 크기로 반복해서 드로잉한다. private static class M2GCanvas extends Canvas
{
// retain a reference the specified image
ScalableImage scalableImage;
// retain an instance of a scalable graphics
ScalableGraphics scalableGraphics;
public M2GCanvas( ScalableImage inImage )
{
scalableImage = inImage;
// create the scalable graphics instance
scalableGraphics = ScalableGraphics.createInstance();
}
public void paint( Graphics g )
{
// clear the display
g.setColor( 255, 255, 255 );
g.fillRect( 0, 0, getWidth(), getHeight() );
// bind our scalable graphics to the given graphics
scalableGraphics.bindTarget( g );
// render at fixed position and size
scalableImage.setViewportWidth( 50 );
scalableImage.setViewportHeight( 75 );
scalableGraphics.render( 5, 50, scalableImage );
// again at different position and size
scalableImage.setViewportWidth( 100 );
scalableImage.setViewportHeight( 150 );
scalableGraphics.render( 80, 5, scalableImage );
// again at size that varies with the canvas size
scalableImage.setViewportWidth( getWidth()-20 );
scalableImage.setViewportHeight( getHeight()-20 );
scalableGraphics.render( 0, 0, scalableImage );
// release the graphics context
scalableGraphics.releaseTarget();
}
}
이 간단한 Canvas 서브클래스는 이미지를 서로 다른 위치와 크기로 세 차례에 걸쳐 표시하는데, 세 번째 이미지는 캔버스의 크기를 꽉 채운 경우이다. 화면 크기를 조절할 수 있는 장치에서는 이미지가 적절하게 확대/축소된다. 그림 4는 캔버스가 표시되었을 때의 결과를 보여주며, 제공된 구현에서는 창의 크기 조절에 따라 큰 쪽의 이미지도 확대/축소된다.
그림 4: Canvas에서
ScalableImages 확대/축소하기 렌더링하고 있는 이미지가 동적인 경우에는 사용자와 이미지 간 상호작용을 허용해야 한다.
SVGAnimator 없이 렌더링하는 경우에는 사용자의 포인터 이벤트를 탐지, 이미지를 어느 위치에서 클릭하는지 확인하고, SVGImage 상의 dispatchMouseEvent()를 호출하여 스크립트된 행동을 트리거해야 한다. CustomItem의 경우에는 form traversal이 SVGImage의 activate() 및 focusOn() 메소드를 이용하여 활성화를 허용하고 이미지 내의 요소들에 대한 네비게이션을 포커스해야 한다. 프로그램은 기존
SVGImage의 DOM을 조작할 수 있을 뿐 아니라 스크래치로부터 이미지를 구축할 수도 있다. SVGImage의 정적 createEmptyImage() 메소드는 비어있는 문서 뼈대를 가지는 이미지를 반ㅇ환하는데, 여기 상에 프로그램적으로 생성되는 외형과 변환(shapes and transformations)을 나타내는 SVGElements를 바로 파퓰레이트할 수 있다. 한편, 이 기법을 ScalableGraphics와 연계하여 사용하면 일반화된 2D 드로잉 툴킷의 효과를 얻을 수는 있지만, 앞에서 지적했듯이 이러한 용도로 활용하는 것을 권장하지는 않는다. 결론
J2ME용 Scalable 2D Vector Graphics API는 벡터 기반 이미지 및 애니메이션을 렌더링하고 조작할 수 있게 해주며, 컴팩트하고 확장성이 뛰어난 벡터 이미지는 모바일 애플리케이션에 특히 안성맞춤이다. JSR 226의 Mobile 2D Graphics API는 애플리케이션이 MIDP 및 AWT 툴킷을 이용하여 SVG 컨텐츠를 생성, 표시, 수정할 수 있게 한다.
"Java ME" 카테고리의 다른 글
- Wireless Messaging API 2.0 (댓글 4개 / 트랙백 0개) 2005/12/07
- 모바일 자바 플랫폼의 현재와 미래 (댓글 5개 / 트랙백 1개) 2006/07/26
- Java ME 애플리케이션에서 SATSA API를 사용하여 데이터를 암호화하는 방법 (댓글 0개 / 트랙백 0개) 2007/12/03
- OpenGL ES와 모바일 센서 API를 이용한 게임 업계의 새로운 지평 (댓글 0개 / 트랙백 0개) 2008/05/20
- PIM API 시작하기 (댓글 2개 / 트랙백 0개) 2006/02/02
- Personal Basis Profile 대 Personal Profile: 차이점은... (댓글 4개 / 트랙백 0개) 2006/03/26
- NetBeans를 사용해야 하는 12가지 이유 (댓글 4개 / 트랙백 0개) 2006/08/26
- NetBeans IDE에서 모빌리티 지원하는 게임 만들기 (댓글 1개 / 트랙백 0개) 2008/01/18
- 블루투스에 대한 궁금증 해결 (댓글 0개 / 트랙백 0개) 2008/06/09
- 모바일 및 임베디드 개발자 컨퍼런스 Recap (댓글 0개 / 트랙백 0개) 2008/02/26
2005/11/10 18:05
2005/11/10 18:05
댓글을 달아 주세요
늘 유익한 정보 감사합니다
2007/09/07 20:10수능 보는것처럼 어렵습니다.
2007/09/08 03:11천천히 조금씩 배우려구요.
저희 회사도 자바로 구동되는 시설감시 프로그램 많이 씁니다. 자바 좋은 나료 많이 얻어서 회사일에 많은 도움이 될것 같습니다.
2007/09/14 22:57좋은 정보 감사해요~
2007/09/19 05:00