위젯과레이아웃위젯은 View 클래스를상속해화면디스플레이와이벤트처리를할수있도록구현된스크린구성의최소단위를말한다. android.widget 패키지에는여러유형의위젯들이포함되어있다. TextView, ImageView, Button, ImageButton 등은가장간단한위젯들이

Similar documents
어댑터뷰

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

03장

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

( )부록

학습목표 선언하여디자인을하는방법을이해하고, 실행할수있다. 시작화면을만드는방법과대체리소스를사용하는방법을이해하고실행할수있다. About 과같은상자를구현하고, 테마를적용하는법을이해하고실행할수있다.

제11장 프로세스와 쓰레드

슬라이드 1

이것은리스트뷰의 setadapter 메소드에잘표현되어있습니다. setadapter 는리스트뷰에사용할데이터객체를넘겨주는메소드입니다. 일반적으로생각한다면 ArrayAdapter 객체를생성하여사용할데이터를저장할것이고데이터가저장된 ArrayAdapter 객체를 setadapt

13ÀåÃß°¡ºÐ

PowerPoint Presentation

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

01장

슬라이드 1

50_1953.pdf

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

제8장 자바 GUI 프로그래밍 II

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

슬라이드 1

gnu-lee-oop-kor-lec06-3-chap7

슬라이드 1

리니어레이아웃 - 2 -

Daum 카페

// 화면을터치하였을때해야할작업구현 case MotionEvent.ACTION_MOVE: // 화면을드래그하였때 // 화면을드래그하였을때해야할작업구현 case MotionEvent.ACTION_UP: // 화면에서터치가사라질때 // 화면에서터치가사라질때해야할자업구현 c

Microsoft PowerPoint - 04기본위젯(Ver 1.0)

PowerPoint Presentation

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint App Fundamentals[Part2].pptx

구글안드로이드프로그래밍액티비티, 인텐트수신자, 그리고서비스 안드로이드애플리케이션의구성요소에는액티비티, 인텐트수신자, 서비스, 컨텐트제공자가있다. 이번호에서는사용자인터페이스를위한액티비티와백그라운드서비스를위한인텐트수신자, 그리고서비스의라이프사이클과활용법에대해살펴보도록하자.

PowerPoint 프레젠테이션

gnu-lee-oop-kor-lec10-1-chap10

Microsoft PowerPoint - 4주차_Android_UI구현.ppt [호환 모드]

슬라이드 1

헬로, 안드로이드 13 주차 SQL 활용하기 (2) 강대기동서대학교컴퓨터정보공학부

PowerPoint Presentation

JAVA PROGRAMMING 실습 08.다형성

Microsoft PowerPoint App Fundamentals[Part1](1.0h).pptx

Microsoft PowerPoint - 04-UDP Programming.ppt

비긴쿡-자바 00앞부속

Microsoft PowerPoint - 2강

슬라이드 1

Microsoft PowerPoint - 06-Chapter09-Event.ppt

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

JMF3_심빈구.PDF

JAVA PROGRAMMING 실습 09. 예외처리

JUNIT 실습및발표

Network Programming

No Slide Title

헬로, 안드로이드 7 주차 멀티미디어 강대기동서대학교컴퓨터정보공학부

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint Presentation

안드로이드2_14

JAVA PROGRAMMING 실습 05. 객체의 활용

슬라이드 1

<4D F736F F F696E74202D20C1A63236C0E520BED6C7C3B8B428B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint App Fundamentals[Part1].pptx

Microsoft PowerPoint - ÀÚ¹Ù08Àå-1.ppt

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

TipssoftAppActivity.java // 기본소스파일 main.xml // 배치와구성에관련된리소스파일 string.xml // 프로그램에서사용할문자열에관련된리소스파일 컴파일을하고나면 r.java 라는소스파일이하나추가되는데이파일은리소스파일을소스파일에서이용할수있도

쉽게 풀어쓴 C 프로그래밍

오버라이딩 (Overriding)

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

Microsoft PowerPoint UI-Layout.Menu.pptx

신림프로그래머_클린코드.key

chap 5: Trees

PowerPoint 프레젠테이션

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

Microsoft PowerPoint - CSharp-10-예외처리

12 주차 인텐트

Spring Data JPA Many To Many 양방향 관계 예제

안드로이드애플리케이션과통합하는데는자바가편하므로대표적인두가지라이브러리를비교해보자. 자바 ID3 태그라이브러리 jaudiotagger ID3v1, ID3v1.1, Lyrics3v1, Mp3, Mp4 (Mp4 오디오, M4a 지원범위 Lyrics3v2, ID3v2.2, ID

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63139C0E520B9E8C4A120B0FCB8AEC0DA28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Spring Boot

07( ) CPLV12-35.hwp

02 C h a p t e r Java

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

C# Programming Guide - Types

Spring Boot/JDBC JdbcTemplate/CRUD 예제

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

PowerPoint 프레젠테이션

슬라이드 1

PowerPoint 프레젠테이션

슬라이드 1

PowerPoint Presentation

슬라이드 1

뷰그룹 ( 레이아웃 ) 레이아웃이름 ( 클래스이름 ) FrameLayout LinearLayout 설명단일객체를표현하기위한프레임. 왼쪽상단에하나의뷰를배치하기때문에나중 에그린객체만보여준다. 수평또는수직으로자손의뷰를배치. 뷰가들어갈만한공간이없을때는자동으로 스크롤바가나타난다

Microsoft PowerPoint - 14주차 강의자료

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

스레드의우선순위 우선순위설정메소드 : void setpriority(int newpriority) newpriority 에설정할수있는등급 : 1( 가장낮은우선순위 ) 부터 10( 가장높은우선순위 ) 가장높은우선순위 : MAX_PRIORITY, 보통우선순위 : NORM_

교육자료

Transcription:

구글안드로이드프로그래밍 GUI 설계, 위젯과레이아웃 QVGA급컬러 LCD 가대세가되어버린최근의휴대폰환경에서는 GUI 도모바일애플리케이션개발의매우중요한요소로자리잡았다. 이번달에는안드로이드플랫폼의 GUI 프레임워크를살펴보도록하자. 5 연재순서 1 회 2008. 1 애플리케이션구조분석 2 회 2008. 2 GUI 설계, 위젯과레이아웃 3 회 2008. 3 액티비티와인텐트, 그리고서비스 4 회 2008. 4 리소스와컨텐트프로바이더 5 회 2008. 5 웹인터페이스와구글맵연동 6 회 2008. 6 XMPP 기반 P2P 서비스 배준현 joonion@gmail.com 언젠가개방형휴대폰플랫폼에서자유롭게모든모바일서비스를개발할수있는날이올것이라고믿는낙관론자. 개방형모바일소프트웨어컨설팅전문기업인 ( 주 ) 케이마루를창업했다. 휴대폰에서 GUI를논하는것은그다지오랜역사를가지고있지않다. 불과몇년전까지만해도휴대폰에서는 MMI(Man Machine Interface) 라는이름의아주단순한사용자인터페이스를다루고있었다. 휴대폰의 LCD가넓어지고, QCIF급을지나 QVGA급의컬러 LCD가대중화되면서부터어느사이엔가휴대폰에서도화려한 GUI의구성이필수가되었고, 그에따라 GUI 구현을위한프레임워크가절실히필요하게되었다. 초창기에등장한자바ME는 lcdui라는저수준의 API를설계했고, 브루플랫폼역시초보적인수준의 UI 프레임워크를제공했으므로현재대부분의휴대폰제조사는자사만의독특한 UI 프레임워크를설계해독자적으로애플리케이션 UI를개발하고있다. 안드로이드플랫폼의 GUI 프레임워크는최근의이러한휴대폰 UI 발전을충분히고려한애플리케이션프레임워크를가지고있다. 적어도초창기자바의 AWT와는비슷하거나그이상의수준을유지하는다양한위젯과레이아웃을제공한다. 또한 XML 기반의 GUI 설계를가능하게함으로써 UI 설계와구현을위해과도한프로그래밍작업을배제할수있도록개발자를친절히배려하고있다. 짧은지면을통해안드로이드플랫폼의방대한위젯과레이아웃을모두다루는것은이미 SDK에포함된개발자문서와예제가 있으므로무의미한일이될것이다. 여기서는사용자인터페이스정복을위한지름길을찾아보는데초점을맞추도록하겠다. 뷰와뷰그룹안드로이드에서사용자인터페이스를이루는기본요소는뷰와뷰그룹이다. < 그림 1> 을보자. 스크린을구성하는 UI 컴포넌트들은트리형태의자료구조를가진다. 잎새노드에해당하는컴포넌트는 android.view.view 클래스를상속하는위젯으로구성되고, 위젯을포함하는상위노드들은 android.view. ViewGroup을상속하는레이아웃으로구성된다. 이것은이미기존의많은 GUI 프레임워크들이사용해오던방식이므로크게낯설지않다. ViewGroup ViewGroup View View View View View < 그림 1> 스크린의트리구조 226 m a s o

위젯과레이아웃위젯은 View 클래스를상속해화면디스플레이와이벤트처리를할수있도록구현된스크린구성의최소단위를말한다. android.widget 패키지에는여러유형의위젯들이포함되어있다. TextView, ImageView, Button, ImageButton 등은가장간단한위젯들이다. < 그림 2> 는안드로이드프레임워크에포함된모든위젯들에대한클래스다이어그램이다. 레이아웃은 Viewgroup 클래스를상속해트리구조의자식노드에해당하는뷰가자신의레이아웃내에서어떤위치에어떻게배치되는지를정의하는클래스를말한다. 레이아웃들도 android.widget 패키지에포함되어있으며 LinearLayout, RelativeLayout, TableLayout 등의다양한레이아웃들이있다. < 그림 3> 은프레임워크내의레이아웃들에대한클래스다이어그램이다. 한가지더주목할점은 < 그림 3> 에서보듯이 View Group 역시 View를상속하고있다는점이다. 다양하고복잡하게얽혀있는각각의위젯과레이아웃을어떻게자유자재로다룰수있는가에관한것이다. 이것은많은인내를요구하는시간과의싸움이될것이다. 여기서는이싸움을조금덜지루하게만들기위한간단한테스트애플리케이션을만들어보자. UI 테스트애플리케이션다음달에좀더자세히다루겠지만안드로이드애플리케이션의구성요소에는액티비티, 콘텐트수신자, 서비스, 콘텐트제공자이렇게네가지가있다. 이중액티비티는애플리케이션의사용자인터페이스를처리하기위한애플리케이션구성요소에해당한다. 즉어떤화면이 < 그림 1> 처럼트리구조의화면구성을갖고있을때, 이화면을실제로 LCD에뿌려주고이벤트를수신해해당하는위젯에전달하거나포커스를이동하는등의다양한 UI 활동을담당하는것이액티비티라고할수있다. Activity.setContentView() 는액티비티의콘텐트를 XML로구성된레이아웃리소스로부터지정해주는메소드다. 이메소드를활용해서 XML 파일을 res/layout 디렉토리에추가하기만하면, 해당 XML 레이아웃을디스플레이하는액티비티를호출할수있을것이다. 이것이지금부터만들어볼 UI 테스트애플리케이션의필요성과요구사항이다. 우선이클립스에서새로운안드로이드프로젝트를생성한다. - 프로젝트이름 : Maso02 < 그림 2> 위젯다이어그램 - 패키지이름 : com.kmaru.maso02 - 액티비티이름 : UITest - 애플리케이션이름 : UserInterfaces < 리스트 1> UITest.java package com.kmaru.maso02; import java.lang.reflect.field; < 그림 3> 레이아웃다이어그램 import android.app.listactivity; import android.content.intent; import android.os.bundle; import android.view.view; import android.widget.arrayadapter; import android.widget.listview; XML 기반 GUI 설계뷰와뷰그룹클래스, 이클래스들을상속하는위젯과레이아웃의관계에대해이해했다면마침내안드로이드 GUI 정복의첫걸음을뗀것이다. 이제남은일은 < 그림 2> 와 < 그림 3> 에서보듯이 public class UITest extends ListActivity { public void oncreate(bundle icicle) { super.oncreate(icicle); m a s o 227

5 _ GUI 설계, 위젯과레이아웃 intent.putextra( layout, layout); // R.layout 클래스의모든필드명을문자열배열로생성 Field[] fields = R.layout.class.getFields(); String[] examples = new String[fields.length]; for (int i=0; i<fields.length; i++) { examples[i] = fields[i].getname(); // 리스트뷰의어댑터지정 ArrayAdapter<String> adapter = new ArrayAdapter<String> ( this, android.r.layout.simple_list_item_1, examples); setlistadapter(adapter); protected void onlistitemclick(listview l, View v, int position, long id) { // 리스트아이템이선택되었을때새로운액티비티실행 // 이때인텐트에레이아웃의이름을넘겨준다. String layout = (String)l.obtainItem(position); Intent intent = new Intent(UITest.this, UIView.class); intent.putextra("layout", layout); startactivity(intent); super.onlistitemclick(l, v, position, id); UITest 액티비티는 ListActivity를상속하는액티비티로정의했다. 리스트액티비티는리스트뷰를포함하고있는데, setlistadapter() 메소드를통해리스트뷰에데이터를바인딩할수있다. 여기서는다음과같이자바리플렉션을통해 R.layout 클래스에속하는모든필드의이름을가져와서 ArrayList를구성한후에리스트뷰의데이터로넘겨줬다. startactivity(intent); startactivity() 메소드는새로운액티비티를실행해주는메소드다. 파라미터로앞에서생성한인텐트를넘겨주면액티비티매니저가액티비티스택에새로운액티비티를추가한다. 이때주의할점은 UIView라는이름의액티비티가 AndroidManifest. xml 파일에추가되어있어야한다는점이다. <activity class=.uiview android:label= @string/app_name > </activity> 레이아웃뷰어액티비티만들기 UIView는 < 리스트 2> 에서와같이 Activity 클래스를상속하는액티비티로정의한다. 액티비티가생성될때 oncreate() 메소드가호출될것이므로, 여기서레이아웃의값을가져온다. 레이아웃의값을가져오기위해서는이액티비티를실행시킨인텐트에서 getextra() 메소드를호출해저장된레이아웃문자열을가져오면된다. getintent() 는액티비티가수신한인텐트를가져오는메소드다. Intent intent = getintent(); String layout = (String)intent.getExtra( layout ); getlayoutvalue() 메소드는자바리플렉션을이용해서 R.layout 클래스의필드명으로해당필드의정수값을리턴받도록구현한메소드다. 이메소드를통해전달받은레이아웃리소스값을 setcontentview() 메소드의인자로넘겨주어레이아웃리소스를지정해주면된다. setcontentview(getlayoutvalue(layout)); Field[] fields = R.layout.class.getFields(); onlistitemclick() 메소드는리스트뷰의특정아이템이선택되었을때발생하는이벤트리스너다. 여기서는리스트뷰의 obtainitem() 메소드로해당레이아웃문자열을가져와서새로생성한인텐트객체에 putextra() 메소드로레이아웃문자열을추가했다. Intent intent = new Intent(UITest.this, UIView.class); < 리스트 2> UIView.java package com.kmaru.maso02; import java.lang.reflect.field; import android.app.activity; import android.content.intent; import android.os.bundle; public class UIView extends Activity { 228 m a s o

protected void oncreate(bundle icicle) { super.oncreate(icicle); // 수신된인텐트에서레이아웃의이름을가져온다. Intent intent = getintent(); String layout = (String)intent.getExtra("layout"); // 인텐트에서지정한레이아웃을콘텐트뷰로설정 setcontentview(getlayoutvalue(layout)); private int getlayoutvalue(string name) { // R.layout 클래스에서필드명을검색해값을리턴 Field[] fields = R.layout.class.getFields(); for (int i=0; i<fields.length; i++) { if (fields[i].getname().equals(name)) { try { return fields[i].getint(fields[i]); catch (Exception e) { showalert(" 알림 ", e.getmessage(), " 확인 ", false); return -1; XML 기반 GUI 에친숙해지기 이제모든준비가끝났다. 남은것은 < 그림 2> 와 < 그림 3> 에나오는모든위젯과레이아웃들을안드로이드 API 문서를참조하면서 XML 파일로하나씩만들어보는것이다. 만들어진 XML 파일을 res/layout 디렉토리에추가하기만하면 < 화면 1> 에서보듯이추가된 XML 파일을우리가만든테스트애플리케이션에서확인할수있다 ( 이것은독자여러분들의몫으로남겨둔다 ). 을열어아무기능이나실행해보면, 이런화면의 UI 기능을안드로이드의기본위젯과레이아웃만으로만들수없음을느낄수있다. 그렇다면이제커스텀뷰를생성하는법을알아보도록하자. 커스텀뷰만들기일반적으로커스텀뷰는위젯이나레이아웃을상속할수도있지만, 여기서는뷰의최상위베이스클래스인 View 클래스를상속받도록하자. public class CustomView extends View { View 클래스를상속하면생성자를오버라이딩해야한다. setfocusable() 메소드는뷰가사용자의키이벤트를수신해처리할수있도록포커스를주는메소드이다. public CustomView(Context context, AttributeSet attrs, Map inflateparams) { super(context, attrs, inflateparams); //... setfocusable(true); View 클래스를상속했으므로, 현재는자체적으로화면에아무것도디스플레이하지않는다. 화면에무엇인가를뿌려주기위해서는 ondraw() 메소드를오버라이딩해직접디스플레이에그려줘야한다. ondraw() 의파라미터로넘겨받은 Canvas 객체는그래픽스처리를위한그리기관련함수를모두포함하고있다. 여기서는안드로이드아이콘이미지를지정된좌표에뿌려주도록구현했다. protected void ondraw(canvas canvas) { super.ondraw(canvas); < 화면 1> 다양한레이아웃테스트 커스텀뷰와그래픽스비록재사용가능한다양한기본위젯과레이아웃이있다고하더라도, 커스텀컴포넌트를만들어야할일은매우많다. 특히게임을만들기위해서는직접그래픽스를제어할수있는자신만의뷰를별도로생성하는것이일반적이다. 또한지금한번휴대폰 //... icon.setbounds(left, top, right, bottom); icon.draw(canvas); 이벤트처리키이벤트의처리는 onkeydown() 이벤트를오버라이딩해구 m a s o 229

5 _ GUI 설계, 위젯과레이아웃 현하면된다. 키값은 keycode 파라미터를통해넘겨받는다. 현재는키입력이있으면아이콘의이동방향을설정할수있도록구현했다. 미지로지정해주었다. android:background= @drawable/background_01 public boolean onkeydown(int keycode, KeyEvent event) { switch (keycode) { case KeyEvent.KEYCODE_DPAD_LEFT: direction = GO_LEFT; 실행결과는 < 화면 2> 와같다. 키입력에따라안드로이드아이콘이화면안에서움직이도록구현된것을알수있다. 디스플레이가변경되었을때뷰를다시그리기위한방법은 invalidate() 메소드를호출하는것이다. invalidate() 메소드는현재뷰를무효화시키고화면에다시그리도록 draw() 를호출한다. invalidate() 는 UI 스레드내에서만호출할수있으므로다른스레드에서 UI 스레드의뷰를다시그리기위해서는 post Invalidate() 메소드를호출해주어야한다. public void run() { while (true) { switch (direction) { case GO_LEFT: if (currentx - SPEED >= 0) currentx -= SPEED; //... postinvalidate(); < 리스트 3> 은여기서구현한 CustomView 클래스의전체소스다. 이커스텀뷰를 < 리스트 4> 에서와같이 custom_view_01.xml 파일에추가하도록하자. 기본위젯과마찬가지로커스텀뷰도클래스명과같이레이아웃파라미터를사용할수있다. <com.kmaru.maso02.customview android:layout_width= fill_parent android:layout_height= fill_parent /> 여기서만든커스텀뷰는 FrameLayout의하위뷰로추가되었고, 프레임레이아웃의백그라운드이미지를 background_01 이 < 화면 2> 커스텀뷰의실행 < 리스트 3> CustomView.java package com.kmaru.maso02; import java.util.map; import android.content.context; import android.graphics.canvas; import android.graphics.drawable.drawable; import android.util.attributeset; import android.view.keyevent; import android.view.view; public class CustomView extends View implements Runnable { public static final int SPEED = 1; public static final int STOP = 0; public static final int GO_LEFT = 1; public static final int GO_RIGHT = 2; public static final int GO_UP = 3; public static final int GO_DOWN = 4; Drawable icon; private int currentx; private int currenty; private int direction; public CustomView(Context context, AttributeSet attrs, Map inflateparams) { super(context, attrs, inflateparams); icon = getresources().getdrawable(r.drawable.android_icon_small); currentx = currenty = 0; 230 m a s o

{ direction = STOP; Thread thread = new Thread(this); thread.start(); setfocusable(true); protected void ondraw(canvas canvas) { super.ondraw(canvas); int left = currentx; int top = currenty; int right = left + icon.getintrinsicwidth(); int bottom = top + icon.getintrinsicheight(); // canvas.drawcolor(color.black); icon.setbounds(left, top, right, bottom); icon.draw(canvas); public boolean onkeydown(int keycode, KeyEvent event) SPEED SPEED currentx -= SPEED; case GO_RIGHT: if (currentx + icon.getintrinsicwidth() + <= this.getwidth()) currentx += SPEED; case GO_UP: if (currenty - SPEED >= 0) currenty -= SPEED; case GO_DOWN: if (currenty + icon.getintrinsicheight() + <= this.getheight()) currenty += SPEED; try { Thread.sleep(50); catch (InterruptedException e) { e.printstacktrace(); switch (keycode) { case KeyEvent.KEYCODE_DPAD_LEFT: direction = GO_LEFT; case KeyEvent.KEYCODE_DPAD_RIGHT: direction = GO_RIGHT; case KeyEvent.KEYCODE_DPAD_UP: direction = GO_UP; case KeyEvent.KEYCODE_DPAD_DOWN: direction = GO_DOWN; case KeyEvent.KEYCODE_DPAD_CENTER: direction = STOP; return super.onkeydown(keycode, event); postinvalidate(); < 리스트 4> custom_view_01.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com /apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/background_01" > <com.kmaru.maso02.customview android:layout_width="fill_parent" android:layout_height="fill_parent" /> </FrameLayout> public void run() { while (true) { switch (direction) { case STOP: case GO_LEFT: if (currentx - SPEED >= 0) 지금까지안드로이드플랫폼의 GUI 구조에대해살펴봤다. 기존휴대폰자체의 UI 프로그래밍이나브루, 위피, 자바ME 기반의프로그래밍경험이있는독자들이라면아마안드로이드플랫폼의 GUI 구조가프로그래밍하기에매우편리하다는점에충분히감동했을것이라믿는다. m a s o 231