안드로이드 응용 프로그램...

115
안드로이드 안드로이드 안드로이드 안드로이드 응용 프로그램 개발 응용 프로그램 개발 응용 프로그램 개발 응용 프로그램 개발 2010.5 2010.5 2010.5 2010.5 호서대 호서대 호서대 호서대학교 학교 학교 학교 뉴미디어학과 이호석 교수 뉴미디어학과 이호석 교수 뉴미디어학과 이호석 교수 뉴미디어학과 이호석 교수

Upload: others

Post on 16-Sep-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

안드로이드안드로이드안드로이드안드로이드

응용 프로그램 개발응용 프로그램 개발응용 프로그램 개발응용 프로그램 개발

2010.52010.52010.52010.5

호서대호서대호서대호서대학교학교학교학교

뉴미디어학과 이호석 교수뉴미디어학과 이호석 교수뉴미디어학과 이호석 교수뉴미디어학과 이호석 교수

Page 2: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

알림알림알림알림

세미나 자료의 장부터 장에 있는 안드로이드 관련 내용과 안드로이세미나 자료의 장부터 장에 있는 안드로이드 관련 내용과 안드로이세미나 자료의 장부터 장에 있는 안드로이드 관련 내용과 안드로이세미나 자료의 장부터 장에 있는 안드로이드 관련 내용과 안드로이[1] 1 11[1] 1 11[1] 1 11[1] 1 11

드 소스 코드는 참고 문헌 에서 발췌하여 작성하였다 장과 장드 소스 코드는 참고 문헌 에서 발췌하여 작성하였다 장과 장드 소스 코드는 참고 문헌 에서 발췌하여 작성하였다 장과 장드 소스 코드는 참고 문헌 에서 발췌하여 작성하였다 장과 장(1)(2)(3) . 12 13(1)(2)(3) . 12 13(1)(2)(3) . 12 13(1)(2)(3) . 12 13

의 내용은 을 참고하여 작성하였으며 소스 코드는의 내용은 을 참고하여 작성하였으며 소스 코드는의 내용은 을 참고하여 작성하였으며 소스 코드는의 내용은 을 참고하여 작성하였으며 소스 코드는developer.android.comdeveloper.android.comdeveloper.android.comdeveloper.android.com

에서 발췌하여 작성하였다에서 발췌하여 작성하였다에서 발췌하여 작성하였다에서 발췌하여 작성하였다(2)(3) .(2)(3) .(2)(3) .(2)(3) .

안드로이드에 대한 최신의 내용은 을 참고하기안드로이드에 대한 최신의 내용은 을 참고하기안드로이드에 대한 최신의 내용은 을 참고하기안드로이드에 대한 최신의 내용은 을 참고하기[2] developer.android.com[2] developer.android.com[2] developer.android.com[2] developer.android.com

바란다바란다바란다바란다....

국내의 관련 웹으로는국내의 관련 웹으로는국내의 관련 웹으로는국내의 관련 웹으로는[3] www.androidclub.c[3] www.androidclub.c[3] www.androidclub.c[3] www.androidclub.c 이 있다이 있다이 있다이 있다o.kr .o.kr .o.kr .o.kr .

Page 3: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

목 차목 차목 차목 차

장 안드로이드 소개장 안드로이드 소개장 안드로이드 소개장 안드로이드 소개1 . --------------------------- 11 . --------------------------- 11 . --------------------------- 11 . --------------------------- 1

장 안드로이드 개발 환경과 기본 프로그래밍 방법장 안드로이드 개발 환경과 기본 프로그래밍 방법장 안드로이드 개발 환경과 기본 프로그래밍 방법장 안드로이드 개발 환경과 기본 프로그래밍 방법2 . ----- 52 . ----- 52 . ----- 52 . ----- 5

장 안드로이드 응용 프로그램 개발장 안드로이드 응용 프로그램 개발장 안드로이드 응용 프로그램 개발장 안드로이드 응용 프로그램 개발3 . ---------------- 133 . ---------------- 133 . ---------------- 133 . ---------------- 13

장 기본 위젯 예제 프로그램장 기본 위젯 예제 프로그램장 기본 위젯 예제 프로그램장 기본 위젯 예제 프로그램4 . --------------------- 194 . --------------------- 194 . --------------------- 194 . --------------------- 19

장 레이아웃을 이용한 사용자 인터페이스 설계장 레이아웃을 이용한 사용자 인터페이스 설계장 레이아웃을 이용한 사용자 인터페이스 설계장 레이아웃을 이용한 사용자 인터페이스 설계5 . ------- 245 . ------- 245 . ------- 245 . ------- 24

장 선택기능 위젯장 선택기능 위젯장 선택기능 위젯장 선택기능 위젯6 . ----------------------------- 326 . ----------------------------- 326 . ----------------------------- 326 . ----------------------------- 32

장 리스트 고급 활용장 리스트 고급 활용장 리스트 고급 활용장 리스트 고급 활용7 . --------------------------- 417 . --------------------------- 417 . --------------------------- 417 . --------------------------- 41

장 고급 위젯과 컨테이너장 고급 위젯과 컨테이너장 고급 위젯과 컨테이너장 고급 위젯과 컨테이너8 . ----8 . ----8 . ----8 . ------------------------ 46-------------------- 46-------------------- 46-------------------- 46

장 메뉴장 메뉴장 메뉴장 메뉴9 . ------------------------------------ 549 . ------------------------------------ 549 . ------------------------------------ 549 . ------------------------------------ 54

장장장장10 . WebKit --------------------------------- 5710 . WebKit --------------------------------- 5710 . WebKit --------------------------------- 5710 . WebKit --------------------------------- 57

장 화면 회전장 화면 회전장 화면 회전장 화면 회전11 . ------------------------------- 6011 . ------------------------------- 6011 . ------------------------------- 6011 . ------------------------------- 60

장 그래픽과 애니메이션장 그래픽과 애니메이션장 그래픽과 애니메이션장 그래픽과 애니메이션12 . ----------------------- 6212 . ----------------------- 6212 . ----------------------- 6212 . ----------------------- 62

장 위치 기반 서비스장 위치 기반 서비스장 위치 기반 서비스장 위치 기반 서비스13 . -------------------------- 9613 . -------------------------- 9613 . -------------------------- 9613 . -------------------------- 96

Page 4: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 1 -

장 안드로이드 소개장 안드로이드 소개장 안드로이드 소개장 안드로이드 소개1 .1 .1 .1 .

- OHA(Open Handset Alliance, www.openhandsetalliance.com)- OHA(Open Handset Alliance, www.openhandsetalliance.com)- OHA(Open Handset Alliance, www.openhandsetalliance.com)- OHA(Open Handset Alliance, www.openhandsetalliance.com)핸드폰 개발과 판매에 대한 관련 개발업체들의 연합 년 말 결성. (2007 )칩 제조사 단말기 제조사 소프트웨어 개발사 서비스 공급업체 예를 들어( , , , ,Intel, Qualcomm, Samsung, LG, Google, HTC, NVIDIA, Microsoft, Motorola,등Texas Instrument, China Mobile )비 독점 개방형 표준 플랫폼 공동 개발 안드로이드. ->안드로이드 시스템안드로이드 시스템안드로이드 시스템안드로이드 시스템----안드로이드 시스템 설치. . J2SE, Eclipse, Android SDK, Android DT+DDMS Plug-in, Preference setting안드로이드 라이브러리. 코어 유틸리티 패키지로서 컨테이너 문자열 포맷터 파싱 등 제공. android.util: , , XML메시지 전달 프로세스 통신 시계 기능 디버깅 기능 제공. android.os: , , ,색상 등 기본 그래픽 환경 제공. android.graphics: Canvas, , drawing primitives텍스트 출력과 파싱을 위한 텍스트 처리 도구. android.text: 데이터베이스 커서 기능 제공. android.database:콘텐트 공급자 기능 제공. android.content: 모든 안드로이드 애플리케이션을 위한 클래스를 포함. android.app.Activity: Activity .. android.view.View: 와 함께 가장 핵심적인 클래스 모든 화면 출력은 상속Activity , View윈도우 콤포넌트이다 버튼 리스트 체크박스 등등. android.widget: . , ,지도 기능을 제공한다 위치 기반 서비스 등. com.google.android.maps: . , MapView ,표준 콘텐츠 공급자에 쉽게 접근하는 클래스 제공. android.provider: .전화 전화 상태 메시지 기능을 제공한다. android.telephony: , , SMS .안드로이드 웹 브라우저. android.webkit: 위치 기반 서비스 제공. android.location:멀티미디어 클래스 제공. android.media: 그래픽 제공. android.opengl: OpenGL ES API카메라 가속도 센서 나침반 센서. android.hardware: , ,불루투스 통신 기능 제공. android.bluetooth: 통신 기능 제공. android.net.wifi: WiFi

Page 5: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 2 -

www.openhandsetalliance.com

Page 6: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 3 -

라이브러리. C/C++ 그래픽스 제공. OpenGL ES: OpenGL ES 1.0 API 3D (OpenGL ES v2.0)비트맵 벡터 폰트 렌더링. FreeType: ,그래픽 엔진. SGL: 2D리눅스 기반 임베디드 장치에 최적화된 표준 라이브러리. libc: C관계형 데이터베이스. SQLite: 암호 프로토콜. SSL: Secure Socket Layer안드로이드 소프트웨어 구성. . Activity윈도우 위젯 레이아웃. View: (Widget), (Layout)보안 네트워킹. (SSL)웹브라우저. (WebKit)네트워킹. API데이터베이스. SQLite 차원 그래픽. OpenGL ES 3멀티디어 정지영상. API: , MPEG4, MP3전화걸기 보내기. & SMS API 위치 기반 서비스 지도 서비스. LBS(Location-Based Service, ) API:센서 온도 가속도 등. API: ,통신. API: WiFi, Bluetooth안드로이드 애플리케이션 아키텍처. . Activity: 사용자 기본 윈도우 핸드폰 화면( ).윈도우에 설치되는 모든 구성 요소 위젯 레이아웃. View: UI ( , ).원하는 기능 전화걸기 등. Intent: (action, message, )사용자에게 신호를 보내는 기능 예를 들어 전화가 걸려 왔을 때 불빛을. Notification: ,깜박이거나 진동을 울리거나 아이콘 표시를 하거나 등등, , , .되는 를 처리한다. Broadcast Receiver: Broadcasting Intent .. Content Provider: 응용을 간의 데이터 공유를 위한 인터페이스, SharedPreferences.백그라운드 모드로 항상 동작하는 기본 구성 요소. Service: .현재 안드로이드 버전과 레벨. API버전 레벨 장치. API1.0 1 0.0%1.1 2 0.1%1.5 3 37.2%1.6 4 29.4%2.0 5 0.3%2.01 6 0.6%2.1 7 32.4%

Page 7: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 4 -

안드로이드 개발 환경. . Eclipse: Java IDE 안드로이드 가상 기계 안드로이드. AVD(Android Virtual Device, ): Emulator안드로이드를 실행하는 가상. DDMS(Dalvik Debug Monitoring Service): Dalvik기계를 모니터하고 제어한다. tools/배포 가능한 안드로이드 패키지 파일. AAPT(Android Asset Packaging Tool): (*.apk)생성한다. 실행중인 에뮬레이터에 연결할 수 있다. ADB(Android Debug Bridge): .그 밖의 스마트 폰 개발 환경그 밖의 스마트 폰 개발 환경그 밖의 스마트 폰 개발 환경그 밖의 스마트 폰 개발 환경---- 현황. Mobile OS

현황- Mobile Platform

OS 개발업체 개요 개방성 주요단말기 비고WindowMobile 7 Microsoft 연동PC OS 개방 글로벌 제조사Blackberry RIM 독자RIM OS 폐쇄 RIMSymbian Nokia 노키아 OS 개방 글로벌 제조사iPhone Apple 애플 독자 OS 폐쇄 애플Android Google 오픈 소스 개방 글로벌 제조사Bada Samsung 삼성 독자 OS 폐쇄 삼성MeeGo Nokia+Intel 기반Linux오픈 소스 개방OS Window Mobile Blackberry iPhone Android개발언어 Visual Studio Java Objective C JavaSDK/DEV Visual Studio BB Web PluginBB JDE Plugin XCode Android SDK관리Device 디바이스 잠금,삭제 기능 제공 디바이스 잠금,삭제 관리 기능 디바이스 잠금 보안 관련 기능완전하지 않음장점 광범위한 개발인프라 중앙 집중 관리기업용 특화 시스템 보호개발자 보호 개방성개발자 선호단점 감소하는 점유율 한국에서 인지도낮음 폐쇄성 주요 소스 노출

Page 8: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 5 -

장 안드로이드 개발 환경과 기본 프로그래밍 방법장 안드로이드 개발 환경과 기본 프로그래밍 방법장 안드로이드 개발 환경과 기본 프로그래밍 방법장 안드로이드 개발 환경과 기본 프로그래밍 방법2 .2 .2 .2 .

개발 환경 갖추기개발 환경 갖추기개발 환경 갖추기개발 환경 갖추기---- 에서. Java2 (java.sun.com) download버전 이상 설치. jdk 5 에서. Eclipse (www.eclipse.org download) download버전 이상 설치 가능. GALILEO (Europa, Ganymede ). Android SDK. http://developer.android.com/sdk 에서 다운로드. download -> android-sdk_r05-windows.zip, SDK 2.1new: 22.3MB압축을 풀고 를 실행하여 를 모두 받으면. SDK Setup.exe Android : 1.27GB에서 다운로드. https://dl-ssl.google.com/android/repository/repository.xml. ADT(Android Development Tool) Plug-in for Eclipse에서 설치. menu -> help -> install new software. Name: Android, Uri: https://dl-ssl.google.com/android/eclipse/년 월. ADT 0.9.6 (2010 3 ). Eclipse Preference setting고급 환경변수에서 에 디렉토리 표시. Window XP, Path Android SDK tools참고 코드 포팅. : Android NDK(Native Development Kit) revision3: C/C++안드로이드 가상 기기안드로이드 가상 기기안드로이드 가상 기기안드로이드 가상 기기- (AVD, Android Virtual Device)- (AVD, Android Virtual Device)- (AVD, Android Virtual Device)- (AVD, Android Virtual Device)를 실행시켜 설정및 작동. Android SDK Setup.exe AVD일반 에서 핸드폰을 실행시키는 안드로이드. PC Emulator

Page 9: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 6 -

안드로이드 응용프로그램 프레임워크안드로이드 응용프로그램 프레임워크안드로이드 응용프로그램 프레임워크안드로이드 응용프로그램 프레임워크----. android.*com.google.android.mapsdalvik.*java.*javax.*junit.*org.apache.http.*org.jsonorg.w3c.domorg.xml.saxorg.xmlpull.*- DDMS- DDMS- DDMS- DDMS. DDMS(Dalvik Debug Monitor Service)안드로이드 에 직접 접근하여 쓰래드 메모리 등을 직접 볼 수 있다. AVD , .안드로이드 예제 프로그램안드로이드 예제 프로그램안드로이드 예제 프로그램안드로이드 예제 프로그램----. API Demo. Bluetooth Chat. Business Card. Contact Manager. Home. Snake. LunarLander. JetBoy. Live Wallpaper. NotePad 등. Wiktionary

Page 10: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 7 -

안드로이드 디렉토리 구조안드로이드 디렉토리 구조안드로이드 디렉토리 구조안드로이드 디렉토리 구조---- 현재 개발한 안드로이드 소스 코드. src: 안드로이드가 자동으로 생성한 소스 코드. gen: R.java라이브러리 에서 제공하는 라이브러리 파일만 있음. Android : Android SDK Java , *.class .안드로이드가 자동으로 생성한 자원 폴더. res: (resource)현재 개발한 안드로이드 응용 프로그램에 대한 모든 정보. AndroidManifest.xml:속성 정보. default.properties:이미지 파일. res/drawable:애니메이션 파일. res/anim: xml파일로서 안드로이드 화면. res/layout: XML layout파일로서 메뉴 정의. res/menu: XML문자열. res/values: 파일. res/xml: XML

Page 11: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 8 -

AndroidManifest.xml

Page 12: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 9 -

안드로이드 자원안드로이드 자원안드로이드 자원안드로이드 자원---- 안드로이드 소스 코드와 에 있는 파일에 의하여 생성된 자원 객체들을. R.java: res/ XML연결시키는 소스코드이며 자동으로 생성된다 를 사용하여 파일이Java . Index XML생성한 자원 객체를 표시한다.. public final class R {public static final class attr {}public static final class color {public static final int pretyTextColor=0x7f055555; <-- index}public static final class dimen {public static final int textPointSize=0x7f060000;}}텍스트 문자열 이미지 아이콘 오디오 동영상 등. , , , ,폴더. res 이미지 파일. res/drawable:애니메이션 파일. res/anim: xml파일로서 안드로이드 화면. res/layout: XML layout파일로서 메뉴 정의. res/menu: XML문자열. res/values: 파일. res/xml: XML코드에서 접근하는 방법- 자원 파일에서 의 문자열 값R.string.hello : string.xml xml hello tagString myString = getResources().getString(R.string.hello);에서 기타 파일을 열어서 수정하고 편집할 수 있음- Eclipse main.xml, string.xml, XML- setContentView(R.layout.main);

Page 13: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 10 -

책 표 기본 안드로이드 자원 디렉토리. 102page 5.1책 표 자원 형식과 저장 위치. 103page 5.2

Page 14: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 11 -

안드로이드 응용 프로그램 골격 구조안드로이드 응용 프로그램 골격 구조안드로이드 응용 프로그램 골격 구조안드로이드 응용 프로그램 골격 구조----package com.android.Myapplication;import android.app.Activity;import android.os.Bundle;import android.view.View;public class MyActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);} // Activity@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);} // savedInstanceState UI@Overridepublic void onRestart( ) {super.onRestart( );} // Activity@Overrideprotected void onStart( ) {super.onStart( );} // Activity .@Overridepublic void onResume( ) {super.onResume( );} // Activity .@Overrideprotected void onSaveInstanceState(Bundle savedInstanceState) {super.onSaveInstanceState(savedInstanceState);} // UI savedInstanceState . ActivitysavedInstanceState Bundle onCreate .@Overridepublic void onPause( ) {super.onPause( );} // Activity . Activity .@Overrideprotected void onStop( ) {super.onStop( );} // Activity . Activity .@Overridepublic void onDestroy( ) {super.onDestroy( );} // Activity .}

Page 15: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 12 -

안드로이드 기본 프로그래밍 방법안드로이드 기본 프로그래밍 방법안드로이드 기본 프로그래밍 방법안드로이드 기본 프로그래밍 방법----화면 구성은 파일로 정의 은 로 정의. XML (GUI widget Resource XML )실제 기능은 소스 코드로 프로그램 콘트롤은 소스 코드에서 정의. (GUI Android )응용 프로그램은 세 부분으로 분리되어 구성된다. Android .소스 코드. Android파일 시스템이 자동 생성. R,java (Android build )파일에는 파일에 의하여 생성된 객체에 대한. R.java Resource XML GUI가 저장되어 있다identifier .파일 시스템이 자동 생성. Resource XML (Android build )일반 프로그램에서는 소스 코드 안에 선언과. Java GUI Java GUI component콘트롤 기능을 함께 코딩한다GUI .. 프로그램에서는 선언과 콘트롤 기능을 분리하여 따로 코딩한다Android GUI GUI widget .콘트롤 기능은 프로그램에서 코딩한다. GUI widget Android Java .은 파일에 정의한다. GUI widget XML .이 두 부분의 연결을 파일이 담당한다. R.java .콘트롤 프로그램을 고치지 않고 파일만 수정하여. GUI Android , GUI widget XML다른 출력을 낼 수 있다GUI .혹은 파일에 내용을 추가하여 새로운 프로그램을. GUI widget XML (add, +) Android GUI쉽게 개발할 수 있다 파일은 안드로이드 시스템이 자동으로 수정한다. R,java build .예. : android:id="@+id/button"화면 출력은 한 줄이다. Activity setContentView(R.layout.main) .예 에서 콘트롤과 선언 부분 분리. (GUI )마이크로소프트의. XAML(Extensible Application Markup Language)의. Adobe Flex의. Mozilla XUL(XML User-interface Language)

Page 16: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 13 -

장 안드로이드 응용 프로그램 개발장 안드로이드 응용 프로그램 개발장 안드로이드 응용 프로그램 개발장 안드로이드 응용 프로그램 개발3 .3 .3 .3 .

예제 게임 프로그램 실행예제 게임 프로그램 실행예제 게임 프로그램 실행예제 게임 프로그램 실행- Snake- Snake- Snake- Snake메뉴 선택1. : File -> New -> Project선택2. Android -> Android Project 버튼 선택3. Contents to Create project from existing source폴더 검색4. Samples주의 버전과 프로그램 버전이 동일하여야 한다( : AVD API Sample API .)폴더 선택5. Snake 버튼을 누른다6. Finish .안드로이드 가상 장치 생성안드로이드 가상 장치 생성안드로이드 가상 장치 생성안드로이드 가상 장치 생성- (AVD, Android Virtual Device)- (AVD, Android Virtual Device)- (AVD, Android Virtual Device)- (AVD, Android Virtual Device)안드로이드 에서 실행1. SDK주의 버전과 프로그램 버전이 동일하여야 한다( : AVD API Sample API .)

실행실행실행실행- Snake- Snake- Snake- Snake 폴더에서 마우스 오른쪽 버튼 클릭 클릭1a. Snake -> Run주의 에 따라서 시간이 조금 많이 걸린다 인내심을 가지고 기다려야 한다( : AVD . .)버전 인 경우는 대략 초 정도 버전 인 경우는 거의 분 정도(AVD 1.5 30 , 2.1 1 )메뉴 선택1b. : Run -> Run Configuration더블 클릭2b. Android Application상자에 입력3b. Name SnakeRunConfiguration아이콘 클릭4b. Run As 선택5b. SnakeRunConfiguration주의 에 따라서 시간이 조금 많이 걸린다 인내심을 가지고 기다려야 한다( : AVD . .)버전 인 경우는 대략 초 정도 버전 인 경우는 거의 분 정도(AVD 1.5 30 , 2.1 1 )

Page 17: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 14 -

안드로이드 프로그램 개발안드로이드 프로그램 개발안드로이드 프로그램 개발안드로이드 프로그램 개발---- 메뉴 선택1. : File -> New -> Project선택2. Android -> Android Project 버튼 선택3. Contents create new project in workspace ,선택Use default location선택4. Build Target :생성시킨 버전과 안드로이드 프로그램 개발 버전 일치AVD Platform .입력4. Project name : ***입력Application name : ***입력 예를 들어Package name : com.example.android.***입력 개발하고자 하는 안드로이드 이름Create Activity : Activity설정 교재에는Min SDK Version : 3.

Page 18: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 15 -

교재 표 참조58page 3.1

Page 19: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 16 -

생성된 폴더 구조생성된 폴더 구조생성된 폴더 구조생성된 폴더 구조----AndroidManifest.xml폴더 개발 중인 안드로이드 자바 소스 코드 폴더src :폴더 자동으로 생성된 폴더로서 파일이 저장gen : R.java폴더 자원 폴더res : .참고 안드로이드에서는 소스코드와 자원은 분리되어 따로 저장됨 자원은 파일 형태로: . xml저장됨 생성 이름은 사용자 편의대로 하면 됨5. AVD (AVD .)개발한 안드로이드 프로젝트에 마우스를 위치시킨다6. .마우스 오른쪽 버튼을 클릭한다7. .메뉴가 나오면 실행을 클릭한다8. .기다린다 초 분 정도9. . (30 ~1 )에 안드로이드 프로그램이 실행된다10. AVD .

Page 20: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 17 -

예제 프로그램예제 프로그램예제 프로그램예제 프로그램----package com.example.android.Now;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import java.util.Date;public class Now extends Activity implements View.OnClickListener {Button btn;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);btn = new Button(this);btn.setOnClickListener(this);updateTime();setContentView(btn);}public void onClick(View view) {updateTime();}private void updateTime() {btn.setText(new Date().toString());}}

Page 21: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 18 -

package com.example.android.Now1;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import java.util.Date;public class Now1 extends Activity implements View.OnClickListener {Button btn;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);btn=(Button)findViewById(R.id.button);btn.setOnClickListener(this);updateTime();}public void onClick(View view) {updateTime();}private void updateTime() {btn.setText(new Date().toString());}}<?xml version="1.0" encoding="utf-8"?><Button xmlns:android = "http://schemas.android.com/apk/res/android"android:id="@+id/button"android:text=""android:layout_width="fill_parent"android:layout_height="wrap_content"/>

Page 22: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 19 -

장 기본 위젯 예제 프로그램장 기본 위젯 예제 프로그램장 기본 위젯 예제 프로그램장 기본 위젯 예제 프로그램4 .4 .4 .4 .

안드로이드 뷰 위젯 레이아웃안드로이드 뷰 위젯 레이아웃안드로이드 뷰 위젯 레이아웃안드로이드 뷰 위젯 레이아웃- (view), (widget), (layout)- (view), (widget), (layout)- (view), (widget), (layout)- (view), (widget), (layout)화면 출력 클라스. : android.view.View, android.view.ViewGroup안드로이드 위젯. : android.widget안드로이드 레이아웃. : android.widget.LinearLayout- TextView- TextView- TextView- TextView. android.wdiget.TextView<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id=@+id/TextView01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Some sample text here" /><TextViewandroid:id=@+id/TextView02"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/sample_text" /><TextViewandroid:id=@+id/TextView03"android:layout_width="wrap_content"android:layout_height="wrap_content" 높이는 줄 분량android:lines="2" // 2너비는android:ems="12" // 12emandroid:text="@string/autolink_test" />

Page 23: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 20 -

- EditText- EditText- EditText- EditText<?xml version="1.0" encoding="utf-8"?><EditText xmlns:android="http://schemas.android.com/apk/res/android"android:id=@+id/EditText01"android:layout_height="wrap_content"android:layout_width="fill_parent"android:hint="type here"android:lines="4" />- Image- Image- Image- Image<?xml version="1.0" encoding="utf-8"?><ImageView xmlns:android="http://schemas.android.com/apk/res/android"android:id=@+id/icon"android:layout_height="fill_content"android:layout_width="fill_parent"android;adjustViewBounds="true" 현재 에 있는 파일 설정android:src="drawable/molecule" <-- drawable image/>- Button- Button- Button- Button<Buttonandroid:id=@+id/button"android:layout_height="wrap_content"android:layout_width="wrap_content"android:text="Basic Button" />

Page 24: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 21 -

입력 필드입력 필드입력 필드입력 필드- FieldDemo( )- FieldDemo( )- FieldDemo( )- FieldDemo( )package com.android.example.Fielddemo;import android.app.Activity;import android.os.Bundle;import android.widget.EditText;public class FieldDemo extends Activity {@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main) {EditText fld = (EditText)findViewById(R.id.field);fld.setText("Licensed under the Apache License, version 2.0" +"You may not use this file " +"except in compliance with the License ");}}<?xml version="1.0" encoding="utf-8"?><EditText xmlns:android="http://schemas.android.com/apk/res/android"android:id=@+id/field"android:layout_height="fill_parent"android:layout_width="fill_parent"android:singleLinet="false"/>

Page 25: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 22 -

- CheckBox- CheckBox- CheckBox- CheckBoxpackage com.commonsware.android.basic;import android.app.Activity;import android.os.Bundle;import android.widget.CheckBox;import android.widget.CompoundButton;public class CheckBoxDemo extends Activityimplements CompoundButton.OnCheckedChangeListener {CheckBox cb;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);cb=(CheckBox)findViewById(R.id.check);cb.setOnCheckedChangeListener(this);}public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {if (isChecked) {체크 상태cb.setText( " " );}else { 체크되지 않은 상태cb.setText( " " );}}}<?xml version="1.0" encoding="utf-8"?><CheckBox xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/check"android:layout_width="wrap_content"android:layout_height="wrap_content"체크되지 않은 상태android:text=" "/>

Page 26: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 23 -

- RadioButton- RadioButton- RadioButton- RadioButtonpackage com.commonsware.android.basic;import android.app.Activity;import android.os.Bundle;public class RadioButtonDemo extends Activity {@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);}}<?xml version="1.0" encoding="utf-8" ?><RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><RadioButton android:id="@+id/radio1"android:layout_width="wrap_content"android:layout_height="wrap_content"가위android:text=" " /><RadioButton android:id="@+id/radio2"android:layout_width="wrap_content"android:layout_height="wrap_content"바위android:text=" " /><RadioButton android:id="@+id/radio3"android:layout_width="wrap_content"android:layout_height="wrap_content"보android:text=" " /></RadioGroup>

Page 27: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 24 -

장 레이아웃을 이용한 사용자 인터페이스 설계장 레이아웃을 이용한 사용자 인터페이스 설계장 레이아웃을 이용한 사용자 인터페이스 설계장 레이아웃을 이용한 사용자 인터페이스 설계5 .5 .5 .5 .

코드에서 레이아웃 만들기코드에서 레이아웃 만들기코드에서 레이아웃 만들기코드에서 레이아웃 만들기- (LinearLayout)- (LinearLayout)- (LinearLayout)- (LinearLayout)import android.app.Activity;import android.os.Bundle;public class LinearLayout extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView text1 = new TextView(this);안녕text1.setText(" !“);TextView text2 = new TextView(this);나는 둘째 줄바꿈이 필요함text2.setText(" . .“);text2.setTextSize((float) 60);LinearLayout ll = new LinearLayout(this);ll.setOrientation(LinearLayout.VERTICAL);ll.addView(text1);ll.addView(text2);setContentView(ll);}}

Page 28: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 25 -

로 레이아웃 만들기로 레이아웃 만들기로 레이아웃 만들기로 레이아웃 만들기- XML (LinearLayout)- XML (LinearLayout)- XML (LinearLayout)- XML (LinearLayout)<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/TextView1"android:layout_width="fill_parent"android:layout_height="wrap_content"안녕android:text=" !“/><TextViewandroid:id="@+id/TextView2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="60px"나는 둘째 줄 바꿈이 필요함android:text=" , .“/></LinearLayout>

Page 29: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 26 -

예제예제예제예제- LinearLayout- LinearLayout- LinearLayout- LinearLayoutpackage com.commonsware.android.containers;import android.app.Activity;import android.os.Bundle;import android.view.Gravity;import android.text.TextWatcher;import android.widget.LinearLayout;import android.widget.RadioGroup;import android.widget.EditText;public class LinearLayoutDemo extends Activityimplements RadioGroup.OnCheckedChangeListener {RadioGroup orientation;RadioGroup gravity;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);orientation=(RadioGroup)findViewById(R.id.orientation);orientation.setOnCheckedChangeListener(this);gravity=(RadioGroup)findViewById(R.id.gravity);gravity.setOnCheckedChangeListener(this);}public void onCheckedChanged(RadioGroup group, int checkedId) {if (group==orientation) {if (checkedId==R.id.horizontal) {orientation.setOrientation(LinearLayout.HORIZONTAL);}else {orientation.setOrientation(LinearLayout.VERTICAL);}}else if (group==gravity) {if (checkedId==R.id.left) {gravity.setGravity(Gravity.LEFT);

Page 30: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 27 -

}else if (checkedId==R.id.center) {gravity.setGravity(Gravity.CENTER_HORIZONTAL);}else if (checkedId==R.id.right) {gravity.setGravity(Gravity.RIGHT);}}}}<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><RadioGroupandroid:id="@+id/orientation"android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5px"> 가로<RadioButton android:id="@+id/horizontal" android:text=" " />세로<RadioButton android:id="@+id/vertical" android:text=" " /></RadioGroup><RadioGroupandroid:id="@+id/gravity"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="wrap_content" android:padding="5px">왼쪽<RadioButton android:id="@+id/left" android:text=" " />가운데<RadioButton android:id="@+id/center" android:text=" " />오른쪽<RadioButton android:id="@+id/right" android:text=" " /></RadioGroup></LinearLayout>

Page 31: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 28 -

- RelativeLayout- RelativeLayout- RelativeLayout- RelativeLayout<?xml version="1.0" encoding="utf-8" ?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:padding="5px"><TextViewandroid:id="@+id/label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="URL:"android:paddingTop="15px" /><EditTextandroid:id="@+id/entry"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_toRightOf="@id/label"android:layout_alignBaseline="@id/label" /><Buttonandroid:id="@+id/ok"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/entry"android:layout_alignRight="@id/entry"확인android:text=" " /><Buttonandroid:id="@+id/cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toLeftOf="@id/ok"android:layout_alignTop="@id/ok"취소android:text=" " /></RelativeLayout>

Page 32: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 29 -

- TableLayout- TableLayout- TableLayout- TableLayoutpackage com.commonsware.android.containers;import android.app.Activity;import android.os.Bundle;public class TableLayoutDemo extends Activity {@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);}}<?xml version="1.0" encoding="utf-8" ?><TableLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:stretchColumns="1"><TableRow><TextView android:text="URL:" /><EditText android:id="@+id/entry" android:layout_span="3" /></TableRow><View android:layout_height="2px" android:background="#0000FF" /><TableRow><Buttonandroid:id="@+id/cancel"android:layout_column="2"취소android:text=" " /><Buttonandroid:id="@+id/ok"확인android:text=" " /></TableRow></TableLayout>

Page 33: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 30 -

- Scroll- Scroll- Scroll- Scroll<?xml version="1.0" encoding="utf-8" ?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"><TableLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:stretchColumns="0"><TableRow><View android:layout_height="80px" android:background="#000000" /><TextView android:text="#000000" android:paddingLeft="4px"android:layout_gravity="center_vertical" /></TableRow><TableRow><View android:layout_height="80px" android:background="#440000" /><TextView android:text="#440000" android:paddingLeft="4px"android:layout_gravity="center_vertical" /></TableRow><TableRow><View android:layout_height="80px" android:background="#884400" /><TextView android:text="#884400" android:paddingLeft="4px"android:layout_gravity="center_vertical" /></TableRow><TableRow><View android:layout_height="80px" android:background="#aa8844" /><TextView android:text="#aa8844" android:paddingLeft="4px"android:layout_gravity="center_vertical" /></TableRow><TableRow><View android:layout_height="80px" android:background="#ffaa88" /><TextView android:text="#ffaa88" android:paddingLeft="4px"android:layout_gravity="center_vertical" /></TableRow><TableRow><View android:layout_height="80px" android:background="#ffffaa" /><TextView android:text="#ffffaa" android:paddingLeft="4px"android:layout_gravity="center_vertical" /></TableRow><TableRow><View android:layout_height="80px" android:background="#ffffff" /><TextView android:text="#ffffff" android:paddingLeft="4px"android:layout_gravity="center_vertical" /></TableRow></TableLayout></ScrollView>

Page 34: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 31 -

package com.commonsware.android.containers;import android.app.Activity;import android.os.Bundle;public class ScrollViewDemo extends Activity {@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);}}

Page 35: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 32 -

장 선택 기능 위젯장 선택 기능 위젯장 선택 기능 위젯장 선택 기능 위젯6 .6 .6 .6 .

사용하기사용하기사용하기사용하기- ArrayAdapter- ArrayAdapter- ArrayAdapter- ArrayAdapterString[] items={"this", "is", "a", "really", "silly", "list"};ArrayAdapter<String> (this, android.R.layout.simple_list_item_1, items);기능 문자열을 안드로이드 위젯에 매핑시키는 기능- :예제예제예제예제- ListView- ListView- ListView- ListViewpackage com.commonsware.android.selection;import android.app.Activity;import android.os.Bundle;import android.app.ListActivity;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;public class ListViewDemo extends ListActivity {TextView selection;String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer","adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu","aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante","porttitor", "sodales", "pellentesque", "augue", "purus"};@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, items));selection=(TextView)findViewById(R.id.selection);}

Page 36: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 33 -

public void onListItemClick(ListView parent, View v, int position, long id) {selection.setText(items[position]);}}<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/selection"android:layout_width="fill_parent"android:layout_height="wrap_content" /><ListViewandroid:id="@android:id/list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:drawSelectorOnTop="false" /></LinearLayout>

Page 37: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 34 -

- Spin Control- Spin Control- Spin Control- Spin Controlpublic class SpinnerDemo extends Activity implements AdpaterView.OnItemSelectedListener {TextView selection;String[ ] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer","adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu","aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante","porttitor", "sodales", "pellentesque", "augue", "purus"};@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);selection=(TextView)findViewById(R.id.selection);Spinner spin=(Spinner)findViewById(R.id.spinner);spin.setOnItemSelectedListener(this);ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items);aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown, items);spin.setAdapter(aa);}public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {selection.setText(item[position]);}public void onNothingSelected(AdapterView<?> parent) {selection.setText(" ");}}

Page 38: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 35 -

<?xml version="1.0" encoding="utf-8"><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/selection"android:layout_width="fill_parent"android:layout_height="wrap_content"/><Spinnerandroid:id="@+id/spinner"android:layout_width="fill_parent"android:layout_height="wrap_content"android:drawSelectorOnTop="true'/></LinearLayout>

Page 39: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 36 -

-Grid-Grid-Grid-Gridpackage com.commonsware.android.selection;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.GridView;import android.widget.TextView;public class GridDemo extends Activityimplements AdapterView.OnItemSelectedListener {TextView selection;String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer","adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet","mollis", "etiam", "vel", "erat", "placerat", "ante","porttitor", "sodales", "pellentesque", "augue", "purus"};@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);selection=(TextView)findViewById(R.id.selection);GridView g=(GridView) findViewById(R.id.grid);g.setAdapter(new FunnyLookingAdapter(this,android.R.layout.simple_list_item_1, items));g.setOnItemSelectedListener(this);}public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {selection.setText(items[position]);}

Page 40: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 37 -

public void onNothingSelected(AdapterView<?> parent) {selection.setText("");}private class FunnyLookingAdapter extends ArrayAdapter {Context ctxt;FunnyLookingAdapter(Context ctxt, int resource, String[] items) {super(ctxt, resource, items);this.ctxt=ctxt;}public View getView(int position, View convertView, ViewGroup parent) {TextView label=(TextView)convertView;if (convertView==null) {convertView=new TextView(ctxt);label=(TextView)convertView;}label.setText(items[position]);return(convertView);}}}

Page 41: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 38 -

<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/selection"android:layout_width="fill_parent"android:layout_height="wrap_content" /><GridViewandroid:id="@+id/grid"android:layout_width="fill_parent"android:layout_height="fill_parent"android:verticalSpacing="35px"android:horizontalSpacing="5px"android:numColumns="auto_fit"android:columnWidth="100px"android:stretchMode="columnWidth"android:gravity="center" /></LinearLayout>

Page 42: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 39 -

자동 입력 타이핑 줄이기자동 입력 타이핑 줄이기자동 입력 타이핑 줄이기자동 입력 타이핑 줄이기- ( )- ( )- ( )- ( )public class AutoCompleteDemo extends Activity implements TextWatcher {TextView selection;AutoCompleteTextView edit;String[ ] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer","adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu","aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante","porttitor", "sodales", "pellentesque", "augue", "purus"};@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);selection=(TextView)findViewById(R.id.selection);edit=(AutoCompleteTextView)findViewById(R.id.edit);edit.addTextChangedListener(this);edit.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_line, items));}public void onTextChanged(CharSequence s, int start, int before, int count) {selection.setText(edit.getText());}public void beforeTextChanged(CharSequence s, int start, int count, int after) {}public void afterTextChanged(Editable s) {}}

Page 43: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 40 -

<?xml version="1.0" encoding="utf-8"><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/selection"android:layout_width="fill_parent"android:layout_height="wrap_content"/><AutoCompleteTextViewandroid:id="@+id/edit"android:layout_width="fill_parent"android:layout_height="wrap_content"android:completionThreshold="3"/></LinearLayout>

Page 44: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 41 -

장 리스트 고급 활용장 리스트 고급 활용장 리스트 고급 활용장 리스트 고급 활용7 .7 .7 .7 .

- Static List- Static List- Static List- Static Listpackage com.commonsware.android.fancylists.two;import android.app.Activity;import android.os.Bundle;import android.app.ListActivity;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;public class StaticDemo extends ListActivity {TextView selection;String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer","adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu","aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante","porttitor", "sodales", "pellentesque", "augue", "purus"};@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);setListAdapter(new ArrayAdapter<String>(this,R.layout.row, R.id.label, items));selection=(TextView)findViewById(R.id.selection);}public void onListItemClick(ListView parent, View v, int position, long id) {selection.setText(items[position]);}}

Page 45: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 42 -

- main.xml<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/selection"android:layout_width="fill_parent"android:layout_height="wrap_content" /><ListViewandroid:id="@android:id/list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:drawSelectorOnTop="false" /></LinearLayout>- row.xml<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/icon"android:layout_width="22px"android:paddingLeft="2px"android:paddingRight="2px"android:paddingTop="2px"android:layout_height="wrap_content"android:src="@drawable/ok" /><TextViewandroid:id="@+id/label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="44sp" /></LinearLayout>

Page 46: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 43 -

- Dynamic List- Dynamic List- Dynamic List- Dynamic Listpackage com.commonsware.android.fancylists.three;import android.app.Activity;import android.os.Bundle;import android.app.ListActivity;import android.view.View;import android.view.ViewGroup;import android.view.LayoutInflater;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class DynamicDemo extends ListActivity {TextView selection;String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer","adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet","mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales","pellentesque", "augue", "purus"};@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);setListAdapter(new IconicAdapter(this));selection=(TextView)findViewById(R.id.selection);}public void onListItemClick(ListView parent, View v, int position, long id) {selection.setText(items[position]);}class IconicAdapter extends ArrayAdapter {Activity context;IconicAdapter(Activity context) {super(context, R.layout.row, items);this.context=context;}

Page 47: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 44 -

public View getView(int position, View convertView, ViewGroup parent) {LayoutInflater inflater=context.getLayoutInflater();View row=inflater.inflate(R.layout.row, null);TextView label=(TextView)row.findViewById(R.id.label);label.setText(items[position]);if (items[position].length()>4) {ImageView icon=(ImageView)row.findViewById(R.id.icon);icon.setImageResource(R.drawable.delete);}return(row);}}}

Page 48: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 45 -

- main.xml<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/selection"android:layout_width="fill_parent"android:layout_height="wrap_content" /><ListViewandroid:id="@android:id/list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:drawSelectorOnTop="false" /></LinearLayout>- row.xml<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/icon"android:layout_width="22px"android:paddingLeft="2px"android:paddingRight="2px"android:paddingTop="2px"android:layout_height="wrap_content"android:src="@drawable/ok" /><TextViewandroid:id="@+id/label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="40sp" /></LinearLayout>

Page 49: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 46 -

장 고급 위젯과 컨테이너장 고급 위젯과 컨테이너장 고급 위젯과 컨테이너장 고급 위젯과 컨테이너8 .8 .8 .8 .

- Chrono- Chrono- Chrono- Chronopackage com.commonsware.android.fancy;import android.app.Activity;import android.os.Bundle;import android.app.DatePickerDialog;import android.app.TimePickerDialog;import android.view.View;import android.widget.Button;import android.widget.DatePicker;import android.widget.TimePicker;import android.widget.TextView;import java.text.DateFormat;import java.util.Calendar;public class ChronoDemo extends Activity {DateFormat fmtDateAndTime=DateFormat.getDateTimeInstance();TextView dateAndTimeLabel;Calendar dateAndTime=Calendar.getInstance();DatePickerDialog.OnDateSetListenerd=new DatePickerDialog.OnDateSetListener() {public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {dateAndTime.set(Calendar.YEAR, year);dateAndTime.set(Calendar.MONTH, monthOfYear);dateAndTime.set(Calendar.DAY_OF_MONTH, dayOfMonth);updateLabel();}};TimePickerDialog.OnTimeSetListenert=new TimePickerDialog.OnTimeSetListener() {public void onTimeSet(TimePicker view, int hourOfDay, int minute) {dateAndTime.set(Calendar.HOUR_OF_DAY, hourOfDay);dateAndTime.set(Calendar.MINUTE, minute);updateLabel();}};

Page 50: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 47 -

@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);Button btn=(Button)findViewById(R.id.dateBtn);btn.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {new DatePickerDialog(ChronoDemo.this, d,dateAndTime.get(Calendar.YEAR),dateAndTime.get(Calendar.MONTH),dateAndTime.get(Calendar.DAY_OF_MONTH)).show();} } );btn=(Button)findViewById(R.id.timeBtn);btn.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {new TimePickerDialog(ChronoDemo.this, t,dateAndTime.get(Calendar.HOUR_OF_DAY),dateAndTime.get(Calendar.MINUTE), true).show();} } );dateAndTimeLabel=(TextView)findViewById(R.id.dateAndTime);updateLabel();}private void updateLabel() {dateAndTimeLabel.setText(fmtDateAndTime.format(dateAndTime.getTime()));}}

Page 51: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 48 -

<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/dateAndTime"android:layout_width="fill_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/dateBtn"android:layout_width="fill_parent"android:layout_height="wrap_content"날짜 선택android:text=" " /><Buttonandroid:id="@+id/timeBtn"android:layout_width="fill_parent"android:layout_height="wrap_content"시간 선택android:text=" " /></LinearLayout>

Page 52: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 49 -

시계시계시계시계----package com.commonsware.android.fancy;import android.app.Activity;import android.os.Bundle;public class ClocksDemo extends Activity {@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);}}<?xml version="1.0" encoding="utf-8" ?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><AnalogClockandroid:id="@+id/analog"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_alignParentTop="true" /><DigitalClockandroid:id="@+id/digital"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_below="@id/analog" /></RelativeLayout>

Page 53: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 50 -

- DatePicker- DatePicker- DatePicker- DatePickerpublic class HelloDatePicker extends Activity {private TextView mDateDisplay;private int mYear;private int mMonth;private int mDay;static final int DATE_DIALOG_ID=0;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mDateDisplay = (TextView) findViewById(R.id.dateDisplay);mPickDate = (Button) findViewById(R.id.pickDate);mPickDate.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {showDialog(DATE_DIALOG_ID);}});final Calendar c = Calender.getInstance();mYear = c.get(Calender.YEAR);mMonth = c.get(Calender.MONTH);mDay = c.get(Calender.DAY_OF_MONTH);updateDisplay();}private void updateDisplay() {mDateDisplay.setText (new StringBuilder().append(mMonth+1).append("-").append(mDay).append("-").append(mYear).append("-"));}

Page 54: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 51 -

@Overrideprotected Dialog onCreateDialog(int id) {switch (id) {case DATE_DIALOG_ID:return new DatePickerDialog(this, mDateSetListener, mYear,mMonth, mDay);}return null;}private DatePickerDialog.OnDateSetListener mDateSetListener mDateSetListener=new DatePickerDialog.OnDateSetListener() {public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {mYear = year;mMonth = monthOfYear;mDay = dayOfMonth;updateDiaplay();}};}

Page 55: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 52 -

- Flipper- Flipper- Flipper- Flipperpackage com.commonsware.android.flipper1;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ViewFlipper;public class FlipperDemo extends Activity {ViewFlipper flipper;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);flipper=(ViewFlipper)findViewById(R.id.details);Button btn=(Button)findViewById(R.id.flip_me);btn.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {flipper.showNext();}});}}

Page 56: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 53 -

<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><Buttonandroid:id="@+id/flip_me"android:layout_width="fill_parent"android:layout_height="wrap_content"페이지 넘김android:text=" " /><ViewFlipperandroid:id="@+id/details"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:textStyle="bold"android:textColor="#FF00FF00"첫번째 페이지android:text=" " /><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:textStyle="bold"android:textColor="#FFFF0000"두번째 페이지android:text=" " /><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:textStyle="bold"android:textColor="#FFFFFF00"세번째 페이지android:text=" " /></ViewFlipper></LinearLayout>

Page 57: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 54 -

장 메뉴장 메뉴장 메뉴장 메뉴9 .9 .9 .9 .

- OptionMenu, ContextMenu- OptionMenu, ContextMenu- OptionMenu, ContextMenu- OptionMenu, ContextMenu

- MenuDemo- MenuDemo- MenuDemo- MenuDemopackage com.commonsware.android.menus;import android.app.Activity;import android.os.Bundle;import android.app.ListActivity;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;public class MenuDemo extends ListActivity {TextView selection;String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer","adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu","aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante","porttitor", "sodales", "pellentesque", "augue", "purus"};public static final int EIGHT_ID = Menu.FIRST+1;public static final int SIXTEEN_ID = Menu.FIRST+2;public static final int TWENTY_FOUR_ID = Menu.FIRST+3;public static final int TWO_ID = Menu.FIRST+4;public static final int THIRTY_TWO_ID = Menu.FIRST+5;public static final int FORTY_ID = Menu.FIRST+6;public static final int ONE_ID = Menu.FIRST+7;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, items));selection=(TextView)findViewById(R.id.selection);registerForContextMenu(getListView());}public void onListItemClick(ListView parent, View v, int position, long id) {selection.setText(items[position]);}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) {populateMenu(menu);}@Override

Page 58: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 55 -

public boolean onCreateOptionsMenu(Menu menu) {populateMenu(menu);return(super.onCreateOptionsMenu(menu));}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {return(applyMenuChoice(item) || super.onOptionsItemSelected(item));}@Overridepublic boolean onContextItemSelected(MenuItem item) {return(applyMenuChoice(item) || super.onContextItemSelected(item));}private void populateMenu(Menu menu) { 픽셀menu.add(Menu.NONE, ONE_ID, Menu.NONE, "1 ");픽셀menu.add(Menu.NONE, TWO_ID, Menu.NONE, "2 ");픽셀menu.add(Menu.NONE, EIGHT_ID, Menu.NONE, "8 ");픽셀menu.add(Menu.NONE, SIXTEEN_ID, Menu.NONE, "16 ");픽셀menu.add(Menu.NONE, TWENTY_FOUR_ID, Menu.NONE, "24 ");픽셀menu.add(Menu.NONE, THIRTY_TWO_ID, Menu.NONE, "32 ");픽셀menu.add(Menu.NONE, FORTY_ID, Menu.NONE, "40 ");}private boolean applyMenuChoice(MenuItem item) {switch (item.getItemId()) {case ONE_ID:getListView().setDividerHeight(1);return(true);case EIGHT_ID:getListView().setDividerHeight(8);return(true);case SIXTEEN_ID:getListView().setDividerHeight(16);return(true);case TWENTY_FOUR_ID:getListView().setDividerHeight(24);return(true);case TWO_ID:getListView().setDividerHeight(2);return(true);case THIRTY_TWO_ID:getListView().setDividerHeight(32);return(true);case FORTY_ID:getListView().setDividerHeight(40);return(true);}return(false);}}

Page 59: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 56 -

<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/selection"android:layout_width="fill_parent"android:layout_height="wrap_content" android:background="#eeeeee" /><ListViewandroid:id="@android:id/list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:drawSelectorOnTop="false" /></LinearLayout

Page 60: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 57 -

장장장장10 . Webkit10 . Webkit10 . Webkit10 . Webkit

- Browser1- Browser1- Browser1- Browser1package com.commonsware.android.webkit;import android.app.Activity;import android.os.Bundle;import android.webkit.WebView;public class BrowserDemo1 extends Activity {WebView browser;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);browser=(WebView)findViewById(R.id.webkit);browser.loadUrl("http://www.daum.co.kr");}}<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><WebViewandroid:id="@+id/webkit"android:layout_width="fill_parent"android:layout_height="fill_parent" /></LinearLayout>

Page 61: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 58 -

- Browser2- Browser2- Browser2- Browser2package com.commonsware.android.webkit;import android.app.Activity;import android.os.Bundle;import android.webkit.WebView;public class BrowserDemo2 extends Activity {WebView browser;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);browser=(WebView)findViewById(R.id.webkit);browser.loadData 안녕하세요("<html><body>Hello, world! !</body></html>","text/html", "UTF-8");}}<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><WebViewandroid:id="@+id/webkit"android:layout_width="fill_parent"android:layout_height="fill_parent" /></LinearLayout>

Page 62: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 59 -

- Browser3- Browser3- Browser3- Browser3package com.commonsware.android.webkit;import android.app.Activity;import android.os.Bundle;import android.webkit.WebView;import android.webkit.WebViewClient;import java.util.Date;public class BrowserDemo3 extends Activity {WebView browser;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);browser=(WebView)findViewById(R.id.webkit);browser.setWebViewClient(new Callback());loadTime();}void loadTime() {String page="<html><body><a href=\"clock\">"+new Date().toString() +"</a></body></html>";browser.loadDataWithBaseURL("x-data://base", page, "text/html", "UTF-8", null);}private class Callback extends WebViewClient {public boolean shouldOverrideUrlLoading(WebView view, String url){ loadTime();return(true);}}}<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><WebViewandroid:id="@+id/webkit"android:layout_width="fill_parent"android:layout_height="fill_parent" /></LinearLayout>

Page 63: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 60 -

장 화면 회전장 화면 회전장 화면 회전장 화면 회전11 . *11 . *11 . *11 . *

- RotationThree- RotationThree- RotationThree- RotationThreepackage com.commonsware.android.rotation.three;import android.app.Activity;import android.content.Intent;import android.content.res.Configuration;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.util.Log;public class RotationThreeDemo extends Activity {static final int PICK_REQUEST=1337;Button viewButton=null;Uri contact=null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setupViews();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode==PICK_REQUEST) {if (resultCode==RESULT_OK) {contact=data.getData();viewButton.setEnabled(true);}}}public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);setupViews();}private void setupViews() {setContentView(R.layout.main);Button btn=(Button)findViewById(R.id.pick);btn.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {Intent i=new Intent(Intent.ACTION_PICK,Uri.parse("content://contacts/people"));startActivityForResult(i, PICK_REQUEST);}});

Page 64: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 61 -

viewButton=(Button)findViewById(R.id.view);viewButton.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {startActivity(new Intent(Intent.ACTION_VIEW, contact));}});viewButton.setEnabled(contact!=null);}}main.xml<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><Buttonandroid:id="@+id/pick"android:layout_width="fill_parent"android:layout_height="fill_parent" 선택android:layout_weight="1" android:text=" "android:enabled="true" /><Buttonandroid:id="@+id/view"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"보기android:text=" "android:enabled="false" /></LinearLayout>

Page 65: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 62 -

장 그래픽스와 애니메이션장 그래픽스와 애니메이션장 그래픽스와 애니메이션장 그래픽스와 애니메이션12 .12 .12 .12 .

소 개소 개소 개소 개12.012.012.012.0. View class, Canvas class, Paint class화면에 원가를 그리려면화면에 원가를 그리려면화면에 원가를 그리려면화면에 원가를 그리려면---- 화폭. Canvas:물감 색상 안티엘리어싱 스타일 그래디언트. Paint: ( , , , )import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;private static class ViewWithRedDot extends View {public ViewWithRedDot(Context context) {super(context):}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.BLACK);Paint circlePaint = new Paint( );circlePaint.setColor(Color.RED);canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2,canvas.getWidth()/3, circlePaint);}}public class WithRedDot extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new ViewWithRedDot(this));}}

Page 66: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 63 -

차원 그래픽스차원 그래픽스차원 그래픽스차원 그래픽스12.1 2 (developer.android.com)12.1 2 (developer.android.com)12.1 2 (developer.android.com)12.1 2 (developer.android.com)안드로이드는 커스텀 안드로이드 라이브러리를 통한 차원 그래픽스와(custom) 2 OpenGL을 통한 차원 그래픽스를 제공한다 차원 그래픽스ES v1.0 3 . 2 API(Application는 드로어블 패키지에서 제공되고 는Programming Interface) (Drawable) , OpenGL API패키지와 유틸리티에서 제공된다 는 여기서 논의하지 않OpenGL ES OpenGL . OpenGL ES는다 전문 서적을 참고하기 바란다. OpenGL ES .차원 그래픽스와 차원 그래픽스는 다른 부분이 많기 때문에 그래픽스 응용을 개발할2 3 ,때는 응용의 요구사항이 무엇인지를 분명히 파악하는 것이 중요하다 왜냐하면 간단하고 고.정적인 그래픽스 응용은 차원 그래픽스를 사용하여 충분히 구현할 수 있기 때문이다2 .안드로이드에서 차원 그래픽스를 구현하는 방법에는 다음 두 가지 방법이 있다2 .그래픽스를 구현하는 두 가지 방법그래픽스를 구현하는 두 가지 방법그래픽스를 구현하는 두 가지 방법그래픽스를 구현하는 두 가지 방법위에 객체를 사용하여 그래픽스와 애니메이션을 구현하는 방법이 있다(1) Layout View .이 방법에서는 그림과 애니메이션은 안드로이드 시스템 계층의 드로잉 과정View (drawing)을 통하여 이루어진다 개발자는 단순히 를 상속받아 개발을 수행하면 된다 이 방법은. View .변화가 많지 않은 간단한 그래픽스 혹은 높은 성능이 필요하지 않는 간단한 게임의 경우에적합하다 즉 예를 들어 이미지 도형 칼라 혹은 간단한 애니메이션을 하는 경우에는. , , , , , ,을 사용하여 에 그림을 그리거나 혹은 에 그림을 그린다Layout View ImageView .객체 위에 직접 그래픽스를 그리는 방법이 있다 이 방법을 사용하면 적절한(2) Canvas .클래스의 메소드를 호출하여 그림을 그린다 예를 들어 의draw() . , Canvas drawPicture()메소드를 호출하여 그림을 그릴 수 있다 이 방법은 비디오 게임과 같이 위에 규칙. Canvas적으로 그림을 다시 그려야 하는 경우에 적합하다 이 방법의 구현에는 두 가지 방법이 있.다 에 대해서는 절에서 좀 더 자세히 다룬다. Canvas 9.1.2 .(2.1) 사용자 인터페이스 와 동일한 쓰래드에서 위에 커스텀 컴포넌트를(UI) , Layout View생성하고 를 호출하고 콜백 함수를 사용하여 처리, invalidate() onDraw() (callback)하는 방법이 있다.(2.2) 사용자 인터페이스와 다른 쓰래드에서 를 사용하여 쓰래드가 허용하는, SurfaceView가장 빠른 속도로 에 그림을 그리는 방법이 있다 에 대해서는Canvas . SurfaceView절에서 좀 더 자세히 설명한다9.1.5 .지금부터는 그래픽스와 관련된 안드로이드 클래스들을 하나씩 설명한다 좀 더 상세한 자료.들은 에서 찾을 수 있다developer.android.com .

Page 67: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 64 -

12.1.1 Drawable12.1.1 Drawable12.1.1 Drawable12.1.1 Drawable차원 그래픽스 라이브러리는 과 패2 android.graphics.drawable android.view.animation키지에서 찾을 수 있다 이 절에서는 객체를 사용한 간단한 그래픽스. Drawable , Drawable객체의 서브클래스 그리고 프레임 애니메이션과 트윈 애니메이션 이동 확장 회전 을 소개, ( , , )한다. 은 안드로이드에서 제공하는 그림 그리기에 대한 최상위 객체이다Drawable . Drawable클래스는 AnimationDrawable, BitmapDrawable, ClipDrawable, ColorDrawable,등등의 서브 클래스를 제공한다 개발ShapeDrawable, PictureDrawable, LayerDrawable .자는 자신이 개발하고자 하는 응용을 위하여 이 클래스들을 다시 확장하여 사용할 수 있다.을 정의하고 활용하는 데에는 가지 방법이 있다 즉 개발자는 개발하고자 하는Drawable 3 . ,프로젝트 자원에 저장된 이미지 의 속성을 규정한 파일 혹은 클래스의 생, Drawable XML ,성자를 이용하여 을 정의하여 활용할 수 있다 생성자를 이용한 방법은 이미 알고Drawable .있는 방법이기 때문에 앞의 두 가지 경우만을 설명한다.이미지로부터 생성이미지로부터 생성이미지로부터 생성이미지로부터 생성12.1.1.112.1.1.112.1.1.112.1.1.1개발하는 응용에 그래픽스 이미지를 더하는 간단한 방법은 프로젝트의 자원 폴더인에 이미지를 저장하는 것이다 저장 가능한 이미지 파일 형태는 가장res/drawable/ . *.PNG(적합 사용 가능 사용 가능 사용가능 비적합 등이다 이 기법은 아), *.JPG( ), *.BMP( ), *.GIF( , ) .이콘 로고 혹은 게임에서 사용하는 간단한 그래픽 이미지에 적합하다 폴더에 저장된 이미, , .지는 안드로이드 소스 코드나 파일에서 참조할 수 있다 참조할 때는 확장자XML . PNG,를 제외하고 파일 이름을 직접 사용하면 된다JPG, BMP, GIF .예제 소스 코드예제 소스 코드예제 소스 코드예제 소스 코드다음은 폴더에 저장된 영상을 사용하여 를 생성하고 에 더하는 코드이ImageView Layout다.LinearLayout mLinearLayout;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mLinearLayout = new LinearLayout(this);ImageView im = new ImageView(this);im.setImageResource(R.drawable.my_image);im.setAdjustViewBounds(true);im.setLayoutParams(new Gallery.LayoutParams.WRAP_CONTENT);mLinearLayout.addView(im);setContentView(mLinearLayout);}

Page 68: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 65 -

그 밖의 경우에서는 이미지 자원을 객체로 사용할 수 있다 다음은 코드이다, Drawable . .Resources res = mContext.getResource();Drawable myImage = res.getDrawble(R.drawable.my_image);파일로부터 생성파일로부터 생성파일로부터 생성파일로부터 생성12.1.1.2 XML12.1.1.2 XML12.1.1.2 XML12.1.1.2 XML객체를 파일에 정의할 수 있다 비록 객체의 속성이 프로그램Drawable XML . Drawable수행 중에 변경되더라도 객체를 파일에 정의할 수 있다 객체를Drawable XML . Drawable정의한 파일은 폴더에 저장한다 다음은 간단히 자원을XML res/drawable/ . Drawable파일의 에 저장하는 방법이다XML ImageView .예제 소스 코드예제 소스 코드예제 소스 코드예제 소스 코드XMLXMLXMLXML<ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:tint="#55ff0000"android:src="@drawable/my_image"/>안드로이드 소스 코드에서는 메소드를 호출하여 객체를 출력한Resources.getDrawable()다 메소드를 지원하는 서브클래스는 도 정의될 수 있으며 프로그. Inflate() Drawable XML램에서 사용될 수 있다.다음은 객체를 사용한 간단한 예이다 은TansitionDrawable . TransitionDrawable을 확장한 것으로서 첫 번째와 두 번째 층 사이에서 이미지가 서서히 사라LayerDrawable지는 현상을 구현할 때 사용한다.예제 소스 코드예제 소스 코드예제 소스 코드예제 소스 코드<transition xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="drawable/expand_collapse"></transition>폴더 에 저장된 이 파일을 사용하여 다음 안드res/drawable/expand_collapse.xml XML ,로이드 코드는 을 에 나타낸다TransitionDrawable ImageView .Resources res = mContext.getResources();TransitionDrawable transition = (TransitionDrawable) res.getDrawable(R.drawable.expand_collapse);ImageView image = (ImageView) findViewById(R,id.toggle_image);image.setImageDrawable(transition);다음 코드를 수행하면 이 이 초 동안 수행된다transition 1 .

Page 69: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 66 -

transition.startTransition(1000);다음은 클래스의 내용이다Drawable .인터페이스인터페이스인터페이스인터페이스----클래스클래스클래스클래스----

- Enums- Enums- Enums- Enums12.1.2 Canvas12.1.2 Canvas12.1.2 Canvas12.1.2 Canvas그림을 그리거나 애니메이션을 하고자 할 때 객체를 사용하는 방법도 있다, Canvas .는 그림이 그려지는 실제 표면처럼 작동하여 그림을 그린다 객체는 개발자Canvas . Canvas의 모든 명령을 수행한다 에 그림을 그릴 때에는 가지 요소가 필요하다“draw" . Canvas 4 .하나는 그림의 픽셀을 저장할 이고 두 번째는 호출을 실행할 자체이Bitmap , draw Canvas고 세 번째는 등의 기본 그림 요소 이고 마, Rect, Path, Text, Bitmap (drawing primitive) ,지막으로는 색과 스타일을 지정하는 객체이다 즉 를 통하여 그리는 그림은Paint . , Canvas

Animatable 애니메이션을 위하여 필요한 인터페이스Drawable Callback 애니메이션을 위한 DrawableAnimationDrawable 애니메이션을 위한 객체FrameBitmapDrawable 을 객체화하여 기울기 확장 배치Bitmap , ,ClipDrawable 을 클립하는 객체DrawableColorDrawable 지정된 색깔로 를 채우는Canvas DrawableDrawable 그림을 그리는 대표적인 객체Drawable.ConstantStateDrawableContainerDrawableContanier.DrawableContainerStateGradientDrawable 객체Color gradient drawableInsetDrawable 다른 을 삽입하는 객체DrawableLayerDrawable 다른 배열을 관리하는Drawable DrawableLevelListDrawable 다른 을 관리하는 자원DrawableNinePatchDrawable 확장 가능한 BitmapPaintDrawable 로 그림을 그리는Paint DrawablePictureDrawable 를 객체로 만드는Picture DrawableRotateDrawable 다른 을 회전시키는Drawable DrawableScaleDrawable 다른 을 확장시키는Drawable DrawableShapeDrawable 기본 를 그리는 객체Shape DrawableShapeDrawable.ShaderFactory 객체를 정의하는 기본 클래스FactoryStateListDrawable 여러 개의 이미지를 에 부여DrawableTransitionDrawable 의 확장LayerDrawableGradientDrawable.Orientation 의 방향을 조정Gradient

Page 70: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 67 -

실제로는 하위 객체 위에서 실행되며 은 윈도우 위에 구성된다Bitmap Bitmap .콜백 메소드를 이용하여 그림을 그릴 때에 개발자는 단지 에 자신의onDraw() , Canvas그림을 그리는 코드를 위치시키면 된다 다음은 간단한 예제 코드이다 이 코드는. . Bitmap객체 를 선언하고 이 객체를 에 설정하는 방법을 제시한다b Canvas c .Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);Canvas c = new Canvas(b);는 정의된 에 그림을 그린다 그림을 에 그린 후에는 을 다른Canvas Bitmap . Canvas Bitmap로 방식을 사용하여 옮길 수도 있다 그림을 그릴Canvas Canvas.drawBitmap(Bitmap,...) .때에는 혹은 방식을 사용하는 것이 좋다View.onDraw() SurfaceHolder.lockCanvas() .클래스는 등의 자체 드로잉 메소드Canvas drawBitmap(....), drawRect(...), drawText(...)도 가지고 있다 다음은 클래스의 메소드들이다. Canvas .내포 클래스내포 클래스내포 클래스내포 클래스----상수상수상수상수----

- Public constructor- Public constructor- Public constructor- Public constructor- Public Method- Public Method- Public Method- Public Method다음은 의 클래스의 메소드들이다 클래스가 가지고 있는 메소드는 매우Canvas . Canvas많으며 그 중에서 일부만 제시한다.void drawBitmap(int[] colors, int offset, int stride, float x, float y, int width,int height, boolean hasAlpha, Paint paint)void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)

enum Canvas.EdgeTypeenum Canvas.VertexModeint ALL_SAVE_FLAG 모든 파일 저장int CLIP_SAVE_FLAG 현재 클립 저장int CLIP_TO_LAYER_SAVE_FLAG 레이어 바운드 클립int FULL_COLOR_LAYER_SAVE_FLAGint HAS_ALPHA_LAYER_SAVE_FLAGint MATRIX_SAVE_FLAG 현재 매트릭스 저장Canvas() 빈 래스터 를 생성canvasCanvas(Bitmap bitmap) 지정된 을 사용하여 생성bitmap canvasCanvas(GL gl) 지정된 를 사용하여 생성gl context canvas

Page 71: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 68 -

void drawBitmap(Bitmap bitmap, float left, float top, Paint paint)void drawBitmap(int[] colors, int offset, int stride, int x, int y, int width, int height,boolean hasAlpha, Paint paint)void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)void drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts,int vertOffset, int[] colors, int colorOffset, Paint paint)void drawCircle(float cx, float cy, float radius, Paint paint)void drawColor(int color)void drawColor(int color, PorterDuff.Mode mode)void drawLine(float startX, float startY, float stopX, float stopY, Paint paint)void drawLines(float[] pts, Paint paint)void drawLines(float[] pts, int offset, int count, Paint paint)void drawOval(RectF oval, Paint paint)void drawPaint(Paint paint)void drawPath(Path path, Paint paint)void drawPicture(Picture picture, RectF dst)void drawPicture(Picture picture, Rect dst)void drawPicture(Picture picture)void drawPoint(float x, float y, Paint paint)void drawPoints(float[] pts, int offset, int count, Paint paint)void drawPoints(float[] pts, Paint paint)void drawPosText(char[] text, int index, int count, float[] pos, Paint paint)... ...등등12.1.3 View12.1.3 View12.1.3 View12.1.3 View클래스는 사용자 인터페이스를 위한 기본 객체이다 에 존재한View . android.view.View다 는 스크린의 사각형 영역으로서 드로잉과 이벤트 핸들링을 처리한다 는 위. View - . View젯 의 기본 클래스이다 클래스는 클래스의 서브클래스로서(widget) . ViewGroup View을 담당한다 윈도우의 는 트리 구조로 구성된다 안드로이드 코드에서Layout . View . Java를 선언할 수도 있고 파일에서 를 선언할 수도 있다 를 구성한 다음View XML View . View에는 다음을 수행하여야 한다.의 결정. TextView text초점 결정 메소드에 의한 초점 결정. View : requestFocus()이벤트 핸들링을 위한 구성. - Listener결정 의 가시성 결정. Visibility : View (setVisibility(int))커스텀 를 구현하기 위해서는 다음의 메소드를 하여야 한다 그러나 일반적View override .으로는 만 하여도 그림을 그리는 것은 가능하다onDraw() override .

Page 72: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 69 -

만약 안드로이드 응용이 많은 양의 그래픽을 실행하지 않거나 혹은 낮은 프레임 처리율에서 실행된다면 일반적으로 커스텀 컴포넌트를 생성하여 에서 그림, View View.onDraw()을 그리는 것이 대부분이다.시작하는 방법은 우선 클래스를 확장하고 콜백 메소드를 정의한다 이, View onDraw() .메소드는 안드로이드 시스템에 의하여 호출되어 에 그림을 그리도록 한다 호출 이전View .에 객체는 호출에 의하여 된다View invalidate() invalidate() .12.1.4 ViewGroup12.1.4 ViewGroup12.1.4 ViewGroup12.1.4 ViewGroup은 다른 를 포함할 수 있는 특별한 이며 과 컨테이너ViewGroup View View Layout View를 포함한다 또한 은 파라메타를 정의한 클. ViewGroup Layout ViewGroup.LayoutParams래스를 포함하고 있다 에서 을 정의한다 의 직접. ViewGroup Activity Layout . ViewGroup서브클래스는 을 정의하는Layout AbsoluteLayout, FrameLayout, LinearLayout,이다RelativeLayout, SlidingDrawer, AdapterView<T extends Adapter> .12.1.5 SurfaceView12.1.5 SurfaceView12.1.5 SurfaceView12.1.5 SurfaceView는 클래스의 특별한 하위 클래스이다 이 객체의 목적은 멀티쓰래딩SurfaceView View .환경에서 두 번째 쓰래드를 생성하여 그림을 그릴 수 있도록 하는 것이다 즉 첫 번째 쓰. ,래드에서 객체가 그림을 그리는 것을 완료할 때까지 기다리지 않고 응용의View ,객체가 두 번째 쓰래드를 이용하여 바로 자신의 에 그림을 그리도록SurfaceView Canvas하는 것이다 응용을 개발하기 위해서는 클래스를 확장하고 인터페이스. SurfaceView을 구현하여야 한다 이 인터페이스는 사용할 의 생성 변SurfaceHolder.Callback . Surface ,

분류 메소드 설명Creation 생성자 생성자ViewonFinishInflate() 와 하위 객체들이 모두View전개되면 호출된다.Layout onMeasure(int, int) 와 하위 객체들의 크기View를 결정하기 위하여 호출onLayout(boolean, int, int, int,int) 가 하위 자식들에게View크기와 위치와 부여할 때onSizeChanged(int, int, int, int) 의 크기가 변경되었을 때ViewDrawing onDraw 그림을 그려야 할 때Event processing onKeyDown 이벤트Key downonKeyUp 이벤트Key uponTrackballEvent 이벤트Trackball motiononTouchEvent 이벤트Touch screen motionFocus onFocusChangedEvent() 조정View focusonWindowFocusChanged() 변화View window focusAttaching onAttachedToWindow() 에 연결View windowonDetachedFromWindow() 로부터 분리View windowonWindowVisibilityChanged() 변화Window visibility

Page 73: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 70 -

화 그리고 소멸에 대하여 알려 준다 이 중에서 생성 이벤트가 가장 중요하다 이, . Surface .이벤트가 있어야 언제 가 생성되어 그림을 그릴 수 있는지 알 수 있다SurfaceView .12.1.6 Shape12.1.6 Shape12.1.6 Shape12.1.6 Shape클래스는 를 상속한다 직접 하위 클래스는Shape java.lang.Object . PathShape,이다 간접 하위 클래스는 이다RectShape . ArcShape, OvalShape, RoundRectShape .클래스는 그래픽 도형을 위에 메소드를 사용하여 그린다Shape Canvas draw() .을 사용하면 더욱 정교한 그래픽 조정을 할 수 있다ShapeDrawable() .- Public constructor- Public constructor- Public constructor- Public constructor- Public Method- Public Method- Public Method- Public Method- Protected Method- Protected Method- Protected Method- Protected Method12.1.7 ShapeDrawable12.1.7 ShapeDrawable12.1.7 ShapeDrawable12.1.7 ShapeDrawable클래스는 하위의ShapeDrawable java.lang.Object android.graphics.drawable.Drawable클래스를 상속한다 직접 하위 클래스는 이다 클래스는 기본 도. PaintDrawable . Drawable형을 그리는 반면 클래스는 객체를 받아서 화면에 도형을 그린다ShapeDrawable Shape .가 주어지지 않으면 은 디폴트로서 를 그린다Shape ShapeDrawable RectShape .차원 그래픽을 동적으로 그리기 위해서는 객체가 적합하다2 , ShapeDrawable .을 사용하면 기본 도형을 구성할 수 있고 도형의 속성을 변경할 수 있다ShapeDrawable .의 배경으로는 을 사용할 수 있다 다음은 를 확장하View setBackgroundDrawable() . View여 에 그림을 그리는 코드이다ShapeDrawable .예제 안드로이드 소스 코드예제 안드로이드 소스 코드예제 안드로이드 소스 코드예제 안드로이드 소스 코드public class CustomDrawableView extends View {private ShapeDrawable mDrawable;

Shape()Shape() clone() 객체를 생성하여 반환thisabstract void draw(Canvas canvas, Paint paint) 현재 도형 에 로 그림Canvas Paintfinal float getHeight() 도형 높이 반환final float getWidth() 도형 넓이 반환boolean hasAlpha() 도형 불투명성 검사final void resize(float width, float height) 도형 크기 변경void onResize(float width, float height) callback method

Page 74: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 71 -

public CustomDrawableView(Context context) {super(context);int x = 100;int y = 100;int width = 600;int height = 1000;mDrawable = new ShapeDrawable(new OvalShape());mDrawable.getPaint().setColor(0xff74AC23);mDrawable.setBounds(x, y, x+width, y+height);}protected void onDraw(Canvas canvas) {mDrawable.draw(canvas);}}생성자를 보면 에는 가 정의되어 있다 또한 도형의 와 도, ShapeDrawable OvalShape . color가 정의되어 있다 도형의 가 정의되어 있지 않으면 디폴트 로서 검은색bound . color (default)으로 지정되고 가 정의되지 않으면 도형은 그려지지 않는다 정의된, bound .는 다음과 같이 프로그램에서 사용하여 그림을 그릴 수 있다CustomDrawableView .CustomDrawableView mCustomDrawableView;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mCustomdrawableView = new CustomDrawableView(this);setContentView(mCustomDrawableView);}다음은 클래스의 메소드에 대한 설명이다ShapeDrawable .내포 클래스내포 클래스내포 클래스내포 클래스----속성속성속성속성- XML- XML- XML- XML

- Public constructor- Public constructor- Public constructor- Public constructor

class ShapeDrawable.ShapeFactory 기반 클래스는 객체를 정의한다shape factory .Attribute Name Related Method Descriptionandroid:bottom 아래 부분 paddingandroid:color 의 색상 정의Shapeandroid:height 의 높이 정의Shapeandroid:left 왼쪽 paddingandroid:right 오른쪽 paddingandroid:top 상단 부분 paddingandroid:width 의 폭 정의Shape

Page 75: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 72 -

- Public Method- Public Method- Public Method- Public Method

- Protected Method- Protected Method- Protected Method- Protected Method

ShapeDrawable() 생성자ShapeDrawableShapeDrawable(Shape s) 지정된 로 생성Shape ShapeDrawablevoid draw(Canvas canvas) 에 도형을 그린다Canvasint getChangingConfiguration() 인자의 반환Configuration maskDrawable.ConstantState getConstantState()int getIntrinsicHeight() 객체 높이 반환int getIntrinsicWidth() 객체 넓이 반환int getOpacity() 객체의 투명성 반투명성 반환/boolean getPadding(Rect padding) 반환PaddingPaint getPaint() 도형을 그리는 반환PaintShapeDrawable.ShaderFactory getShaderFactory() 의 반환ShapeDrawable ShaderFactoryShape getShape() 의 반환ShapeDrawable Shapevoid inflate(Resources r, XmlPullParser parser, AttributeSet attrs)Drawable mutate() 현재의 을 로 반환mutable drawablevoid setAlpha(int alpha) 현재 의 레벨drawable alphavoid setColorFilter(ColorFilter cf) 현재 에 설정drawable colorFiltervoid setDither(boolean dither) 기능 활성화Dithervoid getIntrinsicHeight() 의 높이 설정Shapevoid getIntrinsicWidth() 의 넓이 설정Shapevoid setPadding(int left, int top,int right, int bottom) 의 설정Shape paddingvoid setPadding(Rect padding) 객체의 설정Rect padding ,void setShaderFactory(ShapeDrawable.ShaderFactory fact) 설정ShaderFactoryvoid setShape(Shape s) 현재 의 설정ShapeDrawable Shapeboolean inflateTag(String n, Resources r,XmlPullParser p, AttributeSet a) 하위 클래스는 하여 커스텀override서브엘리먼트를 파싱한다void onBoundsChange(Rect bounds) 서브 클래스에서 하여 객체override모양을 바꾼다.void onDraw(Shape s, Canvas c, Paint p) 의 로부터 호출되어Drawable draw()좌표 에 를 그린다(0,0) Shape .

Page 76: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 73 -

12.1.8 ImageView12.1.8 ImageView12.1.8 ImageView12.1.8 ImageView는 의 서브클래스이다 과 같은 이미지를 출력하는데ImageView android.view.View . Icon사용된다 클래스는 자원 그리고 에서 이미지들을 가져올 수. ImageView content provider있다 관리자와 연계되어 사용되며 확장이나 착색 틴팅 기능도 제공한다. Layout ( , tinting) .12.1.9 Bitmap12.1.9 Bitmap12.1.9 Bitmap12.1.9 Bitmap 의 서브클래스이다 이미지를 생성하고 관리하는 기능을 제공한java.lang.Object . Bitmap다 객체가 실제로 그림을 그리는 객체이다. Canvas .

Page 77: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 74 -

예제 안드로이드 프로그램과 결과예제 안드로이드 프로그램과 결과예제 안드로이드 프로그램과 결과예제 안드로이드 프로그램과 결과12.212.212.212.2다음은 안드로이드 예제 프로그램 소스코드와 실행 결과이다.파일로 직사각형을 그리는 프로그램파일로 직사각형을 그리는 프로그램파일로 직사각형을 그리는 프로그램파일로 직사각형을 그리는 프로그램12.2.1XML .12.2.1XML .12.2.1XML .12.2.1XML .초록색 직사각형을 로 정의하여 사용하였다res/drawable/green_rect.xml .import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.ImageView;public class Rectangle extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);ImageView iView=(ImageView)findViewById(R.id.ImageView1);iView.setImageResource(R.drawable.green_rect);}}res/layout/main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><ImageViewandroid:id="@+id/ImageView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:minHeight="100px"android:minWidth="60px"android:layout_margin="115px"/></LinearLayout>res/drawable/green_rect.xml<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#0f0"android:width="5dp"android:height="20dp" /></shape>

Page 78: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 75 -

그림( )안드로이드 코드에서 직사각형을 그리는 프로그램안드로이드 코드에서 직사각형을 그리는 프로그램안드로이드 코드에서 직사각형을 그리는 프로그램안드로이드 코드에서 직사각형을 그리는 프로그램12.2.2 .12.2.2 .12.2.2 .12.2.2 .클래스를 사용하여 빨간색 직사각형을 정의하였다ShapeDrawable .import android.app.Activity;import android.graphics.Color;import android.graphics.drawable.ShapeDrawable;import android.graphics.drawable.shapes.RectShape;import android.os.Bundle;import android.widget.ImageView;public class Rectangle extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);ShapeDrawable rect=new ShapeDrawable(new RectShape());rect.getPaint().setColor(Color.MAGENTA);rect.setIntrinsicHeight(200);rect.setIntrinsicWidth(400);ImageView iView=(ImageView)findViewById(R.id.ImageView1);iView.setImageDrawable(rect);}}res/layout/main.xml

Page 79: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 76 -

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><ImageViewandroid:id="@+id/ImageView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:minHeight="100px"android:minWidth="60px"android:layout_margin="115px"/></LinearLayout>

그림( )둥근 모서리 사각형 그리는 프로그램둥근 모서리 사각형 그리는 프로그램둥근 모서리 사각형 그리는 프로그램둥근 모서리 사각형 그리는 프로그램12.2.312.2.312.2.312.2.3다음은 모서리가 둥근 사각형을 그리는 프로그램이다 다음 코드 부분이 모서리가 둥근 사.각형을 나타낸다.float[] outerRadii=new float[] {6,6,6,6,6,6,6,6};RectF insetRectangle=new RectF(2,2,2,2);float[] innerRadii=new float[] {6,6,6,6,6,6,6,6};

Page 80: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 77 -

import android.app.Activity;import android.os.Bundle;import android.graphics.RectF;import android.graphics.Color;import android.graphics.drawable.ShapeDrawable;import android.graphics.drawable.shapes.RoundRectShape;import android.widget.ImageView;public class RoundArcRect extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);float[] outerRadii=new float[] {6,6,6,6,6,6,6,6};RectF insetRectangle=new RectF(2,2,2,2);float[] innerRadii=new float[] {6,6,6,6,6,6,6,6};ShapeDrawable rndrect=new ShapeDrawable(new RoundRectShape( outerRadii, insetRectangle, innerRadii));rndrect.setIntrinsicHeight(50);rndrect.setIntrinsicWidth(100);rndrect.getPaint().setColor(Color.WHITE);ImageView iView=(ImageView)findViewById(R.id.ImageView1);iView.setImageDrawable(rndrect);}}res/layout/main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><ImageViewandroid:id="@+id/ImageView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:minHeight="100px"android:minWidth="100px"android:layout_margin="115px"/></LinearLayout>

Page 81: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 78 -

그림( )텍스트와 폰트 프로그램텍스트와 폰트 프로그램텍스트와 폰트 프로그램텍스트와 폰트 프로그램12.2.412.2.412.2.412.2.4다음은 텍스와 폰트에 대한 예제 프로그램이다.import android.app.Activity;import android.os.Bundle;import android.content.*;import android.view.*;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Typeface;public class TxtFont extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new TxFont(this));}}class TxFont extends View {/** Called when the activity is first created. */public TxFont(Context context) {super(context);

Page 82: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 79 -

}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.WHITE);Paint tPaint=new Paint(Paint.ANTI_ALIAS_FLAG);Typeface tType1 = Typeface.create(Typeface.SERIF, Typeface.ITALIC);tPaint.setTextSize(15);tPaint.setTypeface(tType1);canvas.drawText("Serif Italic Typeface", 20, 20, tPaint);Typeface tType2 = Typeface.create(Typeface.SANS_SERIF, Tpeface.NORMAL);tPaint.setTextSize(20);tPaint.setTypeface(tType2);canvas.drawText("Sans_Serif Normal Typeface", 30, 50, tPaint);}}

그림( )별을 그린 경로 객체 프로그램별을 그린 경로 객체 프로그램별을 그린 경로 객체 프로그램별을 그린 경로 객체 프로그램12.2.512.2.512.2.512.2.5import android.app.Activity;import android.os.Bundle;import android.graphics.Color;import android.graphics.Path;import android.graphics.drawable.ShapeDrawable;import android.graphics.drawable.shapes.PathShape;import android.widget.ImageView;public class Stella extends Activity {/** Called when the activity is first created. */

Page 83: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 80 -

@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Path p = new Path();p.moveTo(50, 0); //1p.lineTo(25, 200); //2p.lineTo(100, 50); //3p.lineTo(0, 50); //4p.lineTo(75, 200); //5p.lineTo(50, 0); //6ShapeDrawable stella=new ShapeDrawable(new PathShape(p, 100, 100));stella.setIntrinsicHeight(50);stella.setIntrinsicWidth(100);stella.getPaint().setColor(Color.MAGENTA);ImageView iView=(ImageView)findViewById(R.id.ImageView1);iView.setImageDrawable(stella);}}res/layout/main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><ImageViewandroid:id="@+id/ImageView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:minHeight="300px"android:minWidth="400px"android:layout_margin="80px"/></LinearLayout>

Page 84: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 81 -

그림( )이미지 출력 프로그램이미지 출력 프로그램이미지 출력 프로그램이미지 출력 프로그램12.2.6 Bitmap12.2.6 Bitmap12.2.6 Bitmap12.2.6 Bitmap다음은 이미지 출력 프로그램이다 하나의 이미지를 확대하여 다시 나타냈다Bitmap . .import android.app.Activity;import android.os.Bundle;import android.content.*;import android.view.*;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Bitmap;import android.graphics.BitmapFactory;public class Bitmp extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new Btmp(this));}}class Btmp extends View {/** Called when the activity is first created. */public Btmp(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {

Page 85: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 82 -

canvas.drawColor(Color.WHITE);Bitmap pic1=BitmapFactory.decodeResource(getResources(), R.drawable.icon);canvas.drawBitmap(pic1, 130, 60, null);Bitmap pic2=Bitmap.createScaledBitmap(pic1, 200, 200, false);canvas.drawBitmap(pic2, 60, 150, null);}}

그림( )방사형 그래디언트 프로그램방사형 그래디언트 프로그램방사형 그래디언트 프로그램방사형 그래디언트 프로그램12.2.712.2.712.2.712.2.7다음은 방사형 그래디언트 프로그램이다.import android.app.Activity;import android.os.Bundle;import android.content.*;import android.view.*;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.RadialGradient;import android.graphics.Paint;import android.graphics.Shader;public class RadGradient extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {

Page 86: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 83 -

super.onCreate(savedInstanceState);// setContentView(R.layout.main);setContentView(new RGradient(this));}}class RGradient extends View {/** Called when the activity is first created. */public RGradient(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.BLACK);Paint circlePaint=new Paint(Paint.ANTI_ALIAS_FLAG);RadialGradient radGrad = new RadialGradient(canvas.getWidth()/2,canvas.getHeight()/3, 50, Color.RED, Color.GREEN, Shader.TileMode.MIRROR);circlePaint.setShader(radGrad);canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/3, canvas.getWidth()/4, circlePaint);}}

그림( )스윕 그래디언트 프로그램스윕 그래디언트 프로그램스윕 그래디언트 프로그램스윕 그래디언트 프로그램12.2.812.2.812.2.812.2.8다음 스윕 그래디언트 프로그램이다(sweep) .import android.app.Activity;

Page 87: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 84 -

import android.os.Bundle;import android.content.*;import android.view.*;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.SweepGradient;import android.graphics.Paint;import android.graphics.Shader;public class SwpGradient extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new SwGradient(this));}}class SwGradient extends View {/** Called when the activity is first created. */public SwGradient(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.BLACK);Paint circlePaint=new Paint(Paint.ANTI_ALIAS_FLAG);SweepGradient radGrad = new SweepGradient(canvas.getWidth()/2, canvas.getHeight()/3,new int[] {Color.RED, Color.YELLOW, Color.GREEN, Color.BLUE, Color.MAGENTA},null);circlePaint.setShader(radGrad);canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/3,canvas.getWidth()/4, circlePaint);}}

그림( )

Page 88: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 85 -

애니매이션애니매이션애니매이션애니매이션12.312.312.312.3 프레임 애니메이션프레임 애니메이션프레임 애니메이션프레임 애니메이션12.3.1 (frame)12.3.1 (frame)12.3.1 (frame)12.3.1 (frame)프레임 애니메이션은 전통적인 의미의 애니메이션으로서 약간 씩 다른 몇 개의 영상을 연속적으로 실행하여 구현한다 클래스가 프레임 애니메이션의 기본 클. AnimationDrawable래스이다 프레임 애니메이션은 를 사용하여 안드로이드 코드. AnimationDrawable API Java에서 수행할 수도 있고 파일에서 수행할 수도 있다 파일은 디렉토, XML . XML res/anim/리에 저장된다 파일은 요소를 루트 요소로 그리고 요소들. XML <animation-list> <item>을 하위 자식 노드로 구성된다 다음은 프레임 애니메이션을 위한 파일이다. XML .<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="true'><item android:drawable="@drawable/rocket_thrust1" android:duration="200" /><item android:drawable="@drawable/rocket_thrust2" android:duration="200" /><item android:drawable="@drawable/rocket_thrust3" android:duration="200" /></animation-list>이 애니메이션은 세 개의 프레임을 사용하여 실행된다 만약 속성을. android:oneshot true로 한다면 애니메이션은 한번 실행되고 마지막 프레임에서 멈춘다 만약. android:oneshot속성을 로 하면 애니메이션은 계속 실행된다 다음은 을 프레임 애니false . rocket_thrust.xml메이션으로 구현한 안드로이드 소스 코드의 예를 보여준다Java .AnimationDrawable rocketAnimation;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);rocketImage.setBackgoundResource(R.anim.rocket_thrust);rocketAnimation = (AnimationDrawable) rocketImage.getBackground();}public boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {rocketAnimation.start();return true;}return super.onTouchEvent(event);}이 코드에서 주의할 부분은 에서 사용된 메소드는AnimationDrawable start() onCreate()메소드에서는 호출될 수 없다는 것이다 왜냐하면 이 아직 윈도우에 완. , AnimationDrawable

Page 89: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 86 -

전히 밀착되지 못했기 때문이다 애니메이션을 바로 실행하기 위해서는 메소드를. , start()에서 호출하여야 한다onWindowFocusChanged() .트윈 애니메이션트윈 애니메이션트윈 애니메이션트윈 애니메이션12.3.2 (tween)12.3.2 (tween)12.3.2 (tween)12.3.2 (tween)트윈 애니메이션은 객체에 대하여 간단한 변환 이동 확장 회전 등 을 계속 수행하View ( , , )는 애니메이션을 의미한다 만약 객체가 있으면 이 객체를 이동 회전 확대 혹. TextView , , , ,은 축소하는 애니메이션을 의미한다 만약에 배경 이미지가 있으면 배경 이미지도 텍스트. ,와 함께 변환된다 패키지는 트윈 애니메이션과 관련된 모든 클래. android.view.animation스를 제공한다.트윈 애니메이션은 코드에 의하여 정의될 수도 있고 안드로이드 코드에 의하여 정XML의될 수도 있다 일반적으로 을 정의할 때처럼 파일로 트윈 애니메이션을 정의. Layout XML하는 것을 권장한다 왜냐하면 파일로 정의하면 더 읽기 쉽고 재사용도 쉽기 때문이. XML ,다 아래의 예에서는 을 사용한다. XML .애니메이션 파일은 디렉토리에 저장된다 애니메이션 파일은 오직 하나XML res/anim/ .의 루트 요소를 가지고 있어야 한다 이 루트 요소는(root) . <alpha>, <scale>, <translate>,요소이다 요소는 다른 요소를 원소로 가<rotate>, <interpolate element>, <set> . <set>지는 그룹 요소이다 디폴트로서 모든 애니메이션은 명령과 동시에 실행된다 명령을 순차. , .적으로 실행하려면 속성을 설정하여야 한다, startOffset .다음 파일은 예로서 객체를 확장하고 회전시킨다XML ApiDemo View .<set android:shareInterpolator = "false"><scale android:interpolator ="@android;anim/accelerate_decelerate_interpolator"android:fromXScale = "1.0"android:toXScale = "1.4"android:fromYScale = "1.0"android:toYScale = "0.6"android:pivotX = "50%"android:pivotY = "50%"android:fillAfter = "false"android:duration = "700"/><set android:Interpolator = "@android:anim/decelerate_interpolator"><scaleandroid:fromXScale = "1.4"android:toXScale = "0.0"android:fromYScale = "0.6"android:toYScale = "0.0"android:pivotX = "50%"android:pivotY = "50%"android:startOffset = "700"android:duration = "400"android:fillBefore ="false" /><rotateandroid:fromDegrees = "0"android:toDegrees = "-45"android:toYScale = "0.0"android:pivotX = "50%"

Page 90: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 87 -

android:pivotY = "50%"android:startOffset = "700"android:duration = "400" /></set></set> 값은 객체 자체 혹은 상위 부모 객체에 대하여 상대적으로 설정될 수 있다 그러나pivotX .알맞은 포맷을 사용하여야 한다 예를 들어 은 상위 부모에 대하여 상대적이라는. , “50” 50%의미이고 은 객체 자체에 대하여 상대적이라는 의미이다, “50%” 50% .차원 객체의 변환이 시간에 따라서 어떻게 적용되는 가는 객체를 통하여2 Interpolator조정할 수 있다 안드로이드는 스피드 커브를 조정하는 몇 개의 서브클래스를. interpolator포함하고 있다 예를 들어 는 변환의 속도를 처음에는 천천히 시작. AccelerateInterpolator하여 점점 빠르게 조정한다 예를 들어서 다음 파일이. , hyperspace_jump.xml XML폴더에 있다면 안드로이드 코드는 이 파일을 참조하여 객체에res/anim/ , Java ImageView적용할 수 있다.ImageView spaceshipImage = (Image) findViewById(R.id.spaceshipImage);Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);spaceshipImage.startAnimation(hyperspaceJumpAnimation);에 대한 대안으로서 애니메이션 시작 시간을 으startAnimation() , Animation.setStartTime()로 설정할 수 있다 다음에 애니메이션을 에 으로 설정할 수 있. View View.setAnimation()다. 애니메이션 클래스애니메이션 클래스애니메이션 클래스애니메이션 클래스12.3.312.3.312.3.312.3.3 클래스는 이며 를 상속한Animation android.view.animation.Animation java.lang.Object다 관련된 하위 클래스는. AlphaAnimation, AnimationSet, RotateAnimation,이다 애니메이션 클래스는 그리고ScaleAnimation, TranslateAnimation . View, Surface,다른 객체에 적용된다.내포 클래스내포 클래스내포 클래스내포 클래스----속성속성속성속성- XML- XML- XML- XML인터페이스 Animation.AnimationListener 을 받는다Notification클래스 Animation.Description 크기를 파싱하는 유틸리티 클래스

속성 이름 관련된 메소드 설명android:detachWallpaper setDetachWallpaper(boolean) 윈도우 애니메이션 옵션android:duration setDuration(long) 애니메이션 수행 시간android:fillAfter setFillAfter(boolean) 이면 애니메이션 완료True ,후 애니메이션 변환 적용

Page 91: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 88 -

상수상수상수상수----

- Public Constructors- Public Constructors- Public Constructors- Public Constructors- Public Method- Public Method- Public Method- Public Method

android:fillBefore setFillBefore(boolean) 이면 애니메이션 완료True ,전 애니메이션 변환 적용android:fillEnabled setFillEnabled(boolean) 이면 적용True , fillAfterandroid:interpolator setInterpolator(interpolator) 애니메이션 보간 적용android:repeatCount setRepeatCount(int) 애니메이션 반복 회수android:repeatMode setRepeatMode(int) 애니메이션 행동 정의android:startOffset setStartOffset(long) 애니메이션 수행 지연 시간정의 밀리세컨드( )android:zAdjustment setZAdjustment(int) 애니메이션 순서 조정Zint ABSOLUTE 픽셀 개수int INFINITE 애니메이션 무한 실행int RELATIVE_TO_PARENT 부동소수점 수로서 현재 객체의 부모 객체의폭 혹은 높이와 곱해진다.int RELATIVE_TO_SELF 부동소수점 수로서 현재의 애니메이션 객체의폭 혹은 높이와 곱해진다.int RESTART 애니메이션이 마지막에 도달하고INFINITE_REPEAT 이거나 양수면 애니메이션은처음부터 시작int REVERSE 애니메이션이 마지막에 도달하고INFINITE_REPEAT 이거나 양수면 애니메이션은역방향으로 진행int START_ON_FIRST_FRAME 애니메이션 시작 시간int ZORDER_BOTTOM 애니메이션 순서의 영향을 받도록 조정Zint ZORDER_NORMAL 애니메이션이 현재 순서로 유지되도록 한다Zint ZORDER_TOP 애니메이션이 다른 내용의 최상위가 되도록 한다.Animation( ) 디폴트 값을 사용하여새로운 애니메이션 생성Animation(Context context, AttributeSet attrs) 인자로 새로운context, attrs애니메이션 생성long computeDurationHint()boolean getDetachWallpaper()long getDuration()boolean getFillAfter()boolean getFillBefore()interpolator getInterpolator()

Page 92: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 89 -

- Protected method- Protected method- Protected method- Protected method

int getRepeatCount()int getRepeatMode()long getStartOffset()long getStartTime()boolean getTransformation(long currentTime, Transformation outTransformation)int getZAdjustment()boolean hasEnded()boolean hasStarted()void initialize(int width, int height, int parentWidth, int parentHeight)boolean isFillEnabled()boolean isInitialized()void reset()void restrictDuration(long durationMillis)void scaleCurrentDuration(float scale)void setAnimationListener(Animation.AnimationListener listener)void setDetachWallpaper(boolean detachWallpaper)void setDuration(long durationMillis)void setFillAfter(boolean fillAfter)void setFillBefore(boolean fillBefore)void setFillEnabled(boolean fillEnabled)void setInterpolator(Context context, int resID)void setInterpolator(Interpolator i)void setRepeatCount(int repeatCount)void setRepeatMode(int repeatMode)void setStartOffset(long startTimeMillis)void setStartTime(long startTimeMillis)void setZAdjustment(int zAdjustment)void start()void startNow()boolean willChangeBounds()boolean willchangeTransformation(int type, float value, int size, int parentSize)void applyTransformation(float interpolationTime, Transformation t)Animation clone()void ensureInterpolator()void resolveSize(int type, float value, int size, int parentSize)

Page 93: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 90 -

예제 애니메이션 프로그램과 결과예제 애니메이션 프로그램과 결과예제 애니메이션 프로그램과 결과예제 애니메이션 프로그램과 결과12.412.412.412.4 프레임 애니메이션프레임 애니메이션프레임 애니메이션프레임 애니메이션12.4.112.4.112.4.112.4.1다음은 프레임 애니메이션 프로그램과 실행 결과이다.import android.app.Activity;import android.graphics.drawable.AnimationDrawable;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView;public class FrameAnimation extends Activity {AnimationDrawable frameAnimation = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.frame);시작 버튼// Handlefinal Button onButton = (Button) findViewById(R.id.ButtonStart);onButton.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {startAnimation();}}); 중지 버튼// Handlefinal Button offButton = (Button) findViewById(R.id.ButtonStop);offButton.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {stopAnimation();}});}private void startAnimation(){ ImageView img = (ImageView)findViewById(R.id.ImageView1);// Three frames for frame animationBitmapDrawable frame1 = (BitmapDrawable)getResources().getDrawable(R.drawable.f1);BitmapDrawable frame2 = (BitmapDrawable)getResources().getDrawable(R.drawable.f2);BitmapDrawable frame3 = (BitmapDrawable)getResources().getDrawable(R.drawable.f3);// Get the backgroundint Duration = 50;frameAnimation = new AnimationDrawable();frameAnimation.setOneShot(false); // loop continuously

Page 94: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 91 -

frameAnimation.addFrame(frame1, Duration);frameAnimation.addFrame(frame2, Duration);frameAnimation.addFrame(frame3, Duration);img.setBackgroundDrawable(frameAnimation);frameAnimation.setVisible(true,true);frameAnimation.start();}private void stopAnimation(){ frameAnimation.stop();frameAnimation.setVisible(false,false);}}res/layout/frame.xml<?xml version="1.0" encoding="utf-8" ?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><LinearLayout android:id="@+id/ButtonRow"android:layout_width="wrap_content" android:layout_height="wrap_content"android:orientation="horizontal"><Button android:id="@+id/ButtonStart"android:layout_width="wrap_content" android:layout_height="wrap_content"시작android:text=" " /><Button android:id="@+id/ButtonStop"android:layout_width="wrap_content" android:layout_height="wrap_content"끝android:text=" " /></LinearLayout><ImageView android:id="@+id/ImageView1"android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>res/drawablef1.bmp, f2.bmp, f3.bmp

그림( )

Page 95: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 92 -

트윈 애니메이션트윈 애니메이션트윈 애니메이션트윈 애니메이션12.4.212.4.212.4.212.4.2다음은 트윈 애니메이션 프로그램과 결과이다.import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.Button;import android.widget.ImageView;public class TweenAni extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.tween);// Handle Scale Buttonfinal Button growButton = (Button) findViewById(R.id.ButtonScale);growButton.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {performAnimation(R.anim.scale);}});// Handle Move Buttonfinal Button moveButton = (Button) findViewById(R.id.ButtonTranslate);moveButton.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {performAnimation(R.anim.translate);}});// Handle Spin Buttonfinal Button spinButton = (Button) findViewById(R.id.ButtonRotate);spinButton.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {performAnimation(R.anim.rotate);}});}private void performAnimation(int animationResourceID){ // We will animate the imageviewImageView reusableImageView =(ImageView)findViewById(R.id.ImageViewForTweening);reusableImageView.setImageResource(R.drawable.green_rect);reusableImageView.setVisibility(View.VISIBLE);// Load the appropriate animationAnimation an = AnimationUtils.loadAnimation(this, animationResourceID);// Register a listener, so we can disable and re-enable buttonsan.setAnimationListener(new MyAnimationListener());// Start the animationreusableImageView.startAnimation(an);}

Page 96: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 93 -

private void toggleButtons(boolean clickableState){ // Handle Scale Buttonfinal Button growButton = (Button) findViewById(R.id.ButtonScale);growButton.setClickable(clickableState);// Handle Move Buttonfinal Button moveButton = (Button) findViewById(R.id.ButtonTranslate);moveButton.setClickable(clickableState);// Handle Spin Buttonfinal Button spinButton = (Button) findViewById(R.id.ButtonRotate);spinButton.setClickable(clickableState);}class MyAnimationListener implements Animation.AnimationListener {public void onAnimationEnd(Animation animation) {// Hide our ImageViewImageView reusableImageView =(ImageView)findViewById(R.id.ImageViewForTweening);reusableImageView.setVisibility(View.INVISIBLE);// Enable all buttons once animation is overtoggleButtons(true);}public void onAnimationRepeat(Animation animation) {// what to do when animation loops}public void onAnimationStart(Animation animation) {// Disable all buttons while animation is runningtoggleButtons(false);}}}res/layout/tween.xml<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/tween" /><LinearLayoutandroid:id="@+id/ButtonRow"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><Button android:id="@+id/ButtonScale"android:layout_width="wrap_content"android:layout_height="wrap_content"성장android:text=" "></Button><Button

Page 97: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 94 -

android:id="@+id/ButtonTranslate"android:layout_width="wrap_content"android:layout_height="wrap_content"이동android:text=" "></Button><Button android:id="@+id/ButtonRotate"android:layout_width="wrap_content"android:layout_height="wrap_content"회전android:text=" "></Button></LinearLayout><LinearLayoutandroid:id="@+id/LinearLayout01"android:layout_height="fill_parent"android:layout_width="fill_parent"android:orientation="horizontal"android:layout_gravity="center_vertical|center_horizontal"><ImageViewandroid:id="@+id/ImageViewForTweening"android:layout_width="wrap_content"android:layout_height="wrap_content"android:minHeight="90px"android:minWidth="90px"android:layout_margin="115px"></ImageView></LinearLayout></LinearLayout>res/anim/scale.xml<?xml version="1.0" encoding="utf-8" ?><!-- Over the course of 5 seconds, scale up and back --><set xmlns:android="http://schemas.android.com/apk/res/android"android:shareInterpolator="false"><scale android:pivotX="50%"android:pivotY="50%"android:fromXScale="1.0"android:fromYScale="1.0"android:toXScale="4.0"android:toYScale="4.0"android:duration="3000" /><scale android:startOffset="2500"android:duration="3000"android:pivotX="50%"android:pivotY="50%"android:fromXScale="1.0"android:fromYScale="1.0"android:toXScale="0.5"android:toYScale="0.5" /></set>res/anim/rotate.xml<?xml version="1.0" encoding="utf-8" ?><!-- Over the course of 5 seconds, spin 360 --><set xmlns:android="http://schemas.android.com/apk/res/android"android:shareInterpolator="false"><rotate android:fromDegrees="0"android:toDegrees="700"

Page 98: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 95 -

android:pivotX="50%"android:pivotY="50%"android:duration="10000" /></set>res/anim/translate.xml<?xml version="1.0" encoding="utf-8" ?><!-- Over the course of 5 seconds, move 150 up and then 100 back down the Y axis. --><setxmlns:android="http://schemas.android.com/apk/res/android"android:shareInterpolator="false"><translate android:toYDelta="-100"android:fillAfter="true"android:duration="2500"/><translate android:toYDelta="150"android:fillAfter="true"android:duration="2500"android:startOffset="2500"/></set>

그림( )

Page 99: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 96 -

장 위치 기반 서비스장 위치 기반 서비스장 위치 기반 서비스장 위치 기반 서비스13 . (Location-Based Service)13 . (Location-Based Service)13 . (Location-Based Service)13 . (Location-Based Service)위치 기반 서비스는 모바일 사용자들에게 필수적인 것이다 위치 기반 서비스는.패키지와 외부 라이브러리를 통하여 제공된다 위치 기반android.location Google Maps .서비스에서 가장 중요한 시스템 서비스는 이며 위치 기반 서비스를 위한LocationManager를 제공한다 다른 시스템 서비스와 마찬가지로 를 직접 객체화하는API . LocationManager것이 아니라 호출을 통하여getSystemService(Context.LOCATION_SERVICE)객체를 얻는다 객체를 얻으면 다음 가지 기능을 할LocationManager . LocationManager 3수 있다. 로부터 가장 최근의 위치 정보를 제공하는 를 구한다- LocationManager LocationProvider .로부터 현재 위치 정보의 제공을 등록 해제 한다- LocationProvider (register)/ (unregister) .모바일 기기가 정해진 위도와 경도 범위에 들어오면 위치 정보 를 작동시킬 수- Intent있도록 등록 해제 한다(register)/ (unregister) .그러나 를 통하여 위치 기반 서비스를 개발하는 경우에는 실제로 로부터 위도와AVD GPS경도 정보를 받지는 못한다 이런 경우에는 에서. DDMS(Dalvik Debug Monitoring Service)위도와 경도 정보를 입력할 수 있다 위도와 경도 정보를 입력하는 방법에는 가지 방법이. 3있다.키보드에서 입력하는 방법- 파일을 통하여 입력하는 방법- GPX 파일을 통하여 입력하는 방법- KML간단한 응용의 경우에는 키보드를 통하여 입력하는 방법을 사용하는 것이 편리하다. DDMS에는 디폴트값으로 이미 위도 경도 값이 입(latitude):37.422006, (longitude):-122.084095력되어 있다.간단한 위치 기반 서비스 프로그램간단한 위치 기반 서비스 프로그램간단한 위치 기반 서비스 프로그램간단한 위치 기반 서비스 프로그램13.113.113.113.1다음은 간단한 위치 기반 응용 프로그램이다 첫 번째 코드는 안드로이드 코드이다. Java .이 프로그램은 를 얻은 다음에LocationManager List<String> providers =에 의하여 위치 정보 제공자를 얻는다 위치 정보 제locationManager.getProviders(true); .공자로부터 위도와 경도 정보를 얻어서 화면에 출력한다.import java.util.List;import android.app.Activity;import android.os.Bundle;import android.content.Context;import android.location.Location;import android.location.LocationManager;import android.location.LocationListener;import android.widget.TextView;

Page 100: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 97 -

public class BasicLoc extends Activity {/** Called when the activity is first created. */LocationManager locationManager;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);locProviders();}public void locProviders() {TextView tvw = (TextView)findViewById(R.id.myTextView);위치 정보 공급자StringBuilder sb = new StringBuilder(" : ");List<String> providers = locationManager.getProviders(true);for(String provider : providers) {locationManager.requestLocationUpdates(provider, 1000, 0, new LocationListener() {public void onLocationChanged(Location location) {}public void onProviderDisabled(String provider) {}public void onProviderEnabled(String provider) {}public void onStatusChanged(String provider, int status, Bundle extras) {}});sb.append(provider).append("\n");Location location = locationManager.getLastKnownLocation(provider);if(location != null) { 위도double lat = location.getLatitude(); // 경도double lng = location.getLongitude(); //위치 위도 경도sb.append(" (").append(" :").append(lat).append(", :").append(lng).append(")");} else { 위치를 찾을 수 없음sb.append(" ");}}tvw.setText(sb);}}다음은 폴더에 있는 파일의 내용이다res/layout/ main.xml .<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/myTextView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"

Page 101: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 98 -

/></LinearLayout>다음은 파일의 내용이다AndroidManifest.xml .<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.LBS1"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".location1"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-sdk android:minSdkVersion="7" /></manifest>출력 결과는 다음과 같다.

그림( )

Page 102: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 99 -

요구 기준에 의한 위치 찾기 예제 프로그램요구 기준에 의한 위치 찾기 예제 프로그램요구 기준에 의한 위치 찾기 예제 프로그램요구 기준에 의한 위치 찾기 예제 프로그램13.213.213.213.2다음은 요구 기준에 의하여 위치 정보를 찾는 프로그램이다 다음 코드 부분이 요구하는.위치 정보는 넓은 간격의 위치 정보이다 정밀한 간격을 요구하는 경우에는(coarse) .이라고 해야 한다(Criteria.ACCURACY_FINE) .Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_COARSE);criteria.setAltitudeRequired(false);criteria.setBearingRequired(false);criteria.setCostAllowed(true);criteria.setPowerRequirement(Criteria.POWER_LOW);다음은 프로그램 소스 코드이다 위치 정보 갱신이 가능하도록 되어 있으며 다음 코드. 에 의locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);하여 초마다 위치 정보를 갱신한다2 .import android.app.Activity;import android.os.Bundle;import android.content.Context;import android.location.Criteria;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.widget.TextView;public class criteria_loc extends Activity {@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);LocationManager locationManager;locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_COARSE);criteria.setAltitudeRequired(false);criteria.setBearingRequired(false);criteria.setCostAllowed(true);criteria.setPowerRequirement(Criteria.POWER_LOW);String provider = locationManager.getBestProvider(criteria, true);Location location = locationManager.getLastKnownLocation(provider);updateWithNewLocation(location);locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);}

Page 103: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 100 -

private final LocationListener locationListener = new LocationListener() {public void onLocationChanged(Location location) {updateWithNewLocation(location);}public void onProviderDisabled(String provider){updateWithNewLocation(null);}public void onProviderEnabled(String provider){}public void onStatusChanged(String provider, int status, Bundle extras) {}};/** Update UI with a new location */private void updateWithNewLocation(Location location) {TextView MyLocationText = (TextView)findViewById(R.id.MyLocationText);String latLongString;if (location != null) {double lat = location.getLatitude();double lng = location.getLongitude();위도 경도latLongString = " :" + lat + ", :" + lng;} else { 위치 찾지 못함latLongString = " .";} 당신의 현재 위치는MyLocationText.setText(" :\n" + latLongString);}}다음은 폴더에 있는 파일의 내용이다res/layout/ main.xml .<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/MyLocationText"android:layout_width="fill_parent"android:layout_height="fill_parent"android:text="@string/hello"/></LinearLayout>다음은 파일의 내용이다AndroidManifest.xml .<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"

Page 104: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 101 -

package="com.wai2"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".wai2"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-sdk android:minSdkVersion="7" /></manifest>다음은 출력 결과이다.

그림그림그림그림( )( )( )( )

Page 105: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 102 -

지오코더 에 의한 주소 생성지오코더 에 의한 주소 생성지오코더 에 의한 주소 생성지오코더 에 의한 주소 생성13.3 (Geocoder)13.3 (Geocoder)13.3 (Geocoder)13.3 (Geocoder)다음은 위도와 경도 정보로부터 주소를 출력하는 프로그램이다 다음 코드 부분에서.Geocoder gc = new Geocoder(this, Locale.getDefault());위도와 경도 정보로부터 주소를 반환하는 객체를 얻고 다음 코드 부분에서Geocoder ,List<Address> addresses = gc.getFromLocation(lat, lng, 1);실제 주소를 얻는다.import java.io.IOException;import java.util.List;import java.util.Locale;import android.app.Activity;import android.os.Bundle;import android.content.Context;import android.location.Address;import android.location.Criteria;import android.location.Geocoder;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.widget.TextView;public class GeoLoc extends Activity {@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);setContentView(R.layout.main);LocationManager locationManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE);Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_FINE);criteria.setAltitudeRequired(false);criteria.setBearingRequired(false);criteria.setCostAllowed(true);criteria.setPowerRequirement(Criteria.POWER_LOW);String provider = locationManager.getBestProvider(criteria, true);Location location = locationManager.getLastKnownLocation(provider);updateWithNewLocation(location);locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);}

Page 106: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 103 -

private final LocationListener locationListener = new LocationListener() {public void onLocationChanged(Location location) {updateWithNewLocation(location);}public void onProviderDisabled(String provider){updateWithNewLocation(null);}public void onProviderEnabled(String provider) {}public void onStatusChanged(String provider, int status, Bundle extras){}};/** Update UI with a new location */private void updateWithNewLocation(Location location) {TextView MyLocationText = (TextView)findViewById(R.id.MyLocationText);String latLongString;String addressString = null;if (location != null) {double lat = location.getLatitude();double lng = location.getLongitude();위도 경도latLongString = "( :" + lat + ", :" + lng + ")";Geocoder gc = new Geocoder(this, Locale.getDefault());try {List<Address> addresses = gc.getFromLocation(lat, lng, 1);StringBuilder sb = new StringBuilder();if (addresses.size() > 0) {Address address = addresses.get(0);for (int i = 0; i < address.getMaxAddressLineIndex(); i++)sb.append(address.getAddressLine(i)).append("\n");sb.append(address.getLocality()).append("\n");sb.append(address.getPostalCode()).append("\n");sb.append(address.getCountryName());addressString = sb.toString();} else 주소 찾을 수 없음addressString = " .";} catch (IOException e) {System.out.println("IO Exception occurred.\n");}} else { 위치 발견 되지 않음latLongString = " .";} 당신의 위치MyLocationText.setText(" :\n" + latLongString +당신의 주소"\n\n :\n" + addressString);}}AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.GeoLoc"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_name">

Page 107: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 104 -

<activity android:name=".GeoLoc"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-sdk android:minSdkVersion="7" /></manifest>res/layout/main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/MyLocationText"android:layout_width="fill_parent"android:layout_height="fill_parent"android:text="@string/hello"/></LinearLayout>다음은 출력 결과이다.

그림그림그림그림( )( )( )( )

Page 108: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 105 -

와 에 의한 지도 출력와 에 의한 지도 출력와 에 의한 지도 출력와 에 의한 지도 출력13.4 MapView MapActivity13.4 MapView MapActivity13.4 MapView MapActivity13.4 MapView MapActivity다음은 와 에 의한 지도 출력 프로그램이다 다음 코드는 응용을 위한MapView MapActivity .와 를 선언하는 부분이다MapView mapController .MapView myMapView = (MapView)findViewById(R.id.myMapView);mapController = myMapView.getController();다음 코드는 지도 출력 옵션을 나타내는 코드이다.// Configure the map display optionsmyMapView.setSatellite(true);myMapView.setStreetView(true);myMapView.displayZoomControls(false);다음 코드는 지도를 갱신하는 부분이다.// Update the map location.Double geoLat = location.getLatitude()*1E6;Double geoLng = location.getLongitude()*1E6;GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());mapController.animateTo(point);다음은 전체 코드이다.import java.io.IOException;import java.util.List;import java.util.Locale;import android.location.Address;import android.location.Geocoder;import android.os.Bundle;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapActivity;import com.google.android.maps.MapController;import com.google.android.maps.MapView;import android.content.Context;import android.location.Criteria;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.widget.TextView;public class MyMapActivity extends MapActivity {MapController mapController;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);

Page 109: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 106 -

setContentView(R.layout.main);MapView myMapView = (MapView)findViewById(R.id.myMapView);mapController = myMapView.getController();// Configure the map display optionsmyMapView.setSatellite(true);myMapView.setStreetView(true);myMapView.displayZoomControls(false);// Zoom inmapController.setZoom(17);LocationManager locationManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE);Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_FINE);criteria.setAltitudeRequired(false);criteria.setBearingRequired(false);criteria.setCostAllowed(true);criteria.setPowerRequirement(Criteria.POWER_LOW);String provider = locationManager.getBestProvider(criteria, true);Location location = locationManager.getLastKnownLocation(provider);updateWithNewLocation(location);locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);}private final LocationListener locationListener = new LocationListener() {public void onLocationChanged(Location location) {updateWithNewLocation(location);}public void onProviderDisabled(String provider) {updateWithNewLocation(null);}public void onProviderEnabled(String provider) {}public void onStatusChanged(String provider, int status, Bundle extras) {}};/** Update the map with a new location */private void updateWithNewLocation(Location location) {// Update the map location.Double geoLat = location.getLatitude()*1E6;Double geoLng = location.getLongitude()*1E6;GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());mapController.animateTo(point);TextView myLocationText = (TextView)findViewById(R.id.myLocationText);String latLongString; 주소 발견하지 못함String addressString = " ";if (location != null) {double lat = location.getLatitude();double lng = location.getLongitude();위도 경도latLongString = " :" + lat + "\n :" + lng;Geocoder gc = new Geocoder(this, Locale.getDefault());try {

Page 110: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 107 -

List<Address> addresses = gc.getFromLocation(lat, lng, 1);StringBuilder sb = new StringBuilder();if (addresses.size() > 0) {Address address = addresses.get(0);for (int i = 0; i < address.getMaxAddressLineIndex(); i++)sb.append(address.getAddressLine(i)).append("\n");sb.append(address.getLocality()).append("\n");sb.append(address.getPostalCode()).append("\n");sb.append(address.getCountryName());} addressString = sb.toString();} catch (IOException e) {}} else { 위치 찾지 못했음latLongString = " .";} 당신의 현재 위치myLocationText.setText(" \n" + latLongString당신의 주소+ "\n\n :\n" + addressString);}@Overrideprotected boolean isRouteDisplayed() {return false;}} 다음은 코드이다 지도 사용을 선언하는 다음 부분은AndroidManifest.xml . Google안에 반드시 존재하여야 한다<activity> ... </activity> .<uses-library android:name="com.google.android.maps" />인터넷 사용 권한을 부여하는 다음 부분도 파일에 반드시 있어야 한다AndroidManifest.xml .<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />다음은 파일 코드이다XML .AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.MyMapActivity"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".MyMapActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><uses-library android:name="com.google.android.maps" /></application>

Page 111: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 108 -

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-sdk android:minSdkVersion="7" /></manifest>다음은 코드이다 이 코드에서 가장 중요한 부분은main.xml . 에서 부분이다 지도 는<com.google.android.maps.MapView android:apiKey . Key MD5지문을 생성한 다음에 에서 부여 받아야code.google.com/android/maps-api-signup.html한다 주소마다 다른 를 부여 받아야 지도 서비스를 사용할 수 있다. IP Key google .res/layout/main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/myLocationText"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><com.google.android.maps.MapViewandroid:id="@+id/myMapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:enabled="true"android:clickable="true" 생략부분android:apiKey="0a1nyi........ ............. B0Dt-Q"/></LinearLayout>다음은 출력 결과이다 위도와 경도 정보가 출력되고 주소가 출력된다 다음에 지도가 출력. .되었다 현재 다음 옵션이 선언되어 있다. .android:enabled="true"android:clickable="true"그래서 지도를 움직일 수가 있으며 지도에 클릭을 할 수가 있다 지도를 마우스로 움직이면.현재 윈도우에 없는 지도 부분은 다시 로딩 된다 그리고 지도를 클릭하면 도로에 파AVD .란색 선이 형성된다 다음 첫 번째 지도 그림은 원래 출력된 지도 그림이고 그 다음 그림. ,은 지도를 마우스로 클릭한 다음에 이동시킨 그림이다 도로에 파란색 선이 형성되어 있고.민둥산이 크게 나타나 있다.

Page 112: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 109 -

그림그림그림그림( )( )( )( )

그림그림그림그림( )( )( )( )

Page 113: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 110 -

인증 구하기인증 구하기인증 구하기인증 구하기13.5 MD513.5 MD513.5 MD513.5 MD5참고로 다음은 인증서 지문을 구하는 그림이다MD5 .

그림그림그림그림( )( )( )( )를 구하는 절차는 다음과 같이 하였다 이 과정이 약간 까다롭지만 지도 서비MD5 . google스를 받기 위해서는 반드시 필요한 과정이다 다음 과정은 본 저자가 사용한 방법이다 일. .반적으로 거의 비슷하지만 약간씩 다를 수는 있다 이 과정을 시작하기 전에.에 계정을 먼저 만들어 두어야 한다www.google.com .편의상 밑에 있는 파일과(1) C:/Program Files/Java/jre1.60_03/bin/ keytool.exe파일을 로 복사한다jli.dll C:/Document and Settings/user/ .편의상 밑에 있는 파일을(2) C:/Document and Settings/user/.android/ debug.keystore밑으로 복사한다C:/ .다음에 에 있는 파일을 실행한다(3) C:/Document and Settings/user/ keytool.exe .실행 옵션은 다음과 같다.C:/Document and Settings/user>keytool -list -alias androiddebugkey -keystoreC:/debug.keystore -storepass android -keypass android지문이 출력된다 지문은 두 개의 문자와 로 구성된 패턴으로서 예를 들어(4) MD5 . MD5 :형태이다“7F:8F:7A:04:1E:E7:D3:E9:F7:5A:60:37:FA:1A:7B:BB” .

Page 114: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 111 -

지문을 에 입력하면(5) MD5 http://code.google.com/android/maps-api-signup.html가 생성된다apiKey .생성된 를 다음과 같은 형태로 파일에 입력한다(6) apiKey main.xml .<com.google.android.maps.MapViewandroid:id="@+id/myMapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:enabled="true"android:clickable="true" 생략 이 부분에 입력android:apiKey="0a1nyi......... .......... B0Dt-Q" <-- apiKey/> 지도 서비스를 이용한다(7) Google .

Page 115: 안드로이드 응용 프로그램 개발vmlab.suwon.ac.kr/mwlee/data2/file/안드로이드2_1.pdf · 2010. 5. 24. · 2 .장 안드로이드개발환경과기본프로그래밍방법-----5

- 112 -

참고 도서참고 도서참고 도서참고 도서셰인 콘더 로런 다시 류광 번역 시작하세요 안드로이드 프로그래밍 위키 북스(1) , ( ), ! , .(2) 마크 머피 강철구 번역 알짜만 골라 배우는 안드로이드 프로그래밍 에이콘 출판사( ), (1st ed), .리토 마이어 조성만 번역 프로페셔널 안드로이드 애플리케이션 개발(3) ( ), (1st ed), JPub.김상형 안드로이드 프로그래밍 정복 한빛출판사(4) , , .현재 의 출간되었다(2)(3) 2nd edition (amazon.com).