You are on page 1of 139

Xy dng ng dng 3D vi Android

1
______________________________________________________________________

NHN XT CA GING VIN HNG DN

............................................................................................................................. .............................................................................
................................................................................................................................................................................... .......................
............................................................................................................ ..............................................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
........................................................................................................................................... ...............................................................
................................................................................................................................................................................................. .........
.......................................................................................................................... ................................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
......................................................................................................................................................... .................................................
..........................................................................................................................................................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
....................................................................................................................................................................... ...................................
..........................................................................................................................................................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
............................................................................................................................... ...........................................................................
..................................................................................................................................................................................... .....................
.............................................................................................................. ............................................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
......................................................................................................................................... .................................................................
................................................................................................................................................................................................... .......
............................................................................................................................ ..............................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
........................................................................................................................................................... ...............................................
..........................................................................................................................................................................................................

Ngy

Thng

Nm

Ging Vin Hng Dn

(K v ghi r h tn)

Xy dng ng dng 3D vi Android


2
______________________________________________________________________

NHN XT CA GING VIN PHN BIN

............................................................................................................................. .............................................................................
................................................................................................................................................................................... .......................
............................................................................................................ ..............................................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
........................................................................................................................................... ...............................................................
................................................................................................................................................................................................. .........
.......................................................................................................................... ................................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
......................................................................................................................................................... .................................................
..........................................................................................................................................................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
....................................................................................................................................................................... ...................................
..........................................................................................................................................................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
............................................................................................................................... ...........................................................................
..................................................................................................................................................................................... .....................
.............................................................................................................. ............................................................................................
............................................................................................................................. .............................................................................
.......................................................................................................... ................................................................................................
............................................................................................................................................. .............................................................
................................................................................................................................................................................................... .......
............................................................................................................................ ..............................................................................
............................................................................................................................. .............................................................................
............................................................................................................................. .............................................................................
........................................................................................................................................................... ...............................................
..........................................................................................................................................................................................................

Ngy

Thng

Nm

Ging Vin Phn Bin

(K v ghi r h tn)

Xy dng ng dng 3D vi Android


3
______________________________________________________________________

LI CM N

Chng em xin chn thnh cm n cc thy c trong khoa Cng Ngh Thng Tin
cng ton th cc thy c trng i Hc S Phm K Thut Tp.HCM truyn t
cho chng em nhng kin thc qu gi trong sut nhng nm hc va qua.
Chng em xin chn thnh cm n Thy Nguyn Minh o tn tnh hng dn,
ch bo chng em trong sut qu trnh thc hin ti.
Cui cng ti xin cm n cc bn trong khoa Cng Ngh Thng Tin, nhng ngi
gip , chia s kin thc, ti liu... trong sut qu trnh thc hin nghin cu ti.
Trong phm vi kh nng cho php, chng em rt c gng hon thnh ti
mt cch tt nht. Song, chc chn s khng trnh khi nhng thiu st. Chng em
knh mong nhn c s cm thng v nhng kin ng gp ca qu thy c v cc
bn.

Nhm sinh vin thc hin


Nguyn Ch Tm
Nguyn Phi Cng
06/ 2011

Xy dng ng dng 3D vi Android


4
______________________________________________________________________
MC LC

M u ....................................................................................................................... 10
PHN A: XY DNG NG DNG 3D VI ANDROID _____________________ 12
Chng 1: Tng quan v ng dng trn android ____________________________ 12
1.1

Lc s v Android:....................................................................................... 12

1.2

Nn tng Android: .......................................................................................... 13

1.3

Kin trc ng dng Android: ........................................................................ 15

1.3.1 My o Dalvik: ............................................................................................. 15


1.3.2 Cc thnh phn ca mt ng dng Android: ............................................. 16
1.4 Vng i ca ng dng Android:...................................................................... 17
1.5

Cc cng c to mt ng dng Android: ................................................ 18

1.5.1 Eclipse IDE:................................................................................................... 18


1.5.2 Android SDK: ................................................................................................ 18
1.5.3 Ci t cng c: ............................................................................................. 19
1.6 Thit b Android o (Android Virtual Device - AVD): ................................... 20
1.7 Android project: ................................................................................................. 22
1.7.1 To mt Android project mi:....................................................................... 22
1.7.2 Cu trc mt project:..................................................................................... 24
Chng 2: Cc thnh phn c bn ca mt ng dng trn Android ____________ 25
2.1

Hot ng(Activity): ....................................................................................... 25

2.1.1 To mt Activity:............................................................................................ 25
2.1.2 Vng i ca Activity: .................................................................................. 27

Xy dng ng dng 3D vi Android


5
______________________________________________________________________
2.1.3 Khi ng mt Activity: ............................................................................... 28
2.1.4 Lin lc gia 2 activity: ................................................................................ 28
2.2

Trnh thu pht (BroadcastReceiver): ........................................................... 29

2.2.1 Chu k sng: .................................................................................................. 29


2.2.2 Mt s broadcast thng dng: ...................................................................... 30
2.2.3 Hm onReceive(): ......................................................................................... 30
2.3

Dch v (Service):............................................................................................ 31

2.3.1 To ra mt Service: ....................................................................................... 31


2.3.2 Vng i ca Services: ................................................................................. 33
2.3.3 Kt ni dch v: .............................................................................................. 34
2.4

Trnh cung cp ni dung (Content Providers): ........................................... 37

2.4.1 Gii thiu: ...................................................................................................... 37


2.4.2 To mt Content Provider mi: ................................................................... 37
2.4.3 Truy vn, thm, cp nht v xa ni dung trong Content Provide: .......... 42
2.4.4 Native Android Content Provider: ............................................................... 46
Chng 3: Thit k giao din ____________________________________________ 49
3.1 Mt s lp h tr thit k giao din cho ng dng Android: ......................... 49
3.2 Android Widget Toolbox: .................................................................................. 49
3.3 Cc kiu Layout: ................................................................................................. 50
3.4 To cc View: ...................................................................................................... 53
3.4.1 Chnh sa cc View c sn: .......................................................................... 53
3.4.2 To cc iu khin ghp (compound control): ............................................ 54
3.4.3 To cc Control ty chnh: ........................................................................... 56
3.5 To giao din Activity vi cc View: ................................................................. 57

Xy dng ng dng 3D vi Android


6
______________________________________________________________________
3.6 Menu: ................................................................................................................... 58
3.6.1 Menu trong Android: .................................................................................... 58
3.6.2 Cc kiu Menu Item ...................................................................................... 60
3.6.3 To mt Menu: .............................................................................................. 61
Chng 4: X l bt ng b ____________________________________________ 63
4.1 Thread: ............................................................................................................... 63
4.2

Handler: ........................................................................................................... 64

4.3

AlarmManager (bo hiu): ............................................................................ 66

4.4

Notification (thng bo): ................................................................................ 67

Chng 5: p dng OpenGL ES to ng dng 3D trn Androi _____________ 70


5.1 Gii thiu v OpenGL ES: ................................................................................. 70
5.3 Php chiu trc giao (Orthographic Projection): ............................................ 71
5.4 Php chiu phi cnh (Perspective Projection ): ............................................. 75
5.5 Php bin i (Transformations): ..................................................................... 80
Hnh 19 Kt qu php bin i ............................................................................. 84
5.6 Chiu su (Depth): .............................................................................................. 84
5.7 Mu sc v t bng (Color and Shading): ........................................................ 87
5.8 Hnh khi (Solid Shapes): .................................................................................. 89
5.9 B lc mt sau (Backface Culling): ................................................................... 92
5.10 nh sng (Lighting):......................................................................................... 92
5.11 nh hng nh sng (Directional Lighting): ................................................ 97
5.12 Dn cht liu (Texture Mapping): ................................................................ 101

Xy dng ng dng 3D vi Android


7
______________________________________________________________________
5.13 Hm cht liu (Texture Functions): .............................................................. 108
5.14 Pha trn mu (Blending): .............................................................................. 113
5.15 Minh bch i tng (Transparency): ......................................................... 120
PHN B: CHNG TRNH DEMO ____________________________________ 126
Chng 6: Demo k thut v hnh 3D trn Android ________________________ 126
6.1 Gii thiu chng trnh: .................................................................................. 126
6.2 Cc chc nng: .................................................................................................. 126
6.2.1 Menu: ........................................................................................................... 126
6.2.2 Hnh nh mt s chc nng trong chng trnh: ..................................... 132
PHN C: KT LUN _________________________________________________ 137
PH LC ___________________________________________________________ 138
TI LIU THAM KHO ______________________________________________ 139

Xy dng ng dng 3D vi Android


8
______________________________________________________________________
DANH MC HNH
Hnh 1 Cu trc Android ________________________________________________ 15
Hnh 2 My o Dalvik __________________________________________________ 16
Hnh 3 To mt AVD __________________________________________________ 21
Hnh 4 Trnh m phng thit b Android. ___________________________________ 22
Hnh 5 To mt Android project __________________________________________ 23
Hnh 6 Vng i ca Activity ____________________________________________ 27
Hnh 7 Vng i ca service _____________________________________________ 33
Hnh 8 Hot ng kt ni dch v _________________________________________ 36
Hnh 9 - Quan h gia cc thnh phn trn ___________________________________ 49
Hnh 10 - H thng cc view vi cc thng s layout c kt ni vi mi view _____ 51
Hnh 11 Icon menu ____________________________________________________ 58
Hnh 12 Expanded menu ________________________________________________ 59
Hnh 13 - Submenu _____________________________________________________ 59
Hnh 14 - Php chiu trc giao ____________________________________________ 72
Hnh 15 Kt qu php chiu trc giao _____________________________________ 75
Hnh 16 - Php chiu phi cnh ___________________________________________ 76
Hnh 17 M t gc nhn ca camera _______________________________________ 78
Hnh 18 Kt qu php chiu phi cnh _____________________________________ 79
Hnh 19 Kt qu php bin i ___________________________________________ 84
Hnh 20 Kt qu chiu su ______________________________________________ 87
Hnh 21 Kt qu mu sc v t bng ______________________________________ 89
Hnh 22 Kt qu hnh khi ______________________________________________ 92
Hnh 23 Kt qu nh sng _______________________________________________ 97
Hnh 24 Kt qu nh hng nh sng ____________________________________ 101
Hnh 25 Kt qu dn cht liu ___________________________________________ 113

Xy dng ng dng 3D vi Android


9
______________________________________________________________________
Hnh 26 Pha mu (GL_ONE, GL_ZERO) _________________________________ 117
Hnh 27 Pha mu (GL_ONE, GL_ONE) __________________________________ 118
Hnh 28 Pha mu (GL_ONE, GL_ONE_MINUS_DST_ALPHA) ______________ 119
Hnh 29 Pha mu (GL_SRC_ALPHA, GL_ONE) ___________________________ 119
Hnh 30 Pha mu (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) _______ 120
Hnh 31 Hiu ng sng m ____________________________________________ 125
Hnh 32 - Menu chnh __________________________________________________ 130
Hnh 33 - Menu More __________________________________________________ 130
Hnh 34 - Menu v hnh _________________________________________________ 131
Hnh 35 - Menu pha mu ________________________________________________ 131
Hnh 36 - Menu php bin i ____________________________________________ 132
Hnh 37 - Menu php chiu ______________________________________________ 132
Hnh 38 Kt hp cc php bin i _______________________________________ 133
Hnh 39 Demo chiu su _______________________________________________ 133
Hnh 40 Demo v mt tr _______________________________________________ 134
Hnh 41 Demo v mt nn _____________________________________________ 134
Hnh 41 Demo v mt nn ct __________________________________________ 135
Hnh 42 Demo v mt cu______________________________________________ 135
Hnh 43 M phng ng hm 3D _______________________________________ 136

Xy dng ng dng 3D vi Android


10
______________________________________________________________________

M u

Hin nay ngnh cng nghip phn mm ang rt pht trin v ngnh cng nghip
phn mm trn in thoi di ng cng khng nm ngoi xu th . Tuy cn nhiu hn
ch trong phn cng ca in thoi di ng nhng n th hin c sc mnh ca
mnh trong rt nhiu cc lnh vc khc nhau nh gii tr, cc tin ch, thanh ton in
t v.v Ngnh cng ngh phn mm di ng vn cn kh non tr Vit Nam v vy
vic nghin cu v pht trin cc ng dng trn di ng l rt cn thit.
Cc h iu hnh nh Window Mobile, Symbian phn no cng gy t nhiu
kh khn cho nhng ai c nh xy dng cc ng dng trn n. i vi Window
Mobile l mt cng ngh ca Microsoft v hon ton ng i vi ngi dng, nh
pht trin ng dng ch da hon ton vo cng ngh m Microsoft cung cp, cn
Symbian th vic cu hnh c th lp trnh trn n cng v vn kh khn, c bit l
n s dng ngn ng C/C++ lm nn tng lp trnh r rng l khng thun tin
trong vic pht trin ng dng.
Xut pht t nhu cu thc t , Google mnh dn nghin cu v a ra mt
nn tng h iu hnh mi, chnh l Android. Mt nn tng h iu hnh m ngun
m hon ton v da vo mt ngn ng lp trnh rt mnh l Java pht trin ng
dng. Chnh v Android h tr Java ngay t trong nn tng ca n, nn vic vit ng
dng, ngay c s dng cc chc nng ca phn cng l hon ton d dng thng qua
vic s dng b cng c h tr lp trnh c cung cp hon ton min ph, l Android
SDK.
Nhm thc hin nhn thy nhu cu ca con ngi trong lnh vc gii tr trn di
ng ngy cng cao v Android chnh l nn tng ng dng c th pht trin trong
tng lai. Chnh v vy nhm thc hin chn ti Xy dng ng dng 3D vi

Xy dng ng dng 3D vi Android


11
______________________________________________________________________
Android nhm hiu r v cc k thut lp trnh trn thit b ng, c bit l cc k
thut xy dng ha 3D trn di ng c th to nn mt game 3D hon chnh.
Nhng v thi gian, cng nh nng lc ca nhm c hn, cho nn ch gii hn
vic tm hiu cch thc hot ng, nghin cu c bn cc chc nng, s dng b cng
c Android SDK v mt s hm chc nng ca OpenGL ES v mt s hnh nh 3D
c bn mc ch nghim thu qu trnh tm hiu.
ti bao gm:
Phn A: Xy dng ng dng 3D vi Android
Chng 1: Tng quan v ng dng trn Android
Chng 2: Cc thnh phn c bn ca mt ng dng trn Android
Chng 3: Thit k giao din
Chng 4: X l bt ng b
Chng 5: p dng OpenGL ES to ng dng 3D trn Androi
Phn B: Chng trnh Demo
Chng 6: Demo k thut v hnh 3D trn Android
Phn C: Kt lun
Ti liu tham kho

Xy dng ng dng 3D vi Android


12
______________________________________________________________________
PHN A: XY DNG NG DNG 3D VI ANDROID

Chng 1: Tng quan v ng dng trn android

1.1 Lc s v Android:
Android c pht hnh phin bn u tin 11/11/2007, l mt mi trng h
iu hnh hon chnh da trn h iu hnh nhn Linux V2.6. Lc u, ch trin khai
i vi Android l lnh vc in thoi di ng, gm cc loi in thoi thng minh v
cc loi thit b in thoi kiu gp chi ph thp. Tuy nhin, phm vi y cc dch
v in ton ca Android v s h tr chc nng phong ph ca n c tim nng m
rng ra ngoi th trng in thoi di ng. Android cn c th hu ch i vi cc nn
tng v ng dng khc.
Nn Android l sn phm ca Open Handset Alliance (Lin minh thit b cm
tay m), mt tp on cc t chc cng hp tc vi nhau xy dng nn mt loi
in thoi di ng tt hn. Tp on do Google ng u ny gm cc nh vn hnh
(in thoi) di ng, cc nh sn xut thit b cm tay, sn xut linh kin, cc nh cung
cp nn v gii php phn mm v cc cng ty tip th. T mt quan im pht trin
phn mm, Android tr thnh trung tm ca th gii m ngun m v rt c tim nng
pht trin.
Thit b cm tay c kh nng Android u tin trn th trng l thit b G1 do
HTC sn xut v c bn trn T-Mobile. N tr nn sn c sau gn mt nm n i,
khi m cc cng c pht trin phn mm sn c duy nht ch l mt s bn pht hnh
B cng c pht trin phn mm (SDK) c ci tin dn tng bc. Khi ngy pht
hnh G1 gn n, nhm Android pht hnh SDK V1.0 v cc ng dng bt u
vt ln nhm hng ti nn tng mi ny.
kch thch i mi v pht trin cc ng dng ca Android, Google ti tr
hai vng cuc thi Cc thch thc nh pht trin Android, v hng triu la c

Xy dng ng dng 3D vi Android


13
______________________________________________________________________
vo cc ng dng d thi hng u. Vi thng sau G1, Android Market c pht
hnh, cho php ngi s dng duyt v ti v cc ng dng trc tip vo in thoi ca
h. Trong vng 18 thng, mt nn di ng mi chnh thc c mt trn th trng v
s l i th cnh tranh nng k ca cc nn di ng ph bin trc nh Symbian
hay Window Mobile.
Android cung cp kh y cc cng c c bn v c thit k sao cho cc
nh pht trin c th tn dng ti a li th ca thit b cm tay xy dng nn cc
ng dng thc s thuyt phc. H c th to mt ng dng c th gi thc hin cc
chc nng li trong in thoi nh thc hin cuc gi, gi tin nhn SMS, dng camera
hay chia s thng tin c nhn ln trang web chn hn nh thng tin lin lc, v tr
a l, lch biu Cc nh pht trin cn c th lm bt c vic g trn thit b Android
bi v h thng Android giao tip thng qua cc Intents n n gin l mt chui m
t mt hnh ng no v d: android.provider.Telephony.SMS_RECEIVED.
Android cn cung cp sn cc dch v nh v (v y l mt th mnh ca Google)
cng vi mt tp cc ng dng v Map vi cc tnh nng rt n tng nh d ng,
tnh khong cch a im, tm bn Ngoi ra cn c mt s tnh nng ni bt

khc nh Animation v ng thi cng h tr media-playback.


Android dn hon thin qua cc phin bn, m phin bn mi nht hin nay
l Android 3.1.

1.2 Nn tng Android:


Vi kh nng rng ri ca Android, s rt d dng nhm ln n vi mt h iu
hnh my tnh bn. Android l mt mi trng phn tng, xy dng trn nn ca h
iu hnh nhn Linux, v n bao hm nhiu chc nng phong ph. H thng giao din
ngi s dng gm c:
Ca s
Khung hnh

Xy dng ng dng 3D vi Android


14
______________________________________________________________________
Cc tiu trnh hin th cc phn t ph bin nh cc hp bin son,
danh sch, danh sch th xung.
Android gm mt trnh duyt c th nhng vo c, c xy dng da trn
WebKit, chnh l my (engine) trnh duyt m ngun m cng ang l ng c ca
trnh duyt Safari ca iPhone.
Android khoe ra mt mng di do nhiu ty chn kt ni, gm WiFi, Bluetooth
v d liu khng dy qua mt kt ni di ng (nh GPRS, EDGE v 3G). Mt k thut
ph bin trong cc ng dng Android l lin kt ti Google Maps hin th mt a
ch trc tip trong mt ng dng. Vic h tr cho cc dch v da trn a im (chng
hn nh GPS) v cc dng c o gia tc cng c sn trong gi phn mm Android,
mc d khng phi tt c cc thit b Android c trang b vi cc phn cng cn
thit. Ngoi ra cn c c h tr my nh na (camera).
V mt lch s, c hai lnh vc m cc ng dng di ng gng sc theo kp
cc i tc my tnh bn l ha/a phng tin v phng thc lu tr d liu.
Android gii quyt thch thc v ha bng s h tr dng sn cho ha 2D v 3D,
gm c th vin OpenGL. Gnh nng lu tr d liu c gim nh v nn Android c
gm c c s d liu SQLite m ngun m ph bin. Hnh 1 cho thy mt khung hnh
n gin ha v cc tng phn mm Android.

Xy dng ng dng 3D vi Android


15
______________________________________________________________________

Hnh 1 Cu trc Android

1.3 Kin trc ng dng Android:


1.3.1 My o Dalvik:
Cc ng dng Android c vit bng ngn ng lp trnh Java v chng chy
trong mt my o (VM). iu quan trng phi lu rng VM khng phi l mt my
o Java m l my o Dalvik (Dalvik Virtual Machine), mt cng ngh m ngun m.
Chic my o ny da trn vic ng k (register-based) v c thit k bi Dan
Bornstein v mt vi k s ca Google. Thut ng register-based ni ln s khc
bit gia my o Android vi my o JAVA thng thng. Tng t nh my o
JAVA, y cng ch l mt my o thng dch, nhng thng dch cc file c nh dng
.dex (Dalvik Execute) mt nh dng gip ti u b nh v kh nng lu tr ca my
o Cc my o JAVA ngy nay ch yu da trn ngn xp (Stack-based), vi tnh

Xy dng ng dng 3D vi Android


16
______________________________________________________________________
cht ny cho php rt ngn thi gian thc thi chng trnh. Mi ng dng Android
chy trong mt c th ca my o Dalvik, khi n lt, c th my o ny nm trong
mt tin trnh do nhn Linux qun l, nh trnh by di y.

Hnh 2 My o Dalvik

1.3.2 Cc thnh phn ca mt ng dng Android:


Mt ng dng Android gm 4 thnh phn chnh sau:
Hot ng (Activity): mt ng dng c mt giao din ngi dng nhn
thy c, s c thc hin bng mt Activity. Activity dng Views
to nn giao din ha ngi dng, hin th thng tin v p li cc
hnh ng ca ngi dng. Khi ngi dng chn mt ng dng t mn
hnh ch hoc trnh khi chy ng dng th mt Activity c khi ng.
Activity trong Android cng tng t nh mt Form trong cc ng dng
desktop truyn thng.

Xy dng ng dng 3D vi Android


17
______________________________________________________________________
Dch v (Services): cc service lm vic n di ng dng, c s dng
thc hin cc x l thng thng khi cn v thm ch ngay c lc cc
Activity khng hot ng hoc n i.Mt dch v nn c s dng i
vi bt k ng dng no cn tn ti trong mt thi gian di, chng hn
nh mt trnh gim st mng hoc ng dng kim tra cp nht.
Trnh cung cp ni dung (Content Providers): c th coi nh l mt my
ch c s d liu. Cng vic ca n l qun l truy cp v chia s d liu
ang tn ti, chng hn nh mt c s d liu SQLite. N c th c
cu hnh cho php cc ng dng khc truy xut v ngc li. Nu ng
dng rt n gin th khng nht thit phi to ra mt trnh cung cp ni
dung.
Trnh thu pht (Broadcast Receivers): bng cch to v ng k mt
Broadcast Receiver, ng dng Android c th lng nghe ton b cc
Intent theo mt chun c th c ch nh. Cc Broadcast Receiver s
chy ng dng mt cch t ng p ng mt Intent gi n, hay x
l mt phn t d liu hoc p ng mt s kin, chng hn nh nhn
mt vn bn thng bo.
Vic tch ri s ph thuc gia cc thnh phn trong ng dng gip vic chia s
cng nh trao i gia cc ng dng khc tr nn d dng hn.
1.4 Vng i ca ng dng Android:
Khng ging nh cc ng dng trn cc nn tng khc, cc ng dng Android
khng c mt iu khin n vng i ca chng. Thay vo , cc thnh phn ng
dng phi lng nghe vic thay i trng thi bn trong ca ng dng v tc ng
tr li mt cch hp l. Mi mt ng dng Android trong chnh tin trnh ca n,
chy mt th hin ring bit ca Dalvik. Vic qun l b nh v tin trnh ca mi ng
dng Android c iu khin mt cch ring trong lc runtime.

Xy dng ng dng 3D vi Android


18
______________________________________________________________________
Android qun l ti nguyn mt cch cht ch, n s lm bt c vic g m
bo cho thit b duy tr p ng. iu ny c ngha l cc tin trnh s b hy i m
khng c mt cnh bo no nu cn gii phng ti nguyn cho cc ng dng c u
tin cao.
1.5 Cc cng c to mt ng dng Android:
bt u pht trin cc ng dng Android, chng ta cn c B cng c pht
trin phn mm Android (SDK) v mi trng pht trin tch hp Eclipse (Eclipse
IDE). Vic pht trin Android c th din ra trn Microsoft Window, Mac OS X hoc
Linux. Trong tiu lun ny, nhm thc hin s pht trin ng dng Android bng
Microsoft Window.

1.5.1 Eclipse IDE:


Cc ng dng Android c vit bng ngn ng Java, nhng bin dch v thi
hnh bng my o Dalvik. Vit m bng ngn ng Java trong Eclipse l rt trc quan.
Eclipse cung cp mt mi trng Java phong ph, gm c vic tr gip theo ng cnh
v cc mch nc gi v m. Khi b m Java c bin dch thnh cng, Android
Developer Tools s m bo rng ng dng c ng gi mt cch ng n, gm
c tp tin AndroidManifest.xml.

1.5.2 Android SDK:


B cng c pht trin ng dng Android SDK l cng c gi lp thit b o trn
my tnh pht trin ng dng vi cc hm API h tr cho nhng lp trnh vin lp
trnh trn cc thit b di ng s dng nn tng Android thng qua ngn ng lp trnh
Java. SDK gm c:

Xy dng ng dng 3D vi Android


19
______________________________________________________________________
android.jar : tp tin lu tr Java cha ton b cc lp SDK Android cn
thit xy dng ng dng.
documention.html v th mc docs: ti liu SDK c cung cp ti ch
v trn web, ch yu n dng JavaDocs, to iu kin d dng cho vic
hng dn trong nhiu gi SDK. Ti liu cng gm c hng dn pht
trin mc cao v cc lin kt n cng ng Android rng ri.
Th mc sample (cc v d mu): th mc con samples cha b m ngun
y dng cho mt lot cc ng dng, gm c ApiDemo, n s dng
nhiu API. ng dng mu l mt ni khm ph tuyt vi khi bt u pht
trin ng dng Android.
Th mc tools (cc cng c): cha ton b cc cng c dng lnh xy
dng nn cc ng dng Android. Cng c c dng ph bin v hu ch
nht l tin ch adb (Android Debug Bridge).
Usb_driver: th mc cha cc trnh iu khin cn thit kt ni mi
trng pht trin vi mt thit b c kh nng chy Android, chng hn
nh G1 hay in thoi c pht trin Android Dev 1. Cc tp tin ny l
i hi duy nht i vi cc nh pht trin ang s dng nn Windows.
1.5.3 Ci t cng c:
Chun b:
o Phn mm Eclipse IDE (phin bn 3.2 tr ln), c th ti trc tip
t trang web http://www.eclipse.org/downloads/
o B cng c Android SDK phin bn mi nht, ti thi im thc
hin tiu lun ny l phin bn r11, c th ti t trang web
http://developer.android.com/sdk/index.html

Xy dng ng dng 3D vi Android


20
______________________________________________________________________
Bt u vic ci t:
o Gii nn chng trnh Eclipse vo mt th mc no (v d:
D:\eclipse\)
o Gii nn b Android SDK vo mt th mc bt k (v d:
D:\Android_SDK_r11\)
o Chy chng trnh Eclipse.
o Vo menu Help Software Updates
o Chn tab Available Software
o Chn Add Site, nhp vo ng dn sau:
http://dl-ssl.google.com/android/eclipse/
o Chn OK.
o Ch cho chng trnh c ci t.
o Sau khi ci xong, tip tc vo menu Window Preferences
o Chn tab Android, ch ng dn n th mc gii nn
Android SDK trn ( y l D:\Android_SDK_r11\).
o Hon tt.
Lu : Cch ci t trn i hi my tnh phi c ni mng Internet.
1.6 Thit b Android o (Android Virtual Device - AVD):
Cc ng dng Android c th c chy trn mt thit b tht s hoc trn trnh
m phng Android (Android Emulator) km vi SDK Android.
T phin bn SDK 1.5, Google gii thiu khi nim v thit b Android o.
Mt thit b Android o ch n gin l mt tp cc thuc tnh cu hnh c p dng
cho hnh nh ca mt thit b m phng hin th ng dng ln n.
Cch to mt thit b Android o nh sau:
- Trong Eclipse window Android SDK and AVD manager.

Xy dng ng dng 3D vi Android


21
______________________________________________________________________
- ca s mi hin ra, chn mc Virtual devices bm nt New, hin ra mt
ca s mi nh hnh sau y:

Hnh 3 To mt AVD
- Mc Name: t tn cho thit b, tn g cng c, ct l d nh v phn
bit, khng cha khon trng v cc k t c bit.
- Mc Target: chn phin bn h iu hnh Android.
- Mc SD Card: in kch thc b nh ca thit b hoc ly mt file SD Card
c sn.
- Nhn nt Create AVD.

Xy dng ng dng 3D vi Android


22
______________________________________________________________________

Hnh 4 Trnh m phng thit b Android.


1.7 Android project:
1.7.1 To mt Android project mi:
- Trong Eclipse, chn File New Android Project.
- Mt ca s mi hin ra, in cc thng tin tng ng vo ca s.
- Project name: tn project.
- Chn phin bn Android.
- Application name: tn ng dng.

Xy dng ng dng 3D vi Android


23
______________________________________________________________________
- Package name: tn gi.
- Create activity: tn hot ng.
- Min SDK Version: API Level tng ng vi phin bn Android.
- Nhn nt Finish.

Hnh 5 To mt Android project

Xy dng ng dng 3D vi Android


24
______________________________________________________________________
1.7.2 Cu trc mt project:
Mt Android project gm cc th mc sau:

Th mc src cha source code ng dng. Gm cc package v cc class.

Th mc gen cha cc file t ng pht sinh (m thng gp nht l


R.class).

Th mc res cha cc resource dng trong ng dng (thng qua ID).

Th mc assets cha cc resource file m ng dng cn dng (di dng


file).

File Manifest l file khai bo thng tin v ng vi h thng (nh ng


dng gm nhng mn hnh no, c service no xin cc quyn g, phin
bn bao nhiu, dng t SDK phin bn no).

File th vin.

Xy dng ng dng 3D vi Android


25
______________________________________________________________________

Chng 2: Cc thnh phn c bn ca mt ng dng trn Android

2.1 Hot ng(Activity):


Mi mt Activity i din cho mt mn hnh. Cc ng dng phc tp c th c
nhiu hn mt Activity. Cn to mt Activity cho mi mn hnh cn hin th. C th l
t nht mt mn hnh chnh iu khin cc chc nng ca ng dng, cc activity khc
nhm mc ch nhp thng tin, cung cp cc khung nhn khc nhau trn d liu hoc
h tr cc chc nng khc.
Hu ht cc Activity c thit k chim gi ton b mn hnh, tuy nhin c
th to cc Activity c mt na trong sut, cc Activity ni, hoc cc dialog.

2.1.1 To mt Activity:
to mt Activity mi, cn tha k t lp Activity, s dng cc View cung
cp cc tng tc vi ngi dng, khai bo cc thnh phn giao din v thc thi cc
chc nng ca ng dng.

package com.paad.myapplication;
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
}

Xy dng ng dng 3D vi Android


26
______________________________________________________________________
Mt lp Activity c bn a ra mt mn hnh rng cha ca s hin th. V vy
vic cn thc hin u tin l khai bo b cc cho n bng cch s dng cc View v
layout. Activity UI c to thnh bi cc View. View l cc iu khin giao din
ngi dng, hin th d liu v cung cp tng tc n ngi dng.
gn mt giao din cho mt Activity, s dng phng thc setContentView
trong lp Activity c k tha.
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
MyView myView = new MyView(this);
setContentView(myView);
}
C 2 cch thit lp giao din cho Activity: bng code hoc thng qua file nh
ngha layout . trn l cch to giao din bng code, sau y l cch to giao din
ngi thng qua layout, truyn tham s vo cho phng thc setContentView l mt
resource ID
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
dng mt Activity cn khai bo bn trong file manifest. Thm vo mt th
activity mi bn trong nt application. Th activity ny bao gm cc thuc tnh cho
siu d liu (label, icon,). Mt Activity m khng c khai bo mt th activity
tng ng s khng c khi chy.

Xy dng ng dng 3D vi Android


27
______________________________________________________________________
V d sau m t cch lm th no khai bo Activity c to phn trn:
<activity android:label=@string/app_name
android:name=.MyActivity>
<intent-filter>
<action android:name=android.intent.action.MAIN />
<category android:name=android.intent.category.LAUNCHER />
</intent-filter>
</activity>
2.1.2 Vng i ca Activity:

Hnh 6 Vng i ca Activity

Xy dng ng dng 3D vi Android


28
______________________________________________________________________
2.1.3 Khi ng mt Activity:
khi ng mt Activity, chng ta dng Intent:
o Khai bo tng minh: cung cp chnh xc thng tin ca activity cn gi
(nu cng ng dng ch cn cung cp tn class, nu ng dng khc nhau
th cung cp tn package, tn class). V d: on code bn di s khi
ng activity tn l TargetActivity.

Intent intent = new Intent(getApplicationContext(),TargetActivity.class);


startActivity(intent);
o Khai bo khng tng minh: cung cp thao tc cn lm g, vi loi d
liu no, thao tc thuc nhm no h thng s tm activity tng ng
khi ng. V d: on code bn di s khi ng mt activity no
ng c kh nng xem nh.

Intent intent = new Intent(Intent.ACTION_VIEW);


intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivity(intent);
Vi cch khi ng activity khng tng minh, chng ta cn phi bit mt cht
v Intent-filter. Intent-filter s gip mt activity ng k vi h thng mnh c th lm
c thao tc g, trong nhm no, vi loi d liu no. Nh vy khi intent v intentfilter khp nhau, activity s c h thng khi ng.
2.1.4 Lin lc gia 2 activity:
C th khi ng mt activity vi mt yu cu no v activity kia khi lm
xong cng vic s tr li kt qu cho activity trc. V d activity A yu cu mt

Xy dng ng dng 3D vi Android


29
______________________________________________________________________
activity lm gip vic chp nh, activity B p ng c vic ny, sau khi user chp
nh xong s tr li file nh cho activity A. lin lc 2 activity chng ta lm nhu sau:
Khi khi ng mt activity, ta c th gi km d liu trong intent nh v
d sau:
intent.putExtra("value1", new String("Hello"));
intent.putExtra(value2", new Long(100));
Bn pha activity c khi ng, c th ly d liu c gi nh sau:
getIntent().getExtras().getString("value1");
getIntent().getExtras().getLong("value2");

2.2 Trnh thu pht (BroadcastReceiver):


BroadcastReceiver l mt trong bn loi thnh phn trong ng dng Android.
Chc nng ca n l dng nhn cc s kin m cc ng dng hoc h thng pht i.
C 2 cch pht-nhn l:
Khng c th t: receiver no iu kin th nhn ht, khng phn
bit v chng tch ri nhau.
C th t: receiver no ng k u tin hn th nhn trc, v c th
truyn thm thng tin x l cho cc receiver sau.
2.2.1 Chu k sng:
BroadcastReceiver ch c duy nht mt phng thc onReceive().
Khi c s kin m BroadcastReceiver ng k nhn c pht i, th
phng thc onReceive() ca BroadcastReceiver s c gi.
Sau khi thc thi xong phng thc ny, vng i ca BroadcastReceiver
kt thc.

Xy dng ng dng 3D vi Android


30
______________________________________________________________________
Lu khi s dng: Ngay khi onReceive() kt thc, h thng coi nh receiver
khng cn hot ng v c th gii phng tin trnh cha receiver ny bt c lc
no.
Trnh x l cc code qu lu trong onReceive().
Khng c x l bt ng b, ch callback trong Receiver (c th nh
hin th Dialog, kt ni service)
2.2.2 Mt s broadcast thng dng:
o Bo h thng khi ng xong.
o Bo pin c s thay i.
o Bo c package mi ci vo hoc xa i.
o Bo tt my.
o Bo cm sc, rt sc.
o Thng bo tin nhn ti.
o Thng bo cm, rt th nh.
o Thng bo c cuc gi i.
o Broadcast do ngi pht trin ng dng t nh ngha (gip lin lc hoc
thng bo mt s kin gia cc ng dng).

2.2.3 Hm onReceive():
Phng thc ny c gi khi c s kin tng ng c pht i. trong
phng thc ny, ta truyn vo context (ng cnh) v intent (ni nhn).
o context: v lp Receiver khng k tha t lp Context nn cn truyn
context m receiver ny ang chy vo. Th nht l c th x l cc
phng thc yu cu truyn thm Context, th hai l s dng cc
phng thc ca lp Context.

Xy dng ng dng 3D vi Android


31
______________________________________________________________________
o intent: intent c truyn vo s c y thng tin nh s kin no m
receiver ny ng k xy ra dn n onReceive() c gi, c gi
km thng tin g hoc d liu g hay khng. Xem cc api:
Intent.getAction();
Intent.getExtra(String dataName);

2.3 Dch v (Service):


Service l mt trong 4 loi thnh phn ca mt ng dng Android. Service chy
nn v khng tng tc trc tip vi ngi dng. S dng Service :
Dng trong cc ng dng nghe nhc.
Dng x l cc thao tc mt thi gian v khng nht thit phi hin th
ln activity (download, upload).
i khi cn mt ng dng vn hnh lin tc x l nhng vic mong
mun m khng lm phin ngi dng.
Lm nhng thao tc tnh ton, x l u n no v kt qu khi no
ngi dng cn th mi xem.
2.3.1 To ra mt Service:
to ra mt Service, ta to ra mt class mi k tha lp Service v override
cc phng thc onStart(),onCreate() v onBind().

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {

@Override

Xy dng ng dng 3D vi Android


32
______________________________________________________________________
public void onStart(Intent intent, int startId) {
// TODO: Actions to perform when service is started.
}

@Override
public void onCreate() {
// TODO: Actions to perform when service is created.
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Replace with service binding implementation.
return null;
}
}
bt u mt Service, s dng phng thc startService. Nu Service yu cu
quyn truy cp khng tn ti trong ng dng th mt ngoi l SecurityException s
c a ra. C 2 cch bt u mt Service mi.
+ Cch 1: khi ng ngm. V d:
startService(new Intent(MyService.MY_ACTION));
+ Cch 2: khi ng tng minh. V d:
startService(new Intent(this, MyService.class));
dng mt Serivce, s dng phng thc stopService, truyn vo Intent xc
nh Service cn ngng hot ng. V d:

ComponentName service = startService(new Intent(this, BaseballWatch.class));


// ngng dch v bng cch xc nh tn dch v

Xy dng ng dng 3D vi Android


33
______________________________________________________________________
stopService(new Intent(this, service.getClass()));
// ngng dch v bng cch tng minh
try {
Class serviceClass = Class.forName(service.getClassName());
stopService(new Intent(this, serviceClass));
} catch (ClassNotFoundException e) {}
2.3.2 Vng i ca Services:

Hnh 7 Vng i ca service

o Khi c mt context no gi startService() khi ng mt dch v


mong mun. Nu dch v cha c to th s gi onCreate() ri gi
tip onStart() v khi dch v chy nn bn di.

Xy dng ng dng 3D vi Android


34
______________________________________________________________________
o Nu sau li c mt context mun khi ng dch v ny m dch v
ang chy th ch c phng thc onStart() ca dch v c gi.
o D dch v c c gi khi ng bao nhiu ln th cng ch c th hin
ca dch v v ch cn gi stopService() mt ln kt thc dch v.
2.3.3 Kt ni dch v:
Khi mt Activity c kt ni ti mt Service, n duy tr mt tham chiu n
mt thc th Service. kt ni n thc th ny, thc thi phng thc onBind nh
sau:
private final IBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
------------public class MyBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
S kt ni gia Service v Acitvity c th hin qua mt ServiceConnection.
iu cn lm l thc thi mt ServiceConnection mi, override phng thc
onServiceConnected v onServiceDisconnected.
// tham chiu n dch v
private MyService serviceBinder;

Xy dng ng dng 3D vi Android


35
______________________________________________________________________
// x l kt ni gia service v activity
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder
service) {
// c gi khi lin kt c thc hin
serviceBinder = ((MyService.MyBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
// nhn khi dch v ngt kt ni mt cch bt ng
serviceBinder = null;
}
thc hin vic kt ni, gi phng thc bindService:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);

// kt ni dch v
Intent bindIntent = new Intent(MyActivity.this, MyService.class);

bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);


}

Hot ng ca bindService(): kt ni dch v

Xy dng ng dng 3D vi Android


36
______________________________________________________________________

Hnh 8 Hot ng kt ni dch v


Thng thng, vng i ca dch v khi c client kt ni t u nh sau:
o Cng bt u bng onCreate() ri n onBind() v dch v chy di
nn.
o Khi khng cn client kt ni ti th dch v gi onUnbind() ri
onDestroy().
C mt s trng hp khng thng thng, v d nh:
o C mt context khi ng mt dch v, sau c mt s client kt ni
(bind) ti service.
o C nhiu client cng lc kt ni ti dch v.
o Mt activity va gi startService() va gi bindService().

Xy dng ng dng 3D vi Android


37
______________________________________________________________________
2.4 Trnh cung cp ni dung (Content Providers):
2.4.1 Gii thiu:
C th coi trnh cung cp ni dung nh l mt my ch c s d liu. Cng vic
ca n l qun l truy cp v chia s d liu ang tn ti, chng hn nh mt c s d
liu SQLite. N c th c cu hnh cho php cc ng dng khc truy xut v
ngc li. Nu ng dng rt n gin th khng nht thit phi to ra mt trnh cung
cp ni dung.
Content Provider gip tch bit tng ng dng ra khi tng d liu. N c y
cc quyn iu khin v c truy xut thng qua m hnh URI n gin nh l c th
thm, xa, cp nht d liu ca cc ng dng.

2.4.2 To mt Content Provider mi:


2.4.2.1 To Content Provider:
to mt Content Provider cn tha k li t lp tru tng ContentProvide,
override li phng thc onCreate.
import android.content.*;
import android.database.Cursor;
import android.net.Uri;
import android.database.SQLException;
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
// TODO: Construct the underlying database.
return true;
}
}

Xy dng ng dng 3D vi Android


38
______________________________________________________________________

Nn cung cp mt bin static CONTENT_URI tr v mt URI ca provider ny.


Content URI phi l duy nht gia cc provider, v th nn da vo tn package xc
nh URI, hnh thc chung cho vic nh ngha mt Content Provider URI l:
content://com.<CompanyName>.provider.<ApplicationName>/<DataPath>

V d:
content://com.paad.provider.myapp/items
Content URI c th 2 dng th hin. V d trn l URI dng request tt c cc
gi tr. Vic thm vo cui /<rownumber>, s request mt record n.
content://com.paad.provider.myapp/items/5
Cc n gin nht lm

vic ny l s dng URIMatcher. Cu hnh

UriMatcher phn tch hnh thc ca n khi provider ang c truy xut n thng
qua mt Content Resolver. Xt v d sau:

public class MyProvider extends ContentProvider {


private

static

final

String

content://com.paad.provider.myapp/items;
public static final Uri CONTENT_URI = Uri.parse(myURI);
@Override
public boolean onCreate() {
// TODO: Construct the underlying database.
return true;
}

myURI

Xy dng ng dng 3D vi Android


39
______________________________________________________________________
// to cc hng s c dng phn bit cc yu cu URI khc nhau
private static final int ALLROWS = 1;
private static final int SINGLE_ROW = 2;

private static final UriMatcher uriMatcher;


// thng thng i tng UriMatcher, ni m mt URI kt thc bng items s
// tng ng vi mt yu cu tt c item, v items/[rowID] s tng ng vi
mt
// hng n
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(com.paad.provider.myApp, items, ALLROWS);
uriMatcher.addURI(com.paad.provider.myApp, items/#,
SINGLE_ROW);
}
}
2.4.2.2 a ra truy xut Data Source:
C th cung cp cc truy vn v thc thi vi Content Provdier bng cch thc
hin cc phng thc delete, insert, update v query. Cc phng thc ny hot ng
nh cc giao tip chung n ngun d liu bn di, chng cho php cc ng Android
chia s d liu vi nhau m khng phi to mt giao tip ring cho mi ng dng.
V d: mt i tng UriMatcher c s dng lc cc thc thi v cc cu
truy vn.
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sort) {

Xy dng ng dng 3D vi Android


40
______________________________________________________________________

// nu l truy vn 1 hng th hn ch kt qu
switch (uriMatcher.match(uri)) {
case SINGLE_ROW :
// TODO: Modify selection based on row id, where:
// rowNumber = uri.getPathSegments().get(1));
}
return null;
}

@Override
public Uri insert(Uri _uri, ContentValues _initialValues) {
long rowID = [ ... Add a new item ... ]

// tr v URI ca item va insert


if (rowID > 0) {
return ContentUris.withAppendedId(CONTENT_URI, rowID);
}
throw new SQLException(Failed to add new item into + _uri);
}

@Override
public int delete(Uri uri, String where, String[] whereArgs) {
switch (uriMatcher.match(uri)) {
case ALLROWS:
case SINGLE_ROW:
default: throw new IllegalArgumentException(Unsupported

Xy dng ng dng 3D vi Android


41
______________________________________________________________________
URI: + uri);
}
}
@Override
public int update(Uri uri, ContentValues values, String where,
String[] whereArgs) {
switch (uriMatcher.match(uri)) {
case ALLROWS:
case SINGLE_ROW:
default:

throw

new

IllegalArgumentException(Unsupported

URI:
+ uri);
}
}
Bc cui cng trong qu trnh to mt Content Provider l nh ngha kiu
MIME l kiu d liu m Provider tr v, override phng thc getType tr v mt
kiu String m t cho kiu d liu. Kiu tr v bao gm c 2 hnh thc: trng n v
tt c d liu.
Trng n
vnd.<companyname>.cursor.item/<contenttype>
Tt c
vnd.<companyName>.cursor.dir/<contenttype>

V d:
@Override

Xy dng ng dng 3D vi Android


42
______________________________________________________________________
public String getType(Uri _uri) {
switch (uriMatcher.match(_uri)) {
case

ALLROWS:

return

vnd.paad.cursor.dir/myprovidercontent;
case SINGLE_ROW: return
vnd.paad.cursor.item/myprovidercontent;
default: throw new IllegalArgumentException(Unsupported
URI:
+ _uri);
}
}
2.4.2.3 ng k Provider:
Thm Content Provider va to vo trong manifest.xml. S dng th authorities
ch nh a ch ca n:
<provider android:name=MyProvider
android:authorities=com.paad.provider.myapp/>

2.4.3 Truy vn, thm, cp nht v xa ni dung trong Content Provide:


Content Provider c truy xut thng qua lp Content Resolver. Mi mt
Context ca ng dng c mt i tng ContentResolver, c th c truy xut thng
qua phng thc getContentResolver.
ContentResolver cr = getContentResolver();

Xy dng ng dng 3D vi Android


43
______________________________________________________________________
Content Resolver bao gm mt vi phng thc thc thi v truy vn n
Content Providers. Mt URI dng ch nh Content Provider no c cung cp bi
cc quyn c nh ngha trong manifest ca ng dng. URI l mt chui ty , v th
hu ht cc provider u a ra thuc tnh CONTENT_URI. Content Provider thng
a ra 2 hnh thc URI, mt l a tt c cc d liu c yu cu trn cng mt dng
n l, hoc l thm vo /<rowID> vo pha sau CONTENT_URI.

2.4.3.1 Truy vn:


Vic truy vn trn Content Provider c hnh thc tng t nh khi truy vn trong
database, dng phng thc query ca i tng ContentResolver vi cc tham s
truyn vo gm:
Mt URI ca Content Provider mun truy vn.
Mt nh x i din cho cc ct mun cha trong tp kt qu.
Mt mnh where ch nh cc dng no c tr v. C th a vo k t i
din ? v s c thay th bi cc gi tr c lu bn trong cc tham s c
chn.
Mt mng cc i s kiu String thay th cho cc k t i din ? trong mnh
where
Mt chui m t th t cc dng tr v.
V d:
// tr v tt c cc dng
Cursor allRows = getContentResolver().query(MyProvider.CONTENT_URI,
null, null, null, null);
// tr v tt c cc ct ca cc hng c ct 3 bng vi gi tr thit t v sp xp
// theo gi tr ca ct 5
String where = KEY_COL3 + = + requiredValue;

Xy dng ng dng 3D vi Android


44
______________________________________________________________________
String order = KEY_COL5;
Cursor someRows = getContentResolver().query(MyProvider.CONTENT_URI,
null, where, null, order);

2.4.3.2 Thm:
Content Resolver cung cp 2 phng thc chn mt record mi vo trong
Content Provider, l insert v bulkInsert. Phng thc insert tr v mt URI n
record mi c thm vo, trong khi bulkInsert tr v s thnh phn thm vo thnh
cng.
on code sau m t cch s dng 2 phng thc trn:
// to mt dng mi cho cc gi tr mun chn.
ContentValues newValues = new ContentValues();

// gn gi tr cho mi hng
newValues.put(COLUMN_NAME, newValue);
[ ... lp li cho mi ct ... ]
Uri myRowUri = getContentResolver().insert(MyProvider.CONTENT_URI,
newValues);

// to mt dng mi cho cc gi tr mun chn.


ContentValues[] valueArray = new ContentValues[5];

// to mt mng cc dng mi v tr v s thnh phn thm thnh cng


int count = getContentResolver().bulkInsert(MyProvider.CONTENT_URI,
valueArray);

Xy dng ng dng 3D vi Android


45
______________________________________________________________________
2.4.3.3 Xa:
xa mt record khi s dng Content Resolver, s dng phng thc delete,
truyn vo URI cho dng mun xa. ng thi, cng c th dng mnh iu kin
where xa nhiu dng.
V d:
// xa mt dng c ch nh
getContentResolver().delete(myRowUri, null, null);
// xa 5 dng u tin.
String where = _id < 5;
getContentResolver().delete(MyProvider.CONTENT_URI, where, null)

2.4.3.4 Cp nht:
Vic cp nht cho mt Content Provider c iu khin bi phng thc update
ca Content Resolver. Phng thc update nhn URI ca Content Provider ch, mt
i tng ContentValues cha tp gi tr c nh x n cc ct cn cp nht, v mt
mnh where ch nh dng no c cp nht.
Khi thc thi, mi dng ph hp vi iu kin trong mnh where s c cp
nht v tr v s dng c cp nht gi tr thnh cng.
V d:
// to mt dng mi cho cc gi tr mun chn.
ContentValues newValues = new ContentValues();
// to nh x thay th cc ct mun cp nht v nhng gi tr g gn cho mi
ct
newValues.put(COLUMN_NAME, newValue);
// p dng cho 5 hng u tin
String where = _id < 5;

Xy dng ng dng 3D vi Android


46
______________________________________________________________________
getContentResolver().update(MyProvider.CONTENT_URI, newValues, where,
null);

2.4.4 Native Android Content Provider:


Android a ra nhiu Content Provider h tr truy xut n cc ng dng native.
C th dng mt trong cc Content Provider native ny s dng cc k thut c
m t trn. Nh mt s thay th, gi android.provider cha cc lp thun tin truy
xut mt cch n gin n nhiu provider bao gm:
Browser: Dng browser Content Provider c v iu chnh bookmarks,
browser history, hoc web searches.
CallLog: Hin th hoc cp nht cc cuc gi (cuc gi n, cuc gi i, cc
cuc gi nh, v chi tit cuc gi.
Contacts: dng rt trch, chnh sa, hoc lu tr chi tit danh b.
MediaStore: cung cp s kim sot, qun l truy xut a phng tin trn thit
b (audio, video, v hnh nh).
Settings: Truy xut n cc thit lp ci c ca thit b, Settings cho php hin
th v iu chnh cc thit lp Bluetooth, ring tone v nhiu ci t khc.
Nn s dng cc Content Providers native ny bt c khi no c th, bi v khi s
dng chng s bo m cho ng dng c kt hp vi cc ng dng native hoc
third-party khc mt cch lin tc.

2.4.4.1 Media Store Provider:


Android Media Store cung cp mt kho lu tr cc tp tin audio, video, v hnh
nh. Mi khi thm mt tp tin a phng tin no vo Android filesystem, n s c
thm vo Media Store cho cc ng dng khc nhn thy n.

Xy dng ng dng 3D vi Android


47
______________________________________________________________________
Mt lp MediaStore bao gm mt s cc phng thc tin li thm cc tp tin
vo Media Store mt cch n gin. V d sau y s m t vic thm vo mt tp tin
hnh nh vo trong Media Store.
android.provider.MediaStore.Images.Media.insertImage(
getContentResolver(), sourceBitmap, my_cat_pic, Photo of my cat!);

2.4.4.2 Contacts Provider:


Contact Provider thc s rt cn thit trn thic b giao tip a ra tt c cc
thng tin c th t c s d liu n bt k ng dng no c quyn
READ_CONTACTS.
Trong v d sau y, mt Activity nhn mt Cursor n mi ngi trong c s d
liu contact, to mt mng kiu String vi mi thnh phn cha tn ngi v s in
thoi ca ngi .
// ly mt con tr ca mi lin h
Cursor cursor = getContentResolver().query(People.CONTENT_URI,
null, null, null, null);
// qun l vng i con tr.
startManagingCursor(cursor);
// cc thuc tnh ly ch s ct
int nameIdx = cursor.getColumnIndexOrThrow(People.NAME);
int phoneIdx = cursor. getColumnIndexOrThrow(People.NUMBER);
String[] result = new String[cursor.getCount()];
if (cursor.moveToFirst())
do {
// trch xut tn
String name = cursor.getString(nameIdx);

Xy dng ng dng 3D vi Android


48
______________________________________________________________________
// trch xut s in thoi
String phone = cursor.getString(phoneIdx);
result[cursor.getPosition()] = name + ( + phone + );
} while(cursor.moveToNext());

Xy dng ng dng 3D vi Android


49
______________________________________________________________________

Chng 3: Thit k giao din


3.1 Mt s lp h tr thit k giao din cho ng dng Android:
Android cung cp mt s cng c thit k giao din:
Views: l lp UI c bn cho cc control giao din. Tt c cc control giao
din ngi dng, cc lp layout u c dn xut t lp Views.
ViewGroups: c m rng t lp View v c th cha nhiu Views.
ViewGroups cng c k tha cung cp cc lp qun l b cc nh
LinearLayout. ViewGroup c dng xy dng nn cc component c
th dng li (widget) hoc qun l b cc cho cc control.
Activity: dng hin th giao din ngi dng. Lp ny do ngi pht
trin ng dng vit.

Hnh 9 - Quan h gia cc thnh phn trn

3.2 Android Widget Toolbox:


Android cung cp mt b cng c cc View chun to cc giao din ngi
dng n gin, gip n gin ha vic pht trin v to s ng nht gia cc ng
dng.

Xy dng ng dng 3D vi Android


50
______________________________________________________________________
Cc control thng dng:
TextView: l mt label ch c tc dng hin th vn bn, n h tr hin th nhiu
dng, nh dng chui.
EditText: l mt vng nhp vn bn c th chnh sa, h tr nhp nhiu dng.
ListView: to v qun l mt nhm cc View hin th mt danh sch cc
phn t. Mt ListView chun dng hin th chui gi tr ca mt mng cc
TextView.
Spinner: l mt control kt hp, hin th mt TextView v mt ListView kt
hp dng chn mt item t danh sch. N c to thnh t mt TextView cha gi
tr hin ti ang c chn kt hp vi mt nt m khi nhn vo s a ra mt danh
sch la chn.
Button
CheckBox
RadioButton
Andoid cng h tr nhiu View cao cp hn nh: date-time picker, autocomplete input box, map, gallery, v tab sheet.
3.3 Cc kiu Layout:
LayoutManager (thng gi l layout) l m rng ca lp ViewGroup, c thit
k iu chnh v tr ca cc control trn mn hnh ng dng. Layout c th lng
nhau to nn cc giao din phc tp. Android c mt s cc layout n gin gip
xy dng UI. to nn mt b cc hp l th nn kt hp cc layout vi nhau.
Cc lp layout c bn:
FrameLayout: l layout n gin nht trong Layout Manager, FrameLayout
t mi View con vo gc tri trn ca mn hnh. Vic thm nhiu control s chng
mt ci mi ln trn ci trc .

Xy dng ng dng 3D vi Android


51
______________________________________________________________________
LinearLayout: thm mi View theo mt ng thng, theo chiu dc hoc
ngang. Mt layout theo chiu dc s c mt control trn mt dng, layout theo chiu
ngang ch c mt dng cho nhiu View. N cho php ch nh gi tr weight cho mi
View con iu chnh kch thc bn trong khng gian cho php.
RelativeLayout: dng nh v tr cho cc View cn xng vi cc control
khc cng nh vi ng bin ca mn hnh.
TableLayout: gip b tr cc View theo mt li c cc dng v cc ct. Cc
ct c th c thit lp co li hoc gin ra.
AbsoluteLayout: trong layout ny, v tr mi View s l ta tuyt i, m
bo b cc chnh xc cho cc thnh phn. Do , khng th c c s linh hot i
vi cc mn hnh c kch thc khc nhau.
S dng Layout
s dng layout ngi ta thng dng phng php l s dng resource bn
ngoi t file XML. Mt layout XML phi cha mt nt gc. Nt gc ny c th cha
cc layout v cc View lng nhau xy dng nn cc giao din phc tp.

Hnh 10 - H thng cc view vi cc thng s layout c kt ni vi mi view

Xy dng ng dng 3D vi Android


52
______________________________________________________________________

V d: File XML sau m t mt layout n gin bao gm mt TextView trn v


mt EditText s dng LinearLayout b tr theo chiu ng:
<?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>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Enter Text Below
/>
<EditText
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Text Goes Here!
/>
</LinearLayout>

Tuy nhin, cng c th to cc layout bng code. V d:


LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);

TextView myTextView = new TextView(this);


EditText myEditText = new EditText(this);
myTextView.setText(Enter Text Below);

Xy dng ng dng 3D vi Android


53
______________________________________________________________________
myEditText.setText(Text Goes Here!);

int lHeight = LinearLayout.LayoutParams.FILL_PARENT;


int lWidth = LinearLayout.LayoutParams.WRAP_CONTENT;

ll.addView(myTextView, new LinearLayout.LayoutParams(lHeight, lWidth));


ll.addView(myEditText, new LinearLayout.LayoutParams(lHeight, lWidth));

setContentView(ll);

3.4 To cc View:
3.4.1 Chnh sa cc View c sn:
Chnh sa hoc k tha mt control sn c nu n cung cp cc chc nng cn
thit, bng cch ghi cc handler v onDraw ca n. nh ngha li giao din cng
nh cc ng x ca control mi to, cn phi ghi v tha k cc iu khin s kin
(event handler) kt hp vi cc hnh vi mun thay i.
V d: tinh chnh mt TextView hin th mt tp cc s h thp phn.

public class MyTextView extends TextView {


public MyTextView (Context context, AttributeSet ats, int defStyle) {
super(context, ats, defStyle);
}

public MyTextView (Context context) {


super(context);
}

Xy dng ng dng 3D vi Android


54
______________________________________________________________________

public MyTextView (Context context, AttributeSet attrs) {


super(context, attrs);
}
@Override
public void onDraw(Canvas canvas) {
[ ... v trn canvas bn di text ... ]
super.onDraw(canvas);
[ ... v trn canvas bn trn text ... ]
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
[ ... thc hin mt x l khi bm 1 phm c th... ]
// s dng cc chc nng hin c bi lp co s p ng s kin
// nhn phm
return super.onKeyDown(keyCode, keyEvent);
}
}

3.4.2 To cc iu khin ghp (compound control):


Compound control l cc widget c th ti s dng, n cha nhiu control c
b tr v c lin h vi nhau, n c to t nhiu control c bn. V d nh to nn
mt dropdown combo box bng cch kt hp mt TextView v mt Button m khi
c nhn s hin th mt ListView.

Xy dng ng dng 3D vi Android


55
______________________________________________________________________
Khi to mt compound control cn nh ngha layout, hnh thc v cch thc tc
ng ln nhau gia cc View m n cha. Compound control c to thnh t vic
dn xut t lp ViewGroup.
to mt compound control mi, chn mt lp layout ph hp nht xc nh
v tr cho cc control, v dn xut t n:
public class MyCompoundView extends LinearLayout {
public MyCompoundView(Context context) {
super(context);
}
public MyCompoundView(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
Cch c a chung hn thit k giao din cho mt compound control l s
dng layout resource.
V d: to mt widget n gin gm mt EditText v mt Button:
<?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>
<EditText
android:id=@+id/editText
android:layout_width=fill_parent
android:layout_height=wrap_content
/>

Xy dng ng dng 3D vi Android


56
______________________________________________________________________
<Button
android:id=@+id/clearButton
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=Clear
/>
</LinearLayout>
dng c layout ny cho widget mi cn phi nh ngha li contructor ca
n s dng phng thc inflate t dch v LayoutInflate. Phng thc inflate nhn
tham s l layout resource v tr v mt View.
Mt khi xy dng c giao din cho control, iu tip theo l nh ngha iu
khin s kin cho mi control con trong n.

3.4.3 To cc Control ty chnh:


Ngi pht trin c th to ra cc control theo ca mnh to c mt giao
din mang tnh duy nht ph hp vi yu cu ca ngi dng. Cc control mi cn
phi c tha k t lp View hoc SurfaceView.
Lp View cung cp mt i tng Canvas v mt s phng thc v cng nh
cc lp Paint, to mt giao din trc quan. Ngi thit k c th nh ngha li cc
s kin ngi dng nh cm ng trn mn hnh, nhn phm to nn s tng tc.
Trong nhng trng hp m khng i hi vic v li cng nh ha 3D th lp c
s View c gii php hiu qu.
Trong khi , lp SurfaceView cung cp mt i tng canvas h tr vic v t
mt lung x l nn v s dng openGL cho ha 3D. y l mt la chn tuyt vi

Xy dng ng dng 3D vi Android


57
______________________________________________________________________
cho cc iu khin i hi ha cao, cn phi cp nht lin tc hoc hin th cc
ha phc tp, nh game 3D.

3.5 To giao din Activity vi cc View:


Mt Activity khi cha thit k s khi ng vi mt mn hnh rng. thit lp
giao din cho mn hnh rng ny cn gi phng thc setContentView khi everride li
phng thc onCreate. Phng thc setContentView c th nhn mt tham s l
resource ID hoc mt th hin ca View. Do , c th nh ngha giao din ng dng
bng code hoc tham chiu n resource (layout).
Nu dng layout resource th s tch ring vic thit k giao din v phn code x
l, cung cp mt kh nng thay i linh hot giao din m khng thay i code bn
trong.
V d: phng thc findViewById tham chiu n cc View c nh ngha
trong mt resource layout main.xml nm trong th mc res/layout ca project:
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
TextView myTextView = (TextView)findViewById(R.id.myTextView);
}
Hoc c th nh ngha UI bng code:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
TextView myTextView = new TextView(this);

Xy dng ng dng 3D vi Android


58
______________________________________________________________________
setContentView(myTextView);
myTextView.setText(Hello, Android);
}

3.6 Menu:
3.6.1 Menu trong Android:
Menu a ra mt gii php tng tnh tin dng ca ng dng m khng chim
dng khng gian trn mn hnh. Mi mt Activity c ring cho n mt menu, c
hin th khi ngi dng nhn nt Menu.
Android cng h tr menu ng cnh, n c gn vo bt k View no bn trong
mt Activity. Mt menu ng cnh c hin th khi ngi dng nhn nt D-pad,
trackball, hoc nhn vo mn hnh cm ng khong 3 giy. menu ng cnh h tr
submenu, checkbox, radio button, shortcut key, v icon.
Cc loi menu trong android:
Icon Menu: c kt vi menu, xut hin phn di ca mn hnh thit b khi
nt Menu c nhn. N hin th icon v text cho cc menu item hoc cc submenu.
Icon menu h tr to ti a 6 menu item, v cc menu item ny khng th hin th
checkbox, radio button, hay shortcut key.

Hnh 11 Icon menu


Expanded Menu: hin th khi ngi dng chn More trong menu icon. Expand
Menu hin th mt danh sch c th cun c cc menu item, v cc menu item ny

Xy dng ng dng 3D vi Android


59
______________________________________________________________________
khng th cha cc icon m ch c th cha text, shortcut key v checkbox/ radio
button.

Hnh 12 Expanded menu


Submenu: mi submenu hin th bng mt ca s, tn ca submenu c hin
th thanh header v mi Menu item c hin th vi y text, checkbox, shortcut
key v khng th hin th icon cho cc item. Android khng h tr cc submenu lng
nhau, v khng th thm mt submenu vo mt submenu.

Hnh 13 - Submenu

Xy dng ng dng 3D vi Android


60
______________________________________________________________________
3.6.2 Cc kiu Menu Item
Android h tr hu ht cc kiu menu item truyn thng, bao gm icon, shortcut,
checkbox, radio button:
Checkbox v Radio button group: thit lp mt menu item l checkbox s
dng phng thc setCheckable, thit lp trng thi ca checkbox dng setChecked.
Mt radio button group l mt nhm cc radio button v ch c mt trong s
chng c chn ti mt thi im. to mt radio button group, gn cng ID nhm
cho mi item, sau gi phng thc Menu.setGroupCheckable, truyn vo ID nhm,
v thit lp gi tr cho cc tham s khc l True.
// to checkbox.
menu.add(0,

CHECKBOX_ITEM,

Menu.NONE,

CheckBox).setCheckable(true);
// to radio button group.
menu.add(RB_GROUP, RADIOBUTTON_1, Menu.NONE, Radiobutton 1);
menu.add(RB_GROUP, RADIOBUTTON_2, Menu.NONE, Radiobutton 2);
menu.add(RB_GROUP, RADIOBUTTON_3, Menu.NONE,
Radiobutton 3).setChecked(true);
menu.setGroupCheckable(RB_GROUP, true, true);
Shorcut Key: ch nh mt keypad shortcut cho mt Menu Item s dng
phng thc setShortcut. Phng thc ny yu cu truyn vo 2 tham s, mt l phm
s v mt l bn phm y .
menuItem.setShortcut(0, b);
Condensed Title: dng mt text hin th menu.
menuItem.setTitleCondensed(Short Title);
Icon: biu tng ch c hin th trn Icon Menu

Xy dng ng dng 3D vi Android


61
______________________________________________________________________
menuItem.setIcon(R.drawable.menu_item_icon).
Menu Item Click Listener: khi mt menu c chn s c mt x l iu
khin. l phng thc onOptionsItemSelected.
menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem _menuItem) {
[ ... thc hin x l ... ]
return true;
}
});
Intent: Khi mt menu item c chn, Android s thc thi startActivity vi mt
i tng Intent.
menuItem.setIntent(new Intent(this, MyOtherActivity.class));

3.6.3 To mt Menu:
to mt menu, trong Activity override phng thc onCreateOptionsMenu,
phng thc ny c thc thin ln u tin khi menu c hin th.
onCreateOptionsMenu nhn mt tham s kiu Menu. Dng phng thc add trn
i tng Menu ny thm vo cc item. Mi menu item cn phi ch nh cc thuc
tnh sau:
Nhm m item c thm vo.
ID, mi item c mt ID duy nht, bi v chng c x l chung trong phng
thc onOptionsItemSelected nn vic xc nh item no c chn l ph thuc vo ID
c ch nh cho n.
Cch sp xp th t m item c hin th.

Xy dng ng dng 3D vi Android


62
______________________________________________________________________
Text th hin ca item, c th l mt chui cc k t hoc mt string resource.
V d:
static final private int MENU_ITEM = Menu.FIRST;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// nhm
I

int groupId = 0;
// ID
int menuItemId = MENU_ITEM;
// cch sp xp
int menuItemOrder = Menu.NONE;
// Texthin th
int menuItemText = R.string.menu_item;

MenuItem menuItem = menu.add(groupId, menuItemId,


menuItemOrder, menuItemText);
return true;
}

Xy dng ng dng 3D vi Android


63
______________________________________________________________________

Chng 4: X l bt ng b

4.1 Thread:
Thng thng lp trnh vin dng Thread x l cc code x l nng, hoc
mt thi gian c th gy chm chng trnh hoc giao din b block. Thread kh thng
dng v trong Android dng lp Thread ca Java.
Theo mc nh, mi ng dng chy trong mt tin trnh v code c thc thi
trong thread chnh ca tin trnh . Nu code x l qu lu, khng kp phn hi li cc
s kin ngi dng trong 5 giy th s xut hin dialog Application is not responding
v ngi dng c th ng ng dng ngay lp tc. Nu khng b ng th ng dng s
b lag, iu ny l kh chp nhn.
Thread thread = new Thread() {
@Override
public synchronized void start() {
// Khi to cc i tng cn thit ti y
super.start();
}
@Override
public void run() {
// code x l chnh ca thread trong ny
super.run();
}
};
thread.start(); //bt u thread

Xy dng ng dng 3D vi Android


64
______________________________________________________________________

Lu :
Thread ln u thc thi gi phng thc start(), nhng ln sau ch gi
phng thc run(), khng gi start() na.
Cc code x l lin quan n giao din ch c x l trong thread chnh
ca ng dng (v d load nh t mng v th dng thread, nhng hin th
nh ln ImageView th x l trong thread chnh)
Sau khi thc thi xong phng thc run(), thread khng cn hot ng
na.

4.2 Handler:
Trong Android, tin vic giao tip gia 2 thread ta dng i tng Handler.
C th dng Handler nh b m giy khi chi nhc, hoc chc nng tng t . Ngoi
ra, c th dng Handler t x l mt yu cu no sau mt khong thi gian xc
nh.
Giao tip gia 2 Thread:
Gi s trong phng thc run() ly xong i tng Bitmap v. Mun
truyn i tng Bitmap cho Thread chnh hin th ln mn hnh:
Message msg = mHandler.obtainMessage(1, bitmap);
mHandler.sendMessage(msg);
Trong code ca Activity (mc nh l thread chnh), ta khai bo mt i
tng Handler tng tng nh sau:
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {

Xy dng ng dng 3D vi Android


65
______________________________________________________________________
//Hin th Bitmap
mImageView.setImageBitmap((Bitmap)msg.obj);
}
super.handleMessage(msg);
}
};

Trong on code trn, i tng mHandler ly ra mt message v gn m


vo cho message , km theo i tng bitmap. Sau gi i.
Message gi i s c nhn phng thc callback l handleMessage()
ca i tng Handler.
Handler cn c th gi message x l sau mt khong thi gian nh
sn sendMessageAtTime hoc x l ti mt thi im nh sn
sendMessageDelayed.

Lu :
Handler c to trong thread no th s s dng hng i message ca
thread .
Nu trong hng i message vn cn message th vn cn thc thi d
thot khi ng dng.

Xy dng ng dng 3D vi Android


66
______________________________________________________________________
4.3 AlarmManager (bo hiu):
Dng AlarmManager thc hin ng k x l mt thao tc no ti mt
thi im nht nh trong tng lai (thng l thi gian di, nu x l trong thi gian
ngn th khuyn co nn dng Handler). Khi n thi im c t trc, d ng
dng ang khng chy th n vn c gi. Nu tt my ri bt li th khng cn.
Khi to mt AlarmManager:
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent broadcastIntent = new Intent("org.multiuni.android.ACTION...");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,
0, broadcastIntent, PendingIntent.FLAG_CANCEL_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);

Gii thch:
Khi to mt i tng AlarmManager lm vic vi Alarm.
To mt intent tn broadcastIntent, intent ny c dng gi
broadcast khi n thi im nh sn.
PendingIntent c khi to gm context, broadcastIntent trn v mt
c bo rng nu c mt Alarm tng t th b n i v dng ci mi
ny.
Sau cng, set alarm vi 3 thng s:
+ B m thi gian.
+ Thi gian chnh xc bt alarm ln.
+ PendingIntent gi i (dng xc nh ti thi im bt alarm ln
th cn pht intent no).

Xy dng ng dng 3D vi Android


67
______________________________________________________________________

4.4 Notification (thng bo):


Trong nhng trng hp chng ta mun hin mt thng bo v mt s kin no
(tin nhn, cuc gi, email) cho ngi dng m khng mun nh hng n cng
vic ca h hoc khng chc l h c ang cm in thoi hay khng, hoc bn mun
hin th thng tin mt vic no ang xy ra trn in thoi (ang nghe nhc, ang
trong cuc gi, thiu th nh) v mong ngi dng bit th chng ta dng
Notification.
Chng ta c th to mt thng bo c nhiu hnh thc khc nhau nh c m bo,
rung, n led, icon
Mi phng php thng bo c mt tham s id kiu int v ty chn mt tham s
tag kiu String, c th l null, to thnh mt b hai (tag, id) hoc (null, id). B hai ny
nhn din thng bo t ng dng, v phi l duy nht trong ng dng. Nu gi mt
trong nhng phng thc thng bo vi b (tag, id) hin ang hot ng v thit lp
cc thng s mi th n s c cp nht. V d, nu lt qua mt biu tng mi ca
thanh trng thi th biu tng c ca thanh trng thi s c thay th bng biu
tng mi.
Chng ta khng khi to lp ny trc tip m ly n thng qua
getSystemService(String). V d:
String svcName = Context.NOTIFICATION_SERVICE;
NotificationManager notificationManager;
notificationManager = (NotificationManager)getSystemService(svcName);
NoticationManager l mt dch v h thng dng qun l cc Notication.

Xy dng ng dng 3D vi Android


68
______________________________________________________________________
To mt thng bo:
To mt i tng Notication, truyn vo icon hin th thanh trang
thi v thi gian hin th:
// chn mt drawable hin th nh l mt icon ca thanh trng thi
int icon = R.drawable.icon;
// Text hin th ln thanh trng thi khi thng bo c chy
String tickerText = Notification;
// thanh trng thi m rng sp xp cc thng bo theo th t thi gian
when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
Cu hnh giao din ca Notification trong ca s trng thi m rng, s
dng phng thc setLatestEventInfo. Ca s trng thi m rng ny
hin th icon v thi gian c khai bo trong constructor v ng thi
hin th tiu v chi tit v chui thng bo.
Context context = getApplicationContext();
// Text hin th trn ca s trng thi m rng
String expandedText = Extended status text;
// Tiu ca thanh trng thi m rng
String expandedTitle = Notification Title;
// Intent chy mt activity khi text c click
Intent intent = new Intent(this, MyActivity.class);
PendingIntent launchIntent = PendingIntent.getActivity(context, 0,
intent, 0);
notification.setLatestEventInfo(context, expandedTitle,
launchIntent);

expandedText,

Xy dng ng dng 3D vi Android


69
______________________________________________________________________
Ci tin thng bo bng cc thuc tnh khc ca i tng Notication
lm nhy n trn LED trn thit b, rung in thoi hay trnh din cc
file nhc.
Gi mt thng bo:
thc hin gi mt thng bo, gi phng thc notify

ca

NotificationManager:
int notificationRef = 1;
notificationManager.notify(notificationRef, notification);
cp nht mt thng bo c s dng, gi li v truyn li gi tr
reference ID. Cng c th s dng ID ny hy thng bo bng cch gi phng
thc cancel ca NotificationManager.
notificationManager.cancel(notificationRef);
Vic hy thng bo s xa thanh icon trng thi v ca s trng thi m rng.

Xy dng ng dng 3D vi Android


70
______________________________________________________________________

Chng 5: p dng OpenGL ES to ng dng 3D trn Androi

5.1 Gii thiu v OpenGL ES:


OpenGL ES (OpenGL for embedded systems) c pht trin bi nhm
Khronos, l mt sn phm min ph bao gm cc hm API cho php to cc ng dng
2D, 3D trn cc ng dng nhng bao gm cc thit b cm tay. N nh l mt tp
con ca OpenGL (Open Graphics Library), to ra tnh linh hot, mnh m trn giao
din cp thp gia cc phn mm v ha. V vy OpenGL ES nh hn nhiu so vi
OpenGL, nn nhiu chc nng thun tin c g b. V d, v hnh ch nht l
khng trc tip h tr trong OpenGL ES, bn phi v hai tam gic to ra mt hnh
ch nht.
Mi phin bn OpenGL ES tng ng vi mt phin bn OpenGL. OpenGL ES
1.0 ch tp trung vo cc phn mm cho php trin khai, l tp con ca OpenGL 1.3.
OpenGL ES 1.1 nhn mnh v tc phn cng ca cc hm API, l tp con ca
OpenGL 1.5. OpenGL ES 2.0 ch thc thi cc hnh dng thng thng, l tp con ca
OpenGL 2.0.
5.2 Dng (Rendering):
y l bc khi to v thit lp OpenGL ES, khi v trn mn hnh OpenGL ES
s dng k thut ca mt b m kp. Khi v, chng ta v trn b nh m. Sau khi c
c tt c cc thng tin ca vic v, n s trao i gia cc b nh m v bt u v
trn b nh m khc. iu ny ngn chn vic chp mn hnh bi hng s xa mn
hnh v v hnh khc trn mt b nh m.
Khai bo s dng th vin OpenGL ES:
import javax.microedition.khronos.opengles.*;

Khai bo mt i tng gl, v d: GL10 gl;

Xy dng ng dng 3D vi Android


71
______________________________________________________________________
Trong hm init(), chng ta s dng mt li gi glClearColor, n c s dng
xc nh mu sc cho mn hnh hin th, n bao gm 4 tham s, cc tham s ny i
din cho h mu RGBA v c gi tr trong khong t 0 n 1. Ba tham s u l mu
, xanh l cy v xanh da tri, cn tham s th 4 l sng ti ca window.
V d: t mu nn en cho mn hnh hin th
private void init(GL10 gl) {
gl.glClearColor(0.0f, 0.0f, 0.0f,0.0f);
}

xa b m, ta s dng hm glClear(), tham s ca n l nhng hng s xc


nh. V d:
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_
BUFFER_BIT);
C trng hp c nhng hm cha c chy n khi kt thc chng trnh,
trnh trng hp ny, ta gi hm glFlush(), n s thc hin tt c cc hm cha c
chy v kt thc i tng gl bng hm glFinish().
gl.glFlush();
gl.glFinish();

5.3 Php chiu trc giao (Orthographic Projection):


C hai cch hin th i tng l s dng php chiu phi cnh v php
chiu trc giao.
Php chiu trc giao l php chiu song song v tia chiu vung gc vi mt
phng chiu, cho kt qu nhanh hn v chi ph tnh ton t nhng li khng m t i
tng mt cch chn thc.

Xy dng ng dng 3D vi Android


72
______________________________________________________________________

Hnh 14 - Php chiu trc giao


View volume c nh ngha l mt hnh hp ch nht, vt th nm trong view
volume c chiu trc giao ln khung nhn, do trong php chiu trc giao, khong
cch t camare n vt th khng nh hng n ln ca nh.
Hnh c to ra bng cch xc nh cc nh, y l nhng im trong khng
gian 3 chiu v vy cn ch r cc im trn hnh.
Danh sch cc tham s
Primitive Flag

Description

GL_POINTS

Cc im

GL_LINES

on thng

GL_LINE_STRIP

ng gp khc khng khp kn

GL_LINE_LOOP

ng gp khc khp kn

GL_TRIANGLES

Tam gic

Xy dng ng dng 3D vi Android


73
______________________________________________________________________
GL_TRIANGLE_STRIP

Mt di tam gic c lin kt vi nhau

GL_TRIANGLE_FAN

Cc tam gic lin kt theo hnh qut

Khi v im, chc nng glPointSize c th thay i kch c ca im c v,


kch c mc nh l 1.
Khi v ng, c th s dng glLineWidth xc nh rng ca ng, kch
c mc nh l 1.
V d: hin th mt hnh vung ln mn hnh
-

Bc u tin l xc nh ta ca hnh vung t trn mn hnh, thit lp 3


gi tr (float) x, y, z cho mi nh:
float[] coords = {
0.25f, 0.25f, 0.0f, // 0
0.75f, 0.25f, 0.0f, // 1
0.25f, 0.75f, 0.0f, // 2
0.75f, 0.75f, 0.0f, // 3
};

Khi to chng trnh:


private void init(GL10 gl) {
gl.glClearColor(0.0f, 0.0f, 0.0f,0.0f);

Thit lp ch ma trn bng cu lnh glMatrixMode() trc khi nh ngha php


chiu:
gl.glMatrixMode (GL10.GL_PROJECTION);

Thit lp ma trn hin thi v ma trn n v bng lnh glLoadIdentity()


gl.glLoadIdentity ();

Xy dng ng dng 3D vi Android


74
______________________________________________________________________
-

Chc nng glOrthof c ch nh xc nh nhn theo php chiu trc giao,


n bao gm cc tham s: glOrthof(GLfloat left, GLfloat right, GLfloat bottom,
GLfloat top,GLfloat near, GLfloat far):
gl.glOrthof(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);

n gi thit lp xong php chiu trc giao, tip n s v hnh bng cch s
dng chc nng glVertexPointer, chc nng ny c 4 tham s:
+ GLint size: Xc nh s lng ta cho mi nh
+ GLenum type: Xc nh kiu d liu ca mi nh trong mng vi d nh
GL_BYTE, GL_SHORT, GL_FLOAT v.v
+ GLsizei stride: Xc nh khong cch byte gia cc nh lin tip, Nu
+ stride bng 0 cc nh c hiu l c ng gi cht ch trong mng
, gi tr ban u bng 0
+ const GLvoid *pointer: Xc nh v tr b nh ca gi tr u tin trong
mng, n tr ti mng.
gl.glVertexPointer(3, GL10.GL_FIXED, 0, coords);

Chc nng glEnableClientState s a ra mt trong nhng tham s ch nh


mng phi c kch hot:
gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);

Chc nng glDrawArray v vi cac tham s:


+ GLenum mode: xc nh gi tr ban u v
+ GLint first: Xc nh ch s ban u ca mng
+ GLsizei count: ch r s nh x l
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

Xy dng ng dng 3D vi Android


75
______________________________________________________________________
-

Hoc s dng hm glDrawElements() v:


gl.glDrawElements(int mode, int count, int type, Buffer indices);

Kt qu hin th:

Hnh 15 Kt qu php chiu trc giao

5.4 Php chiu phi cnh (Perspective Projection ):


Trong th gii thc, nu c nhiu i tng c cng mt kch c c t
nhng khong cch khc nhau, th s nhn thy rng cc i tng xa hn th s
trng nh hn. hin th c nh vy, ngi ta dng php chiu phi cnh.
Php chiu phi cnh l php chiu m cc tia chiu khng song song vi nhau
m xut pht t mt im gi l tm chiu, cho ta mt ci nhn ging tht hn nhng
chi ph tnh ton nhiu hn.

Xy dng ng dng 3D vi Android


76
______________________________________________________________________

Hnh 16 - Php chiu phi cnh


Thc hin: u tin s to 2 bin chiu rng v chiu cao ca ca s v mt bin
xc nh x dng php chiu trc giao hay php chiu phi cnh, iu ny cho php
thay i gia 2 php chiu ta thy c s khc bit gia chng:
private int w=0;
private int h=0;
private boolean perspective=true;

Nu mun di chuyn v tr ca camera (gc nhn) th s phi sa i ma trn


chiu. iu ny l kh phc tp, c cch n gin hn l ta s dng chc nng
gluLookAtf ca th vin GLU|ES, tng t chc nng trong UG l gluLookAtf.
Chc nng ny s a ra 9 tham s, bao gm 3 ta hoc vectors: u tin
phi xc nh ni t camera, th 2 l xc nh im mun camera c tr n, cui

Xy dng ng dng 3D vi Android


77
______________________________________________________________________
cng l ch r vic chun ha trn vector. Thng s dng (0, 1, 0) cho vector ny.
on code di y th hin ni t camera cch 2 n v t gc v nhn v pha gc.
float[] gluLookAtf = {
0.0f, 0.0f, 2.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
};

Tip theo l on code v 3 hnh vung, mi hnh s c xut hin pha


sau v dch sang bn tri ca hnh pha trc:
//hinh vuong red
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glTranslatef(-0.25f, 0.0f, -1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

//hinh vuong green


gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
gl.glTranslatef(-0.25f, 0.0f, -1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

//hinh vuong blue


gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
gl.glTranslatef(-0.25f, 0.0f, -1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

Chc nng reshape ban u vn gi nguyn:


public void resgape(int width, int height, GL10 gl)
{
w=width;

Xy dng ng dng 3D vi Android


78
______________________________________________________________________
h=height;

if (height==0)
height=1;
gl.glMatrixMode (GL10.GL_PROJECTION);
gl.glLoadIdentity ();
gl.glViewport(0, 0, width, height);

Ging glOrthof to ra hnh chiu trc giao, glFrustumf c s dng to


ra hnh chiu phi cnh, cc tham s cng ging nh hm glOrthof nh: tri, phi,
di, trn, gn, xa. N s to ra mt gc nhn nh hn i vi nh v tr thp hn.

Hnh 17 M t gc nhn ca camera


Tuy nhin, chc nng ny khng trc quan. Mt chc nng khc,
gluPerspectivef c to ra x l iu ny. Cng ging nh chc nng
gluLookAtf, th vin UG tng ng l chc nng ugluPerspectivef v n c cc tham
s sau:

Xy dng ng dng 3D vi Android


79
______________________________________________________________________
+ GLfloat fovy: phm vi ca gc nhn. Mt gc 90 ngha l c th nhn thy
c mi th bn tri v bn phi, nhng y khng phi l cch thc m con
ngi nhn thy vt, ta s dng gc 45 chnh xc hn.
+ GLfloat aspect: t l mong mun, n thng c ch nh l chiu rng chia
cho chiu cao ca ca s.
+ GLfloat n & GLfloat f: khong cch gn hay xa.
on code di y thit lp gc nhn theo chiu phi cnh hay chiu trc giao
ty thuc vo gi tr ca bin perspective.
if (perspective)
GLU.gluPerspective(gl, 45.0f, 1.0f*width/height,
1.0f, 100.0f);
else
gl.glOrthof(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f,
20.0f);
gl.glMatrixMode (GL10.GL_MODELVIEW);
gl.glLoadIdentity ();

gl.glFlush();
gl.glFinish();
}

Hnh 18 Kt qu php chiu phi cnh

Xy dng ng dng 3D vi Android


80
______________________________________________________________________
5.5 Php bin i (Transformations):
Phn ny s gii thiu v cch chuyn i hnh theo cc cch khc nhau. Cc
php bin i:
Php t l - glScalef
Php dch - glTranslatef
Php quay - glRotatef
Thc hin: khi to 2 bin dng quay theo trc x v y:
float xrot=0.0f;
float yrot=0.0f;

Khi to mt tam gic.


float[] triangle = {
-0.25f, -0.25f, 0.0f,
0.25f, -0.25f, 0.0f,
-0.25f, 0.25f, 0.0f,
};

Khi to mt mng mu:


float[] colors = {
1.0f, 0.0f, 0.0f, 1.0f, // point 0 red
0.0f, 1.0f, 0.0f, 1.0f, // point 1 green
0.0f, 0.0f, 1.0f, 1.0f, // point 2 blue
1.0f, 1.0f, 1.0f, 1.0f, // point 3 white
};

Khi to mt hnh vung:


float[] square = {
-0.25f, -0.25f,
0.25f, -0.25f,

Xy dng ng dng 3D vi Android


81
______________________________________________________________________
-0.25f, 0.25f,
0.25f, 0.25f,
};

Thit lp ch hin thi:


Ta s v mt tam gic pha bn tri mn hnh v mt hnh vung pha bn
phi, tam gic s c t bng mn v hnh vung s c t bng.
Cc thit lp trn tam gic:
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glShadeModel(GL10.GL_SMOOTH);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangle);


gl.glColorPointer(4, GL10.GL_FLOAT, 0, colors);

gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState (GL10.GL_COLOR_ARRAY);

C 3 php chuyn i s dng bi cc hm glTranslatef, glScalef v glRotatef.


Cc gi tr f cui mi hm th hin bin u vo mang gi tr float.
Sau khi v tam gic chng ta khng mun cc hnh sau b nh hng bi vic
chuyn i. Hm glPushMatrix v glPopMatrix c s dng sao chp thm mt
ma trn hin thi a ln nh ngn xp v loi b ma trn hin thi ra khi ngn xp.
gl.glPushMatrix();

Hm glTranslatef vi 3 tham s cho truc x, y, z dch chuyn i tng (dch


sang tri 0.25 n v v ln 0.5 n vi):
gl.glTranslatef(0.25f, 0.5f, 0.0f);

Xy dng ng dng 3D vi Android


82
______________________________________________________________________

Hm glScalef vi 3 tham s xc nh t l ca i tng theo 3 trc x, y, z (gim


kch thc ca tam gic xung mt na):
gl.glScalef(0.5f, 0.5f, 0.5f);

Hm glRotatef vi 4 tham s l gc quay v 3 tham s i din cho 3 trc x, y, z


quay i tng (quay i tng theo 1 gc xrot theo trc x):
gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);

V tam gic:
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

Phc hi ma trn v thi im ban u:


gl.glPopMatrix();

Tip theo s khng s dng mng mu cho hnh nn s kha chc nng ny li:
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

Tip theo ta s v mt hnh vung c t bng:


gl.glShadeModel(GL10.GL_FLAT);

Ch rng khi khi to con tr nh, s dng 2 tham s u tin i din cho
mi nh:
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, square);

Thay v s dng mng mu ta c th s dng chc nng glColor4f hoc


glColor4x :
gl.glColor4f(0.25f, 0.25f, 0.75f, 1.0f);

Xy dng ng dng 3D vi Android


83
______________________________________________________________________
Vic chuyn i hnh vung cng tng t nh hnh tam gic pha trn
gl.glPushMatrix();
gl.glTranslatef(0.75f, 0.5f, 0.0f);
gl.glScalef(0.5f, 0.5f, 0.5f);
gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 0, 4);
gl.glPopMatrix();

gl.glFlush();
gl.glFinish();
cho php to ra hnh nh ng, s dng chc nng idle, chc nng ny c
gi l vng lp chnh.
tng gc quay ca i tng trn trc x v truc y cng nh v li mn hnh
sau khi thay i, gi hm glutPostRedisplay hoc ugPostRedisplay:
private void idle()
{
xrot += 2.0f;
yrot += 3.0f;
GLU.gluPostRedisplay();
}

Thng bo cho th vin GLUT|ES / UG l chc nng idle c s dng bng


li gi hm glutIdleFunc / ugIdleFunc.
GLU.gluIdleFunc(idle);

Kt qu:

Xy dng ng dng 3D vi Android


84
______________________________________________________________________

Hnh 19 Kt qu php bin i

5.6 Chiu su (Depth):


thm chiu su vo chng trnh, s dng li gi lm depth buffer. depth
buffer c cha mt gi tr cho mi im nh trn mn hnh, gi tr ny trong khong t
0 n 1. iu ny i din cho khong cch t i tng n ngi xem, mi s ng
b c s lin kt su v gi tr. Khi hai gi tr chiu su c so snh th gi tr thp
hn s c hin th trn mn hnh.
Thc hin: Bc u tin l phi bt chc nng depth buffer, iu ny c
thc hin thng qua c GL_DEPTH_TEST trong hm glEnable.
gl.glEnable (GL10.GL_DEPTH_TEST);

C th thay i chiu su bng cch s dng hm glDepthFunc, hm ny ch


nh gi tr trong depth buffer so snh. Cc gi tr ny c m t qua bng sau:
C

M t

GL_NEVER

Khng bao gi i qua

GL_LESS

i qua nu gi tr chiu su a vo nh hn gi tr c lu
tr

Xy dng ng dng 3D vi Android


85
______________________________________________________________________
GL_EQUAL
GL_LEQUAL
GL_GREATER
GL_NOTEQUAL

GL_GEQUAL
GL_ALWAYS

i qua nu gi tr chiu su a vo bng gi tr c lu tr


i qua nu gi tr chiu su a vo nh hn hoc bng gi
tr c lu tr
i qua nu gi tr chiu su a vo ln gi tr c lu tr
i qua nu gi tr chiu su a vo khng bng gi tr c
lu tr
i qua nu gi tr chiu su a vo ln hn hoc bng gi
tr c lu tr
Lun i qua

Gi tr c mc nh l GL_LESS, khi th i qua khi cc gi tr bng nhau th s


xy ra cc i tng c cng cc gi tr z, mn hnh s hin th ty thuc vo th t m
i tng c in ra.
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

Khi th chiu su so snh cc gi tr, phi khi to tt c cc gi tr trong b


m. iu ny c th t c bng cch s dng hm glClearDepthf, hm ny s a
ra mt trong nhng tham s ch ra gi tr v chiu su trong b m dng khi to
cng.
gl.glClearDepthf(1.0f);

V d: hin th mt s hnh tam gic trn mn hnh lm vic vi depth buffer


gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangle);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colors);
gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState (GL10.GL_COLOR_ARRAY);

Xy dng ng dng 3D vi Android


86
______________________________________________________________________

public void display(GL10 gl)


{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity ();
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

V tam gic th 2 hi trn tam gic u tin


gl.glPushMatrix();
gl.glTranslatef(-0.2f, 0.0f, -1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3);

Tam gic th 3 quay 45 theo trc z ca tam gic th 2


gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3);
gl.glPopMatrix();

Cui cng l tam gic t cng vi trc z vi tam gic u tin, y l hnh tam
gic nh nm pha bn phi.
gl.glPushMatrix();
gl.glTranslatef(0.5f, 0.0f, 0.0f);
gl.glScalef(0.5f, 0.5f, 0.5f);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0,3);
gl.glPopMatrix();
gl.glFlush ();
gl.glFinish ();
}

Xy dng ng dng 3D vi Android


87
______________________________________________________________________

Kt qu:

Hnh 20 Kt qu chiu su

5.7 Mu sc v t bng (Color and Shading):


Tt c mu sc trong OpenGL c i din bi 4 gi tr, 3 gi tr mu , xanh
l cy v xanh lam, cui cng l gi tri alpha, iu ny ch th hin r rng 1 mu.
hin th nhiu mu pha trng nhau, ta s s dng mt mng mu.
V d:
Khi to mt mng tam gic:
float[] triangle = {
0.25f, 0.25f, 0.0f,
0.75f, 0.25f, 0.0f,
0.25f, 0.75f, 0.0f,
};

Tip theo, to ra mt mng mu, mi nh l mt mu sc khc nhau, mu ,


xanh l cy v xanh lam:

Xy dng ng dng 3D vi Android


88
______________________________________________________________________
float[] colors = {
1.0f, 0.0f, 0.0f, 1.0f, // point 0 red
0.0f, 1.0f, 0.0f, 1.0f, // point 1 green
0.0f, 0.0f, 1.0f, 1.0f, // point 2 blue
};

Mt bin boolean shaded c to theo di xem c c nh bng hay


khng:
boolean shaded = false;

Thit lp php chiu trc giao:


private void init(GL10 gl) {
gl.glClearColor(0.0f, 0.0f, 0.0f,0.0f);
gl.glMatrixMode (GL10.GL_PROJECTION);
gl.glLoadIdentity ();
gl.glOrthof(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangle);

S dng hm glColorPointer thit lp cho mng mu, hm ny lm vic


ging nh hm glVertexPointer, chng c 4 tham s v tham s u tin xc nh c
4 float (mt gi tr mu) cho mi nh:
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colors);

Kch hot cc nh v mng mu:


gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState (GL10.GL_COLOR_ARRAY);

Xy dng ng dng 3D vi Android


89
______________________________________________________________________
By gi ta thm mu v shading (t bng) vo hnh. C 2 loi t bng, c xc
nh bng cch s dng hm glShadeModel, hm ny s a ra mt trong hai tham s
GL_FLAT v GL_SMOOTH xc nh loi t bng v GL_SMOOTH c thit lp
theo mc nh.
gl.glShadeModel(GL10.GL_FLAT);
}

Thit lp ch mn hnh hin th, trong li gi hm glDrawArrays ta s dng


c GL_TRIANGLES v 3 nh ca tam gic.
Kt qu:

Hnh 21 Kt qu mu sc v t bng

5.8 Hnh khi (Solid Shapes):


p dng x l chiu su v php chiu phi cnh to ra mt i tng hnh khi
3D.
Thc hin: to mt mng cc nh to ra hnh hp, khng to ra bng cch s
dng cc dy tam gic lin tc m to ra n bng cch to ra cc b mt ring bit:
float[] box = {
// front

Xy dng ng dng 3D vi Android


90
______________________________________________________________________
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
// back
-0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
// left
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
// right
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
// top
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
// bottom
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, -0.5f, -0.5f,

Xy dng ng dng 3D vi Android


91
______________________________________________________________________
};

Thit lp mn hnh v xoay nh bnh thng:


public void display(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity ();
GLU.gluLookAt(gl, 0.0f, 0.0f, 3.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

V 2 mt i din c mu ging nhau v vy nn v 2 mt cng mt lc:


gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);

gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);


gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);

gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);


gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4);

gl.glFlush ();
gl.glFinish ();

Xy dng ng dng 3D vi Android


92
______________________________________________________________________
}

Kt qu:

Hnh 22 Kt qu hnh khi

5.9 B lc mt sau (Backface Culling):


Khi to ra i tng 3D nh hnh hp trong hng dn trc, chng ta khng
cn mt sau ca cc mt hnh hp c hin th. Mt k thut c gi l Backface
Culling c s dng ngn chn cc mt trong ca hnh c a ra. iu ny c
th tit kim c thi gian v v b nh.
Thc hin: kch hot ch backface culling bng cch thm dng lnh
glEnable(GL_CULL_FACE) vo hm init().

5.10 nh sng (Lighting):


Vic thm nh sng vo cnh s lm tng tnh chn thc v cch nhn. Bc u
tin cn thc hin l kch hot backface culling nh trong 5.10.
C mt s loi nh sng c th c thm vo hnh:

Xy dng ng dng 3D vi Android


93
______________________________________________________________________
Ambient Light: nh sng bao xung quanh, n khng n t bt k mt hng
no c th, khi nh sng bao xung quanh mt b mt nh sng s c phn x theo
nhiu hng.
Diffuse Light: nh sng khuch tn, n n t mt hng, nh sng khuch tn
tng t nh nh sng bao quanh, n cng c phn x theo nhiu hng.
Specular Light: nh sng phn chiu, cng ging nh nh sng khuch tn
nhng n c phn x theo mt hng, ging nh nh sng ni bt trn b mt trc.
Emissive Light: nh sng ta, nh sng ny n t mt i tng c th, cc
i tng c th gim lng nh sng nhng n khng th phn chiu ra bt k b mt
ngoi no.
Khng ch c th chiu sng cc vt th m cn c th ch nh cc b mt phn
ng nh th no vi nh sng bng cch s dng vector php tuyn.
Php tuyn l mt vector vung gc vi mt b mt, n c s dng trong vic
tnh ton nh sng, cn phi xc nh mt php tuyn cho mi a gic c v b nh
hng bi ngun sng.
V d: to ra 2 mng mu cho nh sng bao quanh v nh sng khuch tn. y
s l mu sc ca nh sng ngun:
float[] lightAmbient = {0.2f, 0.3f, 0.6f, 1.0f};
float[] lightDiffuse = {0.2f, 0.3f, 0.6f, 1.0f};

Tip theo s to ra 1 mng cht liu, mt nh sng bao quanh v mt nh sng


khuch tn cho ngun. V bn cht iu ny lm tng gi tr ca nh sng bi cc gi
tr ca cht liu n lm cho mu sc phn chiu ln cc b mt b mt. Cc mng b
mt di mt n 40% nh sng , mi gi tr tng trng cho mu m n phn xa.
float[] matAmbient = {0.6f, 0.6f, 0.6f, 1.0f};
float[] matDiffuse = {0.6f, 0.6f, 0.6f, 1.0f};
private void init(GL10 gl) {

Xy dng ng dng 3D vi Android


94
______________________________________________________________________

Bt c GL_LIGHTING trong hm glEnable, iu ny cho php s dng nh


sng trong OpenGL:
gl.glEnable (GL10.GL_LIGHTING);

OpenGL ES cho php c ti a 8 ngun sng t bt k im no, kch hot


c cc ngun sng ny phi bt c GL_LIGHTX trong hm glEnable, X l gi tr t
0 n 7.
gl.glEnable (GL10.GL_LIGHT0);

Xc nh cc thng s cht liu cho cc m hnh chiu sng, thng qua cc hm


glMaterialfv v glMaterialf cng vi 3 tham s.
+ Tham s th nht l c GL_FRONT_AND_BACK.
+ Tham s th hai dng xc nh loi ngun sng mun s dng nh
GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION v
GL_AMBIENT_AND_DIFFUSE.
+ Tham s cui cng l mt mng hoc mt gi tr.
gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT,
matAmbient);
gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE,
matDiffuse);

Ging nh vic thit lp cht liu, nh sng cng c thit lp nh vy, iu


ny c thc hin bng cch s dng hm glLightfv v glLightf :
gl.glLightv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient);
gl.glLightv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse);

Phn cn li ca hm Init vn c gi nguyn

Xy dng ng dng 3D vi Android


95
______________________________________________________________________
gl.glEnable (GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);

gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);


gl.glClearDepthf(1.0f);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, box);


gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);

gl.glEnable (GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);
}

Phn u ca hm display vn c gi nguyn


public void display(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity ();
GLU.gluLookAt(gl, 0.0f, 0.0f, 3.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

phn trn chng ta ni v php tuyn, cc php tuyn ny cn vung gc


vi b mt, bi vy b mt pha trc c mt vector php tuyn (0,0,1), pha sau l

Xy dng ng dng 3D vi Android


96
______________________________________________________________________
(0,0,-1). di 2 vector ny l 1. Cc php tuyn c xc nh bng hm glNormal3f
v n c gi trc khi v hnh, hm ny c 3 tham s float.
// front and back
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glNormal3f(0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 0, 4);
gl.glNormal3f(0.0f, 0.0f, -1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 4, 4);

iu ny cng c thc hin cho pha trn, pha di v cc mt:


// left and right
gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
gl.glNormal3f(-1.0f, 0.0f, 0.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 8, 4);
gl.glNormal3f(1.0f, 0.0f, 0.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 12, 4);

// top and bottom


gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
gl.glNormal3f(0.0f, 1.0f, 0.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 16, 4);
gl.glNormal3f(0.0f, -1.0f, 0.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 20, 4);

gl.glFlush ();
gl.glFinish ();
}

Xy dng ng dng 3D vi Android


97
______________________________________________________________________
Color tracking s t ng t thuc tnh cht liu theo li gi n glColor4f ,
vic lm ny s lm cho cc mt phn x nh sng vi mu sc khc nhau. Vic bt v
tt color tracking thng qua c GL_COLOR_MATERIAL trong hm glEnable.

Kt qu:
Normal Lighting

Color Tracking

Hnh 23 Kt qu nh sng
5.11 nh hng nh sng (Directional Lighting):
Trong phn trc ta thm nh sng vo cnh, nhng nh sng khng n t
mt hng c th. Trong phn ny ta s gii quyt vic nh hng ngun sng, iu
ny s cho php ta s dng li ch ca khuch tn v phn chiu nh sng.
Thc hin: to cc mng nh sng cho cc c tnh nh sng:
float[] lightAmbient = {0.2f, 0.0f, 0.0f, 1.0f};
float[] lightDiffuse = {0.5f, 0.0f, 0.0f, 1.0f};
float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};

Xy dng ng dng 3D vi Android


98
______________________________________________________________________
Mt mng specular cho cht liu:
float[] matAmbient = {1.0f, 1.0f, 1.0f, 1.0f};
float[] matDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
float[] matSpecular = {1.0f, 1.0f, 1.0f, 1.0f};

V y l nh hng ngun sng nn chng ta cn phi bit v tr ca nh sng


v hng ca n. on code di y s to ra 2 mng t nh sng trong khng
gian pha bn phi ca qu bng, n s hng v pha gc nn cn 1 vector ch phng
hng (-2, -2, -3).
float[] lightPosition = {2.0f, 2.0f, 3.0f, 0.0f};
float[] lightDirection = {-2.0f, -2.0f, -3.0f};

Ngun sng s c bt cng vi nhng nh sng u tin:


private void init(GL10 gl) {
gl.glEnable (GL10.GL_LIGHTING);
gl.glEnable (GL10.GL_LIGHT0);

Tt c cc thuc tnh cho cht liu bao gm c gi tr specular:


gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT,
matAmbient);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE,
matDiffuse);
gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR,
matSpecular);

Mt thit lp khc bng cch s dng chc nng glMaterialf vi c tnh


GL_SHININESS. Gi tr shininess trong khong t 0 n 128.
gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHNINESS, 20.0f);

Xy dng ng dng 3D vi Android


99
______________________________________________________________________

Bc tip theo l thit lp thuc tnh nh sng:


gl.glLightv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient);
gl.glLightv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse);
gl.glLightv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lightSpecular);

Thit lp v tr v nh hng nh sng thng qua c GL_POSITION v


GL_SPOT_DIRECTION trong hm glLightfv:
gl.glLightv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositon);
gl.glLightv(GL10.GL_LIGHT0, GL10.GL_SPOT_DIRECTION,
lightDirection);

Mt c khc GL_SPOT_CUTOFF c s dng xc nh kch c ca ngun


sng :
gl.glLightf(GL10.GL_LIGHT0, GL10.GL_SPOT_CUTOFF, 1.2f);

Tip theo ta s s dng c GL_SPOT_EXPONENT dng xc nh cch thc


tp trung ca ngun sng nh c GL_SHININESS vi gi tr t 0 n 128:
gl.glLightf(GL10.GL_LIGHT0, GL10.GL_SPOT_EXPONENT, 20.0f);

Phn cn li ca hm Init vn c gi nguyn, hin c 3 c c s dng trong hm


glLightf

GL_CONSTANT_ATTENUATION(1),

GL_LINEAR_ATTENUATION(0) v GL_QUADRATIC_ATTENUATION vi cc
gi tr hin th mc nh trong du (). Cng nh sng b suy yu khi di chuyn
mng ra xa khi ngun sng.
gl.glEnable (GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);

gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

Xy dng ng dng 3D vi Android


100
______________________________________________________________________
gl.glClearDepthf(1.0f);

gl.glEnable (GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);
}

Mn hnh hin th s dng chc nng glutSolidSphere / ugSolidSpheref to


ra mt hnh cu, hnh cu ny c to ra vi 24 stacks v 24 slices, y l thnh phn
ngang va dc ca hnh cu. Chc nng shape ca th vin UG / GLUT|ES s t ng
to ra mt mng vector php tuyn v s dng, mi php tuyn s c tnh ton trong
th vin ny.
public void display(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity ();
GLU.gluLookAt(gl, 0.0f, 0.0f, 4.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);

gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);


gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

gl.glFlush ();
gl.glFinish ();
}

Xy dng ng dng 3D vi Android


101
______________________________________________________________________
Kt qu:

Hnh 24 Kt qu nh hng nh sng

5.12 Dn cht liu (Texture Mapping):


i khi chng ta cn th hin mt i tng phc hp, mt trong nhng cch
lm c iu ny l thm cht liu vo i tng l v n c gi l texture
mapping.
Thc hin: bc u tin ca texture mapping l np cc file cht liu t bn
ngoi. Cc file ny c th c cc ui nh .bmp, .jpg, .gif, .png v.vTrong phn ny ta
ch lm vic vi file bmp bi v n d np vo nht. OpenGL ES ch lm vic vi
nhng nh c kch thc l ly tha ca 2 nh 64x64, 128x128, 256x128 v.v
Tt c cc cht liu u c mt nh dng c th. iu ny c th hin nh l
mt unsigned integer, chng ta s to ra mt mng cha mt cht liu.
private int texture[1];
private Bitmap bmp;
private int tex;

Xy dng ng dng 3D vi Android


102
______________________________________________________________________

Sau khi ti cht liu vo chng ta phi ch r cht liu s xut hin nh th no
trn i tng. iu ny c thc hin bng li gi hm texture coordinates.
Texture coordinates c ta trong khong t 0 n 1, ta (0. 0) l pha di
bn tri ca cht liu v (0, 1) l pha trn bn phi.
on code di y to ra 1 mng c s dng lu tr texture coordinates:
float[] texCoords = {
// front
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
// back
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 1.0f,
// left
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
// right
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
// top
0.0f, 0.0f,

Xy dng ng dng 3D vi Android


103
______________________________________________________________________
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
// bottom
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f,
0.0f, 1.0f,
}

Thay v t cc lnh np nh bitmap v dn cht liu trong hm Init. Ta s t


n trong hm loadTextures.
private int loadTexture (GL10 gl, Bitmap bmp)
{
ByteBuffer bb = ByteBuffer.allocateDirect(
bmp.getHeight()*bmp.getWidth()*4);
bb.order(ByteOrder.nativeOrder());
IntBuffer ib = bb.asIntBuffer();

for (int y=0;y<bmp.getHeight();y++)


for (int x=0;x<bmp.getWidth();x++) {
ib.put(bmp.getPixel(x,y));
}
ib.position(0);
bb.position(0);

Nh ni pha trn, mi cht liu trong OpenGL c gi thng qua tn


ca cht liu. to ra cc nh danh, chng ta cn s dng chc nng glGenTextures,
chc nng ny c hai tham s, tham s u tin xc nh c bao nhiu cht liu

Xy dng ng dng 3D vi Android


104
______________________________________________________________________
mun to ra. Tham s th hai l mt con tr tr ti mng unsigned integers. iu ny
s gip to ra cc tn cho cht liu.
gl.glGenTextures(1, texture, 0);

By gi th tn ca cht liu c to ra, phi la chn cht liu mun thit


lp. iu ny thc hin c bng cch s dng hm glBindTexture. Hm ny c hai
tham s, tham s u tin l GL_TEXTURE_2D v tham s th hai l cht liu mun
la chn.
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]);

Sau khi la chn cht liu, chng ta phi thit lp cc thuc tnh cho n.
Chng ta cn phi xc nh cht liu l cc kt cu 2D v cc thuc tnh n c. iu
ny c thc hin qua hm glTexImage2D hm ny c mt s cc tham s:
+ GLenum

target:

iu

ny

xc

nh

ch

ca

cht

liu

GL_TEXTURE_2D, OpenGL ES khng h tr cht liu 1D hoc 3D.


+ GLint level: dng xc nh mc chi tit, 0 l cp hnh nh c
bn, n ch c s dng cho mipmaps.
+ GLint internalFormat: iu ny xc nh mu sc cho cc thnh phn bn
trong cht liu. N c th l GL_ALPHA, GL_RGB, GL_RGBA,
GL_LUMINANCE hoc GL_LUMINANCE_ALPHA nhng chng ta
thng ch s dng 2 c GL_RGB hoc GL_RGBA. C GL_RGBA ch
c s dng khi s dng mt nh cha gi tr anpha nh tp tin tga.
+ GLsizei width & GLsizei height: dng xc nh chiu rng v chiu cao
ca nh. iu ny c th ly t cu truc BITMAPINFOHEADER.
+ GLint border: rng ca ng bin. N c gi tr l 0.
+ GLenum format: iu ny c a ra cng gi tr nh l tham s
internalFormat.

Xy dng ng dng 3D vi Android


105
______________________________________________________________________
+ GLenum type: dng xc nh kiu d liu ang c lu tr nh v d
nh GL_UNSIGNED_BYTE v GL_UNSIGNED_SHORT.
+ const GLvoid *pixels: iu ny ch ra ni m nh c lu tr.
Nu ch mun s dng mt phn ca hnh nh, chc nng glTexSubImage2D
c th c s dng. Cc tham s ca n ging nhau ngoi tr tham s
internalFormat, c hai tham s khc l GLint xoffset v GLint yoffset, iu ny ch
ra khong cch x, y cho nh.
gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA,
bmp.getWidth(), bmp.getHeight(), 0, GL10.GL_RGBA,
GL10.GL_UNSIGNED_BYTE, bb);

thit lp cc thuc tnh khc cho cht liu, chc nng glTexParameterf
c s dng. N cn 3 tham s, tham s u tin l GL_TEXTURE_2D, tham s th
hai GL_TEXTURE_MIN_FILTER hoc GL_TEXTURE_MAG_FILTER, tham s th
ba xc nh thuc tnh - GL_LINEAR.
gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

Trong hm Init, s thm li gi hm n loadTextures.


private void init(GL10 gl)
{
// Loading texture
bmp = BitmapFactory.decodeResource
(mContext.getResources(), R.drawable.tuong);
tex = loadTexture(gl, bmp);

Xy dng ng dng 3D vi Android


106
______________________________________________________________________
bt chc nng texture mapping, chng ta cn phi s dng c
GL_TEXTURE_2D trong hm glEnable.
gl.glEnable (GL10.GL_TEXTURE_2D);
gl.glEnable (GL10.GL_LIGHTING);
gl.glEnable (GL10.GL_LIGHT0);

Nh lm trn vertices, cn phi xc nh v tr ca texture coordinates, ngoi


tr s dng chc nng glTexCoordPointer. Ch rng gi tr 2 c s dng cho tham
s u tin bi v mi texture coordinate ch c 2 gi tr.
gl.glVertexPointer (3, GL10.GL_FLOAT, 0, box);
gl.glTexCoordPointer (2, GL10.GL_FLOAT, 0, texCoords);

Bc cui cng l cho php bt mng texture coordinate thng qua c


GL_TEXTURE_COORD_ARRAY trong hm glEnableClientState
gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState (GL10.GL_TEXTURE_COORD_ARRAY);

public void display(GL10 gl)


{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity ();
GLU.gluLookAt(gl, 0.0f, 0.0f, 4.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);

gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);


gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

Xy dng ng dng 3D vi Android


107
______________________________________________________________________

ugSolidSpheref(1.0f, 24, 24);


// front and back
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 0, 4);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 4, 4);

// left and right


gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 8, 4);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 12, 4);

// top and bottom


gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 16, 4);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 20, 4);

gl.glFlush ();
gl.glFinish ();
}

Mt hm menu dng bt v tt nh sng. Khi tt nh sng, mu sc s dng


khi to ra cc mt s c kt hp vo trong cht liu. Khi nh sng c bt, nh sng
phn x s phn x mt s lng nh sng bng nhau cho tt c cc mu, do cht
liu s c xut hin nh bnh thng.

Xy dng ng dng 3D vi Android


108
______________________________________________________________________
5.13 Hm cht liu (Texture Functions):
Trong phn trc gii thiu ngn gn v hm glTexParameterf. Phn ny s
tho lun tip v chc nng ny vi nhiu kha cnh khc nhau.
Texture Filters: b lc cht liu cho php cht liu c hin th cng vi cc
cht lng khc nhau.
Repeating and Clamping: cht liu c th c lp i lp li trn i tng.
Mipmaps: to ra thm cht liu ca cng mt hnh nh. Nu c mt bc nh c
64x64. Hnh nh c to ra thm c th l (32x32, 16x16, ..., 1x1). Cht liu chnh
xc s c hin th ty thuc vo khong cch ca cc mng i tng, cc mng i
tng xa hn th s dng lp cht liu nh hn. iu ny c th tit kim c thi
gian x l.
V d: chng ta s to ra 4 cht liu khc nhau v theo di cht liu bng cch
s dng bin filter.
private int texture[4];
private short filter = 0;

Ta cht liu vn gi nguyn nh phn trc ngoi tr cc b mt bn. Lu


thng tin c gi tr t 0 n 1. Chng ta c th s dng gi tr ln hn 1. Nh vy s
gy ra lp li cht liu hay dng khi c gi tr l 1, iu ny s c gii thch r hn
phn di.
float[] texCoords = {
// front
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
// back
1.0f, 0.0f,

Xy dng ng dng 3D vi Android


109
______________________________________________________________________
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
// left
2.0f, 0.0f,
2.0f, 2.0f,
0.0f, 0.0f,
0.0f, 2.0f,
// right
2.0f, 0.0f,
2.0f, 2.0f,
0.0f, 0.0f,
0.0f, 2.0f,
// top
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
// bottom
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
}

Xy dng hm loadTextures v np file .bmp nh phn trc.


To ra 4 tn cht liu:
gl.glGenTextures(4, texture, 0);

Xy dng ng dng 3D vi Android


110
______________________________________________________________________
La chn cht liu u tin v thit lp cc thuc tnh nh hng dn trc.
S khc bit y l chng ta dng c GL_NEAREST trong thuc tnh ca b lc
thay cho GL_LINEAR. B lc ny nhanh hn nhng nhn khng c tt lm.
// texture 1
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]);

gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA,
bmp.getWidth(), bmp.getHeight(), 0, GL10.GL_RGBA,
GL10.GL_UNSIGNED_BYTE, bb);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);

Trong cht liu th hai s dng GL_LINEAR to ra cht liu nhn tt hn.
// texture 2
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[1]);

gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA,
bmp.getWidth(), bmp.getHeight(), 0, GL10.GL_RGBA,
GL10.GL_UNSIGNED_BYTE, bb);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

Xy dng ng dng 3D vi Android


111
______________________________________________________________________

Cht liu th ba cng ging nh cht liu th hai ngoi tr hai thuc tnh mi
c

thit

lp.

thuc

tnh

GL_TEXTURE_WRAP_S

GL_TEXTURE_WRAP_T. iu ny ch ra cht liu lm th no bao bc theo cc


hng ngang v dc tng ng.
// texture 3
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[2]);

gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA,
bmp.getWidth(), bmp.getHeight(), 0, GL10.GL_RGBA,
GL10.GL_UNSIGNED_BYTE, bb);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);

Th t l s dng cc k thut cao ca mipmaps. Mipmaps yu cu b nh nhiu


hn nhng n c th lm cho chng trnh chy nhanh hn rt nhiu. t ng to ra
mipmaps thit lp thuc tnh L_GENERATE_MIPMAP ti GL_TRUE bng li gi
hm glParameterf. GL_TEXTURE_MAG_FILTER vn nh c nhng thuc tnh

Xy dng ng dng 3D vi Android


112
______________________________________________________________________
GL_TEXTURE_MIN_FILTER phi thay i. B lc ny phi c thit lp
GL_X_MIPMAP_Y ni m X v Y c th LINEAR hoc NEAREST. iu ny dng
xc nh cht lng ca cht liu c hin th. R rng NEAREST nhn khng tt
bng LINEAR.
// texture 4
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[3]);

gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA,
bmp.getWidth(), bmp.getHeight(), 0, GL10.GL_RGBA,
GL10.GL_UNSIGNED_BYTE, bb);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_LINEAR_MIPMAP_NEAREST);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

gl.glTexParameterf(GL10.GL_TEXTURE_2D,
GL10.GL_GENERATE_MIPMAP, GL10.GL_TRUE);

gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[filter]);

Kt qu:

Xy dng ng dng 3D vi Android


113
______________________________________________________________________

Hnh 25 Kt qu dn cht liu

5.14 Pha trn mu (Blending):


Phn ny s gii thiu v cch pha trn mu. Vic pha trn mu sc rt hu ch
cho cc hiu ng v d nh: thy tinh, nc, mn hnh v.v..
Mt phn thit yu ca vic trn mu l gi tr alpha m chng ta ch nh cho
tt c mu sc. Alpha c gi tr bng 0 th hin mt b mt hon ton trong sut v gi
tr bng 1 th hin mt b mt m c.
Khi lm vic vi s trn mu chng ta phi lun nh n 2 mu khc nhau. Th
nht l gi tr ca mu ngun (gi tr hin ti thm vo) v bn ghi ca gi tr mu (gi
tr tn ti trong b m). Mu sc s c lm ty thuc vo gi tr alpha.
Trong phn ny ta s thit lp gc nhn theo chiu trc giao vi cc tham s:
gl.glOrthof(0.0f, 3.0f, 0.0f, 3.0f, -1.0f, 1.0f);

Chng ta s t mt s hnh ch nht chng ln nhau trn mn hnh, cc nh


hnh ch nht c a ra mng di y.
float[] rectangle = {
-1.0f, -0.25f,

Xy dng ng dng 3D vi Android


114
______________________________________________________________________
1.0f, -0.25f,
-1.0f, 0.25f,
1.0f, 0.25f,
};

Chng ta s hin th cc kt hp khc nhau ca vic trn mu. Bin currBlend s


t chc nhng loi mu trn ang c thc hin.
int currBlend = 4;

Chc nng Init ca chng ta s la chn mt mu xa mn hnh. Chng ta s


khng s dng chiu su trong chc nng ny.
private void init(GL10 gl) {
gl.glClearColor(0.25f, 0.25f, 0.25f,1.0f);

kch hot chc nng pha mu chng ta phi s dng c GL_BLEND ca


glEnable.
gl.glEnable(GL10.GL_BLEND);

Mt chc nng quan trng glBlendFunc c s dng ch nh mu sc nh


th no trong vic trn mu. Hm ny c 2 tham s, c 2 tham s c th chp nhn
c cc gi tr sau:
-

GL_ZERO

GL_ONE

GL_SRC_COLOR

GL_ONE_MINUS_SRC_COLOR

GL_DST_COLOR

GL_ONE_MINUS_DST_COLOR

Xy dng ng dng 3D vi Android


115
______________________________________________________________________
-

GL_SRC_ALPHA

GL_ONE_MINUS_SRC_ALPHA

GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA

Tham s u tin cng c th chp nhn gi tr GL_SRC_ALPHA_SATURATE


gl.glBlendFunc(GL10.GL_SRC_ALPHA,
GL10.GL_ONE_MINUS_SRC_ALPHA);
}

Cc mng di y s dng chuyn i gia cc v d ca vic trn mu:


private int[] blendSrc = {
GL10.GL_ONE,
GL10.GL_ONE,
GL10.GL_ONE,
GL10.GL_SRC_ALPHA,
GL10.GL_SRC_ALPHA
};
private int[] blendDst={
GL10.GL_ZERO,
GL10.GL_ONE,
GL10.GL_ONE_MINUS_DST_ALPHA,
GL10.GL_ONE,
GL10.GL_ONE_MINUS_SRC_ALPHA
};

Chc nng display l ni 4 hnh ch nht to thnh 1 hnh vung:


public void display(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT );
gl.glLoadIdentity ();

Xy dng ng dng 3D vi Android


116
______________________________________________________________________

gl.glVertexPointer(2, GL10.GL_FLOAT, 0, rectangle);


gl.glEnableClientState (GL10.GL_VERTEX_ARRAY);

gl.glPushMatrix();
gl.glTranslatef(1.5f, 2.0f, 0.0f);
gl.glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 0,4);
gl.glPopMatrix();

gl.glPushMatrix();
gl.glTranslatef(0.7f, 2.0f, 0.0f);
gl.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
gl.glColor4f(0.0f, 1.0f, 0.0f, 0.5f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 0,4);
gl.glPopMatrix();

gl.glPushMatrix();
gl.glTranslatef(1.7f, 1.5f, 0.0f);
gl.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
gl.glColor4f(0.0f, 0.0f, 1.0f, 0.25f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 0,4);
gl.glPopMatrix();

gl.glPushMatrix();
gl.glTranslatef(1.5f, 1.0f, 0.0f);
gl.glColor4f(1.0f, 1.0f, 0.0f, 0.75f);
gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 0,4);
gl.glPopMatrix();

Xy dng ng dng 3D vi Android


117
______________________________________________________________________

gl.glFlush ();
gl.glFinish ();
}

Chng ta s to thm chc nng menu x l la chn Blending Function v


thay i vic trn mu.
++currBlend %=5;
gl.glBlendFunc(blendSrc[currBlend],
blendDst[currBlend]);

Sau khi chy chng trnh, c th thay i ch chn mu. Chc nng trn
mu (GL_ONE, GL_ZERO) lm cho mu sc khng b pha trn.

Hnh 26 Pha mu (GL_ONE, GL_ZERO)


Chc nng trn mu tip theo l (GL_ONE, GL_ONE). iu ny v c bn l
c mu ngun v mu ch, chng c trn vo vi nhau. Mt hn hp ca mu xanh

Xy dng ng dng 3D vi Android


118
______________________________________________________________________
l cy v mu to ra mu vng nh chng ta nhn thy gc trn bn tri. Thanh
mu vng c mu xanh l cy gi tr l 1. Thanh mu xanh l cy c s pha trn ca
mu vng nn vn gi nguyn mu vng. Khi mu vng c pha trn vi mu xanh
lc. Gi tr mu sc tr thnh 1 kt qu hin th mu trng.

Hnh 27 Pha mu (GL_ONE, GL_ONE)


Tip theo l chc nng (GL_ONE, GL_ONE_MINUS_DST_ALPHA). Kt hp
nhng gi tr alpha, iu ny to ra mt cht minh bch nhng mu vng pha trn vi
mu xanh l cy vn gi nguyn mu vng, mu vng pha trn vi mu xanh l cy s
ra mu trng nh trc.

Xy dng ng dng 3D vi Android


119
______________________________________________________________________

Hnh 28 Pha mu (GL_ONE, GL_ONE_MINUS_DST_ALPHA)


Chc nng trn k tip l (GL_SRC_ALPHA, GL_ONE), to ra mt hnh tt
hn, minh bch hn. Tt c cc hnh ch nht gi xut hin minh bch, hnh ch
nht mu vng gi b m hn n c gi tr alpha l 0.75. Hnh ch nht mu xanh cng
nh vy n c gi tr alpha bng 0.25.

Hnh 29 Pha mu (GL_SRC_ALPHA, GL_ONE)

Xy dng ng dng 3D vi Android


120
______________________________________________________________________
Mc d vic trn mu l kh tt, nhng vn c th lm tt hn bng chc
nng trn mu:

Hnh 30 Pha mu (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

5.15 Minh bch i tng (Transparency):


Trong phn trc ni v cch lm vic vi s pha mu, vic lm ny rt hu
ch cho vic lm minh bch i tng, trong phn ny s lm minh bch mt i tng
3D.
Thc hin:
Bc u tin l bt chc nng trn mu trong hm Init:
gl.glEnable(GL10.GL_BLEND);

Chc nng pha trn c s dng l (GL_SRC_ALPHA, GL_ONE)


gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);

Xy dng ng dng 3D vi Android


121
______________________________________________________________________
Mun tt c cc a gic c v ra bi vy chng ta s v hiu ha chc nng
depth testing. C chiu su s lm cho cc a gic pha sau khng c hin th.
gl.glDisable(GL10.GL_DEPTH_TEST);

Trong hm menu:
if (gl.glIsEnable(GL10.GL_BLEND)){
gl.glDisable(GL10.GL_BLEND);
gl.glEnable(GL10.GL_DEPTH_TEST);
}
else{
gl.glEnable(GL10.GL_BLEND);
gl.glDisable(GL10.GL_DEPTH_TEST);
}
break;

Chng ta c th to ra mt s hiu ng tt bng cch kch hot hay v hiu ha


nh sng. S khc bit khi nh sng b v hiu ha s c hin th di y.

5.16 Hiu ng sng m (Fog):


Hiu ng sng m c th rt hu ch cho mt s cc ng dng. V d, chng ta
ang to ra mt tr chi m c th di chuyn t quc gia ny n quc gia khc,
hin nhin chng ta khng th hin th y mi th hai ni, iu ny s gy ra s
lng ph, v cng khng mun cnh vt bt ng xut hin. Hiu ng sng m c s
dng to cm gic c mt lp sng m lm gim kh nng nhn.
Hiu ng sng m cng lm cho cnh vt tr ln hin thc hn bng cc t
Fog trong nhng khu vc c sng m nh l cnh mt thung lng.

Xy dng ng dng 3D vi Android


122
______________________________________________________________________
Hiu ng sng m c th c mu sc c th, bi vy cn to ra mt mng
lu tr mu sc ny, y chng ta s dng lp sng m mu xm.
float[] fogColor = {0.5f, 0.5f, 0.5f, 1.0f};

C 3 ch sng m:
C

M t

GL_EXP

y l dng n gin nht ca Fog, i tng khng thc s xut


hin di chuyn vo hoc ra khi Fog. iu ny n gin ch l
vic to ra mt lp sng m.

GL_EXP2

y l dng cao hn ca Fog. i tng c th xut hin ngay khi


di chuyn vo hoc ra khi Fog. Lp sng m khng xut hin
hon ton trong thc t nh l cc ng c th khi nhn vo mt
im ni m i tng i chuyn ra khi Fog

GL_LINEAR y l cch hin thi Fog mt cc thc t nht, i tng c th vo


v ra khi Fog mt cch ng cch nht, em li hiu ng sng
m mt cch tt nht.
Mc d GL_LINEAR l ch sng m thc t nht, nhng iu ny khng
c ngha l phi lun lun s dng n, r rng cc hiu ng sng m tt hn s lm
chng trnh chy chm hn, vy nn ch c chn s ph thuc hon ton trn
ng dng.
Chng ta s to mt mng cha ch sng m, cho php chng d dng
thay i, v mt s nguyn xc nh xem ch sng m no ang c s dng.
float[] fogTypes = {
GL10.GL_EXP, GL10.GL_EXP2, GL10.GL_LINEAR };
int fogType =0;

Xy dng ng dng 3D vi Android


123
______________________________________________________________________
Hai chc nng s dng nhiu nht khi lm vic vi Fog l chc nng glFogf v
glFogfv. Chc nng glFogx v glFogxv l cc chc nng c sn ca OpenGL ES. Chc
nng glFogf chp nhn 2 tham s, tham s u tin l c dng xc nh cc thuc
tnh ca sng m c thay i, tham s th hai l gi tr float dng gn cc thuc
tnh ny.
Bng di y s miu t cc thuc tnh ca Fog v cc gi tr float m n s dng:

Gi tr float

GL_FOG_MODE

GL_EXP,

GL_FOG_DENSITY

Miu t
GL_EXP2 Xc nh ch sng m nh

hoc GL_LINEAR

gii thch trn

> 0.0f (mc nh 1.0f)

iu ny ch ra lp sng m
nh th no gi l dy c. Gi
tr cng cao th lp sng m
cng dy c

GL_FOG_START

Any float (mc nh Xc nh khong cch gn nht


0.0f)

GL_FOG_END

ca sng m

Any float (mc nh Xc nh khong cch xa nht


1.0f)

ca sng m

Thit lp ch sng m ban u ti GL_EXP.


private void init(GL10 gl)
{
gl.glFogf(GL10.GL_FOG_MODE, GL10.GL_EXP);

Chc nng glFogfv c s dng cho mt thuc tnh. y l thuc tnh


GL_FOG_COLOR, n dng miu t mu sc ca sng m. Tham s th hai chp

Xy dng ng dng 3D vi Android


124
______________________________________________________________________
nhn mt mng float, chng ta s dng mng mu fogColor cho chc nng ny.Tham
s th ba l offset.
gl.glFogfv(GL10.GL_FOG_COLOR, fogColor, 0);

Tip theo, thit lp mt sng m.


gl.glFogf(GL10.GL_FOG_DENSITY, 0.35f);

Mt chc nng khc khng dnh ring cho Fog l hm glHint, chc nng ny
cho php xc nh nhng th quan trng nh hnh/tc . Tham s u tin c th l
mt

gi

tr

nh

GL_FOG_HINT,

GL_LINE_SMOOTH_HINT,

GL_PERSPECTIVE_CORRECTION_HINT v GL_POINT_SMOOTH_HINT. Tham


s th 2 c th c l GL_DONT_CARE, GL_FASTEST hoc GL_NICEST. Nu
mun lp sng m l tt nht c th, th phi s dng c GL_NICEST. Cn nu quan
tm nhiu hn n tc

th s dng c GL_FASTEST. Gi tr mc nh l

GL_DONT_CARE. iu ny lm nng cao hiu qu ca sng m.


Khong cch gn va xa ca lp sng m
gl.glFogf(GL10.GL_FOG_START, 1.0f);
gl.glFogf(GL10.GL_FOG_END, 5.0f);

Nh tt c cc phn khc ca OpenGL ES, phi kch hot chc nng sng m
thng qua c GL_FOG ca hm glEnable.
gl.glEnable (GL10.GL_FOG);

By gi c th kch hot v khi chy Fog trong hm init, c th hin th chng


trn Display. Thay v s dng chc nng ugluLookAtf, chng ta c th dich chuyn ma
trn modelview.
private void display(GL10 gl)

Xy dng ng dng 3D vi Android


125
______________________________________________________________________
{

gl.glTranslatef(0.0f, 0.0f, -5.0f);

Phn cui cng l dng menu la chn ch Fog, bng cch s dng mng
fogTypes.
++fogType %=3;
gl.glFogf(GL10.GL_FOG_MODE, fogTypes[fogType]);

Kt qu:

Hnh 31 Hiu ng sng m

Xy dng ng dng 3D vi Android


126
______________________________________________________________________
PHN B: CHNG TRNH DEMO
Chng 6: Demo k thut v hnh 3D trn Android

6.1 Gii thiu chng trnh:

Qua tm hiu l thuyt v ng dng Android, mt s k thut ha 3D


ca OpenGL ES v vn dng cc kin thc thu thp c lm nn tng bc
u cho vic thit kt mt ng dng 3D trn Android.
Chng trnh demo li cc hm chc nng trnh by chng 5 v v
mt s dng hnh hc khng gian 3D, x l s kin chm mt s chc nng
nh nh sng, cht liu, chiu su, v hnh.

6.2 Cc chc nng:


6.2.1 Menu:
nh ngha mt cu trc menu trong file menu_demo.xml, sau nh x file
xml ny vo vo hm to menu trong activity chnh ca chng trnh. nh ngha cc
chui s hin th trn cc menu item trong file strings.xml
File menu_demo.xml:

Xy dng ng dng 3D vi Android


127
______________________________________________________________________
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/chatlieu"
android:icon="@drawable/icon"
android:title="@string/chatlieu" />
<item android:id="@+id/suongmu"
android:icon="@drawable/icon"
android:title="@string/suongmu" />
<item android:id="@+id/vehinh"
android:icon="@drawable/icon"
android:title="@string/vehinh" >
<menu>
<item android:id="@+id/mattru"
android:title="@string/mattru" />
<item android:id="@+id/matnon"
android:title="@string/matnon" />
<item android:id="@+id/matnoncut"
android:title="@string/matnoncut" />
<item android:id="@+id/matcau"
android:title="@string/matcau" />
</menu>
</item>

<item android:id="@+id/phamau"
android:icon="@drawable/icon"
android:title="@string/phamau" >
<menu>
<item android:id="@+id/phamau0"
android:title="@string/phamau0"
<item android:id="@+id/phamau1"
android:title="@string/phamau1"
<item android:id="@+id/phamau2"
android:title="@string/phamau2"
<item android:id="@+id/phamau3"
android:title="@string/phamau3"
<item android:id="@+id/phamau4"
android:title="@string/phamau4"
</menu>
</item>

/>
/>
/>
/>
/>

Xy dng ng dng 3D vi Android


128
______________________________________________________________________

<item android:id="@+id/phepbiendoi"
android:icon="@drawable/icon"
android:title="@string/phepbiendoi" >
<menu>
<item android:id="@+id/tinhtien"
android:title="@string/tinhtien" />
<item android:id="@+id/quay"
android:title="@string/quay" />
<item android:id="@+id/tile"
android:title="@string/tile" />
<item android:id="@+id/kethop"
android:title="@string/kethop" />
</menu>
</item>
<item android:id="@+id/phepchieu"
android:icon="@drawable/icon"
android:title="@string/phepchieu" >
<menu>
<item android:id="@+id/trucgiao"
android:title="@string/trucgiao" />
<item android:id="@+id/phoicanh"
android:title="@string/phoicanh" />
</menu>
</item>
<item android:id="@+id/anhsang"
android:icon="@drawable/icon"
android:title="@string/anhsang" />
<item android:id="@+id/chieusau"
android:icon="@drawable/icon"
android:title="@string/chieusau" />
<item android:id="@+id/duongham"
android:icon="@drawable/icon"
android:title="@string/duongham" />
</menu>

Xy dng ng dng 3D vi Android


129
______________________________________________________________________

File strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Nguyen Chi Tam - Nguyen Phi
Cuong</string>
<string name="app_name">DemoOpenglES</string>
<string name="chatlieu">Chat lieu</string>
<string name="suongmu">Suong mu</string>
<string name="phepchieu">Phep chieu</string>
<string name="trucgiao">Truc giao</string>
<string name="phoicanh">Phoi canh</string>
<string name="phepbiendoi">Phep bien doi</string>
<string name="tinhtien">Tinh tien</string>
<string name="quay">Quay</string>
<string name="tile">Ti le</string>
<string name="anhsang">Anh sang</string>
<string name="chieusau">Chieu sau</string>
<string name="phamau">Pha mau</string>
<string name="kethop">Ket hop</string>
<string name="phamau0">ONE - ZERO</string>
<string name="phamau1">ONE - ONE</string>
<string name="phamau2">ONE - ONE_MINUS_DST_ALPHA</string>
<string name="phamau3">SRC_ALPHA - ONE</string>
<string name="phamau4">SRC_ALPHA ONE_MINUS_SRC_ALPHA</string>
<string name="vehinh">Ve hinh</string>
<string name="mattru">Mat tru</string>
<string name="matnon">Mat non</string>
<string name="matnoncut">Mat non cut</string>
<string name="matcau">Mat cau</string>
<string name="duongham">Duong ham</string>
</resources>

Xy dng ng dng 3D vi Android


130
______________________________________________________________________

Hnh 32 - Menu chnh

Hnh 33 - Menu More

Xy dng ng dng 3D vi Android


131
______________________________________________________________________

Hnh 34 - Menu v hnh

Hnh 35 - Menu pha mu

Xy dng ng dng 3D vi Android


132
______________________________________________________________________

Hnh 36 - Menu php bin i

Hnh 37 - Menu php chiu


6.2.2 Hnh nh mt s chc nng trong chng trnh:
Mt s chc nng c trnh by trong chng 5, y nhm thc hin b
sung mt s hnh nh cc cc chc nng khc.

Xy dng ng dng 3D vi Android


133
______________________________________________________________________

Hnh 38 Kt hp cc php bin i

Hnh 39 Demo chiu su

Xy dng ng dng 3D vi Android


134
______________________________________________________________________

Hnh 40 Demo v mt tr

Hnh 41 Demo v mt nn

Xy dng ng dng 3D vi Android


135
______________________________________________________________________

Hnh 41 Demo v mt nn ct

Hnh 42 Demo v mt cu

Xy dng ng dng 3D vi Android


136
______________________________________________________________________

Hnh 43 M phng ng hm 3D

Xy dng ng dng 3D vi Android


137
______________________________________________________________________
PHN C: KT LUN

1. Kt qu t c:
ng trc s pht trin ca cc thit b di ng v nhng i hi ca con
ngi trong lnh vc gii tr, ng dng trn cc thit b di ng ngy cng cao. Vi
ti Xy dng ng dng 3D vi Android, kha lun ny trnh by c tng
quan v lp trnh trn Android v cc k thut v lp trnh ha da trn b th vin
OpenGL ES. Qua xy dng mt m hnh 3D trn Android lm nn tng cho vic
thit k cc games 3D trn di ng.
Tuy nhin do hn ch v iu kin v thi gian cng nh nng lc ca nhm,
kho lun s khng th trnh khi nhng thiu st. Knh mong c s ng gp
kin ca thy c v cc bn nhm thc hin c th hon thin hn ti nghin cu
ca mnh trong t lm kha lun tt nghip ny.
2. Hng pht trin:
Hin ti, h iu hnh Android ang pht trin rc r, v tnh nng m ca n.
V n cng ang c cng ng cc lp trnh vin trn khp th gii quan tm v tm
hiu, ng thi tr gip cho Google pht trin v hon thin tnh nng cho h iu
hnh ny. ng thi, cc ng dng 3D th s hp dn hn i vi ngi dng.
Do , trong tng lai nhm thc hin s tip tc tm hiu, i su hn v cc k
thut 3D cho ng dng Android, hng n pht trin cc demo trn thnh mt game
3D hon chnh.

Xy dng ng dng 3D vi Android


138
______________________________________________________________________
PH LC

Hng dn ci t:
1. Ci t ng dng cho Emulator:
a. Khi ng emulator mun install ng dng. (Vo Eclipse>Window/Android SDK and AVD manager -> chn AVD ri Start).
b. .a file ImageEditor.apk vo trong folder tools ca folder cha sdk. VD:
C:\android-sdk-windows\tools.
c. M Command shell ln v di chuyn ti folder ny. VD: Trong Window vo
Run g cmd, ri dng lnh cd ti c folder tools.
d. G vo command shell lnh adb install <tn_file.apk>. VD: adb install
ImageEditor.apk
e. Vo emulator -> chn ng dng v chy.
2. Ci t ng dng cho in thoi tht:
a. Kt ni in thoi vi my tnh qua cng usb.
b. Thay i ci t ng dng, vo MENU > Settings > Applications >
Unknown Sources.
c. Bt Usb debugging trn in thoi, vo MENU > Settings > Applications >
Development, sau enable USB debugging.
d. M Command shell ln v di chuyn ti folder ny. VD: Trong Window vo
Run g cmd, ri dng lnh cd ti c folder tools.
e. G vo command shell lnh adb install <tn_file.apk>. VD: adb install
ImageEditor.apk
f. Vo emulator -> chn ng dng v chy.

Xy dng ng dng 3D vi Android


139
______________________________________________________________________
TI LIU THAM KHO
1. Vladimir Silva. Pro android games. Apress. Springer-Verlag New York. 2009.
2. Sayed Y. Hashimi, Satya Komatineni, Dave MacLean. Pro android 2. Apress.
Springer-Verlag New York. 2010.
3. Reto Meier. Professional Android Application Development. Wiley
Publishing, Inc. 2009.
4. Mikael Gustavssom. 3D Game Engine Design for Mobile Phones with OpenGL
ES 2.0. Master of Science Thesis Stockholm, Sweden. 2008.
5. Kari Pulli, Tomi Aarnio, Ville Miettinen, Kimmo Roimela, Jani Vaarala. Mobile
3D Graphics with OpenGL ES and M3G. Morgan Kaufmann Publishers.
Elsevier Inc. 2008.
6. Aaftab Munshi, Jon Leech. OpenGL ES Common Profile Specification. The
Khronos Group Inc. 2009.
7. Frank Ableson. Nhp mn pht trin ng dng Android. 2011.
8. Bi Minh Trng. Lp trnh Opengl vi th vin AUX.
www.nhipsongcongnghe.net.
9. Android OpenGL ES Issues. OmniG Software Inc. 2008
10. Phan Mnh Cng. Lun vn Ngin cu lp trnh C++ trn Symbian. 2009.
11. Chu Duy Thin, V Thy Linh, L Quc Tin. Tiu lun Tm hiu v vit ng
dng trn nn h iu hnh mobile Android. 2010.
12. http://www.android.com/
13. http://developer.android.com/index.html
14. http://code.google.com/intl/vi-VN/android/
15. http://www.sunsetlakesoftware.com/2008/08/05/lessons-molecules-opengl-es
16. http://nehe.gamedev.net/
17. http://www.anddev.org/android-2d-3d-graphics-opengl-tutorialsf2/page300.html

You might also like