이원희 maestro.wh@gmail.com, 변광민 yelllo wsun@gmail.com, 신정수 hello_mile2@ naver.com|삼성전자 소프트웨어 멤버십 정회원이며 현재 S펜 SDK를 사용한 프로젝트를 진행하고 있다. 안드로이드 플랫폼뿐만 아니라 모바일 생태계, 소프트웨어 엔지니어링, 병렬처리, 신호처리, 자연어 처리 등 다양한 분야에 관심을 가지고 관련 분야를 연구하고 있는 학생들이다.

2011년 11월 국내 출시된 갤럭시 노트는 출시 7개월이 지난 지금까지도 돌풍을 일으키고 있다. 특히 5.3인치의 큰 화면과 사용자의 필기압력을 256단계로 인식하는 노트 그리고 S펜만의 강점은 안드로이드 애플리케이션 개발자들에게 새로운 도전 기회를 부여하고 있다. 


<그림 1> S펜 SDK 문서 클래스 구조도

현재 갤럭시 노트는 아이스크림 샌드위치 프리미엄 스위트(ICS Premium Suite) 업그레이드를 통해 지속적으로 점유율을 늘리면서 5인치 스마트폰 시장 활성화를 주도하고 있다. 또한 500만대 이상이 판매되면서 새로운 안드로이드 애플리케이션 개발의 핵심 디바이스로 자리매김하고 있다. 이 글은 안드로이드 개발자들이 갤럭시 노트 애플리케이션 개발의 시작을 좀더 편리하게 접근할 수 있길 바라며 기획됐다. 

S펜 SDK 소개
삼성전자는 S펜을 활용한 애플리케이션 개발을 지원하고자 S펜 SDK를 제공 중이다. 2012년 7월 2.1 버전이 공개됐으며, 한글과 영어 그리고 중국어를 지원한다. 

2011년 8월 갤럭시 노트가 발표되던 시점에서의 S펜 SDK는 0.5 버전이었다. 이후 여러 번의 업데이트를 거치면서 현재 2.1 버전을 제공하고 있다. 버전별 SDK를 간단히 소개하면 다음과 같다.

- ver. 0.5 : S펜을 지원하는 기본 API 제공
- ver. 1.0 : 그림 그리기(Drawing) 기능 추가
- ver. 1.5 : 그림 그리기 기능 확장
- ver. 2.0 : 아이스크림 샌드위치 지원, SAMM(Samsung Animated Multimedia Message) 탑재 및 애니메이션 기능 추가
- ver 2.0.1 : 안드로이드 에뮬레이터 지원
- ver. 2.1 : S펜에 좀더 특화된 기능들 추가

삼성 개발자 포럼(developer.samsung.com)에서는 S펜 SDK로 개발하는 과정에서 발생되는 문제점들을 다른 사용자들은 어떻게 해결했는지 확인할 수 있으며 또 공유할 수 있다. 보통은 언어적인 문제 때문에 한글 관련 문서만을 선호하지만 만일 프로그램 개발 중 문제가 발생해 포럼을 방문하게 된다면 영어 포럼에 가보길 당부한다. 왜냐하면 한글 포럼보다 스레드 수가 월등히 많고 참여하는 개발자들도 많아 문제에 대한 핵심정보를 얻을 수 있는 가능성이 높기 때문이다.

2.1 버전은 이전 버전과 다르게 안드로이드 기본 이벤트와 S펜 이벤트를 분리했으며, 그 외 다양한 기능들을 더했다. 기능 추가와 함께 SDK에서 불필요한 기능들은 과감히 제거하고 비슷한 기능들은 패키지로 묶어 구조적인 면에서도 많은 발전을 이뤘다고 평가받고 있다. SDK의 다운로드와 간단한 사용법을 포함한 API 문서는 삼성 개발자 포럼 사이트를 참고하기 바란다.

아이스크림 샌드위치에 대응한 2.1 버전
S펜 SDK 2.1 버전은 아이스크림 샌드위치에서 새롭게 추가된 기능을 지원할 뿐만 아니라 내부적으로도 발전된 형태를 보여주고 있다. 또한 몇 가지 유용한 기능들이 추가됐는데, 이를 통해 개발자들은 편리하게 S펜 SDK를 사용할 수 있을 것으로 여겨진다. 


<그림 2> S펜 SDK 2.1

만약 애플리케이션을 2.01 버전으로 개발했다면 CanvasView의 초기화 부분부터 deprecated돼 많은 부분을 수정해야 할 것이다. 특히 2.1 버전까지는 수정하지 않고 사용할 수 있지만 차기 버전부터는 지원하지 않는다고 하니 수정하는 편이 더 낫다고 생각한다. 2.1 버전에서 달라진 점을 요약하면 다음과 같다.

- com.samsung.spen.lib.input Package 추가 : S펜을 활용한 터치 이벤트와 기본 터치 이벤트를 분리, Hover 이벤트 추가
- com.samsung.spen.lib.imagePackage 추가 : 지원 효과 필터에 연필 스케치(Pencil Sketch), 파스텔 스케치(Pastel Sketch), 모자이크 등이 있음
- com.samsung.spen.applistenerPackage 추가
- TextSettingInfoClass 추가
- SCanvasViewClass 신규 기능 추가 및 개선

S펜 SDK 샘플 프로젝트
S펜 SDK에 첨부된 샘플 프로젝트들은 기능별로 정리가 잘 돼 있다. 개발 초기 시점이라면 자신의 프로젝트에 필요한 기능들을 사전 구현하고 있는 샘플 프로젝트를 먼저 살펴본 후 개발한다면 좀 더 빠르게 방향을 잡을 수 있을 것이다. 샘플 프로젝트의 종류와 설명은 다음과 같다.

● Example 1 : SPen_Example_Simple
이후 다루게 될 SCanvasView의 기본적인 사용법과 파일저장, 배경설정과 관련된 프로젝트다. 초기 학습 시 해당 프로젝트를 확인한다면 SDK의 기본적인 사용을 익힐 수 있다.

● Example 2 : SPen_Example_ImageClip
S펜으로 그린 그림을 TextView에 텍스트들과 함께 포함시키는 프로젝트다. SDK의 사용 설명보다 활용 쪽에 가깝다. SCanvasView에서 이미지 파일을 추출한 다음 파일의 Uri를 액티비티 간 전송을 활용해 주고받는다.

● Example 3 : SPen_Example_ZoomPan
SCanvasView를 확대 또는 축소시키거나 확대된 상태에서 뷰가 비추는 위치를 이동시키는 간단한 프로젝트다.

● Example 4 : SPen_Example_ColorPickerSetting
2.1 버전에서 새롭게 추가된 기능인 Color Picker 기능을 구현한 프로젝트다. SCanvasView의 setColorPickerMode를 설정하고, ColorPickerColorChangeListener를 통해 int 값으로 색 정보를 추출한다.

● Example 5 : SPen_Example_SPenEvent
필자가 2.1 버전으로 업그레이드된 이후 가장 먼저 본 샘플 프로젝트다. 이전 버전의 경우 SDK상에서의 이벤트는 안드로이드의 기본 터치 이벤트와 크게 다르지 않았기 때문에 S펜 관련 이벤트를 처리하는 데 많은 어려움이 있었다. 

하지만 2.1 버전은 SDK상에서 내부 Listener를 정의해 이벤트들을 나눠놨기 때문에 이전 버전보다 개발이 매우 용이해졌다. 이 프로젝트에서는 일반적인 터치, S펜을 이용한 터치, Hover 이벤트, 펜의 압력, 펜의 물리 키 클릭 이벤트를 총망라하고 있어 S펜을 활용한 이벤트 대부분을 익힐 수 있을 것이다.

● Example 6 : SPen_Example_ImageFilter
2.1 버전에서 새롭게 추가된 기능인 Image Filter 기능을 사용한 프로젝트다.

● Example 7 : SPen_Example_ScratchEffect
setClearImageBitmap 메소드를 사용해 즉석복권을 긁은 효과를 SDK로 표현한 프로젝트다.

● Example 8 : SPen_Example_EraserAnimation
Example 7처럼 setClearImageBitmap 메소드를 사용하지만 SCanvasView의 애니메이션 기능을 사용해 스크래치(scratch) 과정을 애니메이션으로도 볼 수 있는 프로젝트다. SCanvasView의 애니메이션 기능을 간단하게 학습할 수 있는 프로젝트다.

● Example 9 : SPen_Example_AnimationEditor
SCanvasView가 지원하는 애니메이션 기능과 함께 사용할 수 있는 대부분의 기능을 구현하는 프로젝트다. 뷰에 사진과 텍스트를 첨가하는 기능부터 애니메이션의 배경음악 설정과 해당 음악을 보이스 레코딩을 통해 설정할 수 있는 기능, 애니메이션 시 효과음 설정 등 매우 다양한 기능들을 구현하고 있다. Example 1이 SCanvas View 사용 방법을 학습한 것이라면 이 프로젝트는  좀더 심화된 사용방법을 학습하는 것이다.

● Example 10 : SPen_Example_Signature
2.1 버전에서 추가된 재미있는 기능으로 서명 기능을 구현한 프로젝트다. 서명을 등록하고 인증 레벨을 설정하면 인증의 성공과 실패 여부를 볼 수 있다. 서명엔진을 사용할 때 필요한 설정과 엔진 사용법을 학습하는 데 도움을 준다.

S펜 SDK 사용요령
S펜 SDK 사용하려면 간단하게 jar 파일을 프로젝트에 포함시키면 된다. 각 단계별 과정을 간단하게 설명하면 다음과 같다. 


<그림 3> 프로젝트에 라이브러리 추가 예

1. 안드로이드 개발환경이 구축된 이클립스에 새로운 안드로이드 프로젝트를 생성한다.
2. 프로젝트에 libs이라는 이름으로 새로운 폴더를 생성한다(r17부터는 lib이 허용되지 않으므로 libs라고 해야 한다).
3. 다운로드한 S펜 SDK 폴더의 하위폴더인 lib 폴더 아래에 있는 libspen21.jar 파일을 2번 과정에서 생성한 libs 폴더에 복사한다.
4. 추가적으로 영상처리 기능과 같은 2.1 버전이 제공하는 기능들을 사용하려면, 2번 과정에서 생성한 libs 폴더 아래에 armeabi이라는 이름으로 새 폴더를 생성한다. 그 후 S펜 SDK 폴더의 하위폴더인 lib과 armeabi 폴더에 있는 .so 형식의 모든 파일들을 생성한 폴더에 복사한다.

더 자세한 S펜 라이브러리 추가 방법은 삼성 개발자 포럼 사이트에서 제공하는 듀토리얼에서 확인할 수 있다.

SCanvasView 사용하기2.01 버전에서 2.1 버전으로 업그레이드되면서 눈에 띄게 변한 것 중 하나가 SCanvasView의 사용이다. 2.01 버전에서는 CanvasView를 타겟으로 샘플 프로젝트를 설명했다면 2.1 버전에서는 SCanvasView를 기준으로 모든 샘플 프로젝트와 튜토리얼을 설명한다. 


<그림 3> SCanvasView 예

SCanvasView는 CanvasView를 상속받은 클래스로 갤럭시 노트의 S-메모(S-Memo)에서 쓰이는 그림판이라고 생각하면 된다. S펜 SDK 사용 시 기본 화면이 되며 대부분의 인터렉션들은 이 화면 위에서 이루어진다. 또한 필기뿐만 아니라 애니메이션 기능과 멀티미디어 객체들도 활용할 수 있으며, View 저장 시 폭넓은 기능들을 제공한다. 

물론 간단한 필기 기능만 필요할 경우 CanvasView를 사용하면 되겠지만, 많은 부분이 deprecated됐고 저장기능이 없어졌으므로 SCanvasView를 사용할 것을 권장한다.

<리스트 1> SCanvasView 초기화
SCanvasView mSCanvas;
mSCanvas=(SCanvasView)findViewById(R.id.canvas_view);

<리스트 1>은 SCanvasView의 초기화 코드다. CanvasView에서도 동일하게 해당 코드만으로 간단한 그리기 작업을 수행할 수 있다. 2.1 이전 버전인 경우 SAMM 라이브러리를 쓰려면 별도의 메소드를 호출해야만 했다. 

<리스트 2> SCanvasView의 기본적인 사용방법
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_PEN); // 펜 모드
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_ERASER); // 지우개 모드
mSCanvas.setCanvasMode(SCanvasConstants.SCANVAS_MODE_INPUT_TEXT); // 텍스트 모드
mSCanvas.undo(); // Undo
mSCanvas.redo(); // Redo

그러나 2.1 버전에서는 SCanvasInitializeListener의 onInitialized() 메소드를 사용해 추가적으로 메소드를 호출할 필요 없이 SAMM 라이브러리를 사용하거나 배경화면을 바꾸는 것과 동일한 초기화 작업을 수행할 수 있다. 

다만 필요한 경우 SCanvasInitializeListener를 꼭 등록해야 한다. 이 때 임시파일들을 정리하기 위해 애플리케이션 종료 시 closeSCanvasView()를 호출해야 함을 잊지 말자.

SettingView 사용하기
2.1 이전 버전에서는 레이아웃에 단순히 SettingView를 배치해 보이게 하거나 또는 보이지 않게 했다면 2.1 버전에서는 SettingView가 배치될 컨테이너 뷰(container view)를 바탕에 둔 다음 그 안에 배치될 SettingView를 HashMap을 사용해 초기화한다. 

<리스트 3> 2.1 이전 버전의 SettingView 초기화 예
<com.samsung.sdraw.SettingView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/setting_view"/>
 
mSettingView = (SettingView) findViewById(R.id.setting_view);
mCanvasView.setSettingView(mSettingView);

<리스트 4> 2.1 버전의 SettingView 초기화 예
// Resource
HashMap<String,Integer>settingResourceMap=newHashMap<String,Integer>();
//Layout
settingResourceMap.put(SCanvasConstants.LAYOUT_PEN_SPINNER,R.layout.mspinner);
//Locale
settingResourceMap.put(SCanvasConstants.LOCALE_PEN_SETTING_TITLE,R.string.pen_settings);
settingResourceMap.put(SCanvasConstants.LOCALE_ERASER_SETTING_TITLE,R.string.eraser_settings);
settingResourceMap.put(SCanvasConstants.LOCALE_ERASER_SETTING_CLEARALL,R.string.clear_all);  
settingResourceMap.put(SCanvasConstants.LOCALE_ERASER_SETTING_CLEARALL_MESSAGE,R.string.confirm_clear_all);

booleanbClearAllVisibileInEraserSetting=true;
RelativeLayoutsettingViewContainer=(RelativeLayout)findViewById(R.id.canvas_container);
mSCanvas.createSettingView(settingViewContainer,settingResourceMap,bClearAllVisibileInEraserSetting);

이렇게 초기화한 SettingView는 createSettingView를 통해 CanvasView와 연결되며, SettingView를 열거나 닫아야 하는 코드에 showSettingView 함수를 넣어주면 CanvasView의 펜 설정을 자유롭게 변경할 수 있는 <그림 5>와 같은 화면을 띄울 수 있다.


<그림 5> SettingView 예

정리하며
이번 시간에는 S펜 SDK 소개와 간단한 사용법에 대해 알아봤다. 다음 시간에는 좀더 자세한 SDK 사용법과 튜토리얼에 나와 있지 않는 메소드들 그리고 SDK 이외의 갤럭시 노트 애플리케이션 개발방법을 살펴보겠다.

+ Recent posts