Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
UNIVERZA V MARIBORU
FAKULTETA ZA ELEKTROTEHNIKO,
RAČUNALNIŠTVO IN INFORMATIKO
Damijan Račel
PROGRAMSKA OPREMA ZA ANIMIRANJE
OBLIK UR IN IZDELAVA FORMATA ZA
NJIHOVO SHRANJEVANJE NA PLATFORMI
WATCHFACE EDITOR
Diplomsko delo
Maribor, avgust 2015
PROGRAMSKA OPREMA ZA ANIMIRANJE OBLIK UR IN
IZDELAVA FORMATA ZA NJIHOVO SHRANJEVANJE NA
PLATFORMI WATCHFACE EDITOR
Diplomsko delo
Študent: Damijan Račel
Študijski program: Visokošolski študijski program
Računalništvo in informacijske tehnologije
Mentor: Prof. dr. Peter Kokol
Lektorica: Petra Kolarič
iii
iv
Zahvala
Zahvaljujem se mentorju
prof. dr. Petru Kokolu za
pomoč in potrpljenje.
Prav tako bi se rad za
izkazano podporo zahvalil
svoji družini, še posebej
moji punci in prijateljici
Petri.
v
Programska oprema za animiranje oblik ur in
izdelava formata za njihovo shranjevanje na
platformi Watchface Editor
Ključne besede: pametna ura, android, wear, pebble, java
UDK: 004.42:004.928(043.2)
Povzetek
V diplomskem delu opišemo, kako smo načrtovali in implementirali mobilni Android del
platforme Watchface Editor. S pomočjo naše platforme lahko uporabniki na spletni strani
preprosto ustvarijo oblike ur ali watchface-e in jih nato preko naše mobilne aplikacije
naložijo na pametno uro Android Wear.
vi
Software for animating watchfaces and a
description of our specifications for saving them
on the WatchFace Editor platform
Key words: smart watch, android, wear, pebble, java
UDK: 004.42:004.928(043.2)
Abstract
In our thesis we describe the planing and implementation of the mobile Android part of our
Watchface Editor platform. Our platform enables users to create their own watchfaces on
our website and install them to Android Wear smartwatches with the help of our mobile
application.
vii
KAZALO
1 UVOD ............................................................................................................................ 1
2 PAMETNE URE ............................................................................................................ 2
2.1 Android Wear pametne ure ..................................................................................... 3
2.2 Watchface ............................................................................................................... 5
2.3 Način spanja ............................................................................................................ 5
2.4 Sistemski elementi .................................................................................................. 6
2.5 Oblika zaslona ......................................................................................................... 7
2.6 Pametna ura Pebble ................................................................................................. 8
2.7 Izdelava Watchface-ov............................................................................................ 9
3 PLATFORMA WATCHFACE EDITOR .................................................................... 10
3.1 Povzetek ................................................................................................................ 10
3.2 Načrtovanje platforme .......................................................................................... 12
3.2.1 Cilji ................................................................................................................ 13
3.2.2 Modul za prikaz oblike ure ............................................................................ 14
4 OSNOVNI GRADNIKI ............................................................................................... 15
4.1 Poravnave .............................................................................................................. 15
4.2 Rotacijska točka .................................................................................................... 16
4.3 Kvadrat .................................................................................................................. 16
4.4 Krog ...................................................................................................................... 17
4.5 Kroţni lok ............................................................................................................. 18
4.6 Besedilo ................................................................................................................ 19
4.7 Slika ...................................................................................................................... 20
4.8 Mnogokotnik ......................................................................................................... 20
5 DATOTEČNI FORMAT ............................................................................................. 21
5.1 Opis ....................................................................................................................... 21
5.2 Struktura json datoteke ......................................................................................... 21
5.3 Branje json podatkov ............................................................................................ 23
5.4 Nalaganje slik ....................................................................................................... 25
5.5 Nalaganje pisav ..................................................................................................... 25
6 IZRIS ELEMENTOV .................................................................................................. 26
viii
6.1 Uporaba razreda .................................................................................................... 26
6.1.1 WatchfaceView ............................................................................................. 26
6.1.2 WatchfaceEngineHelper ................................................................................ 27
6.2 Opis delovanja razreda WatchfaceEngine ............................................................ 28
6.2.1 SetWatchface ................................................................................................. 29
6.2.2 Render ............................................................................................................ 29
6.3 Skaliranje .............................................................................................................. 31
6.3.1 Metrics ........................................................................................................... 31
6.3.2 WFCanvas ..................................................................................................... 32
7 ZNAČKE ...................................................................................................................... 33
7.1 Oblika zapisa ......................................................................................................... 33
7.2 Vrste značk ........................................................................................................... 34
7.2.1 Čas ................................................................................................................. 34
7.2.2 Vreme ............................................................................................................ 34
7.2.3 Stanje telefona ............................................................................................... 35
7.3 Pridobitev podatkov .............................................................................................. 35
7.4 Razredna arhitektura ............................................................................................. 36
8 OBDELAVA ZNAČK IN IZRAZOV ......................................................................... 38
8.1 Ţivljenjski cikel grafičnih elementov ................................................................... 38
8.1.1 Optimizacija lastnosti .................................................................................... 39
8.1.2 Grajenje HashMap ......................................................................................... 40
8.1.3 Posodobitev lastnosti ..................................................................................... 40
8.1.4 Izris ................................................................................................................ 40
8.2 Parser .................................................................................................................... 41
8.2.1 Predprocesiranje ............................................................................................ 41
8.2.2 Osveţevanje vrednosti značk......................................................................... 42
8.2.3 Pridobitev vrednosti za podan niz ................................................................. 43
9 EVALUACIJA ............................................................................................................. 45
10 SKLEP ...................................................................................................................... 46
VIRI ........................................................................................................................................ i
ix
KAZALO SLIK
Slika 2.1: Pametna ura Mimo Loga ....................................................................................... 2
Slika 2.2: Pametna ura UC-200 s tipkovnico ........................................................................ 3
Slika 2.3: Sporočilo na sistemu Android Wear ..................................................................... 4
Slika 2.4: Sistemski indikatorji za baterijo in bluetooth povezavo ....................................... 7
Slika 2.5: Pametna ura Pebble ............................................................................................... 8
Slika 3.1: Spletna stran Watchface Editor ........................................................................... 10
Slika 3.2: Domača stran mobilne aplikacije ........................................................................ 11
Slika 3.3: Predogled ure na mobilnem telefonu .................................................................. 12
Slika 4.1: Črkovne črte ........................................................................................................ 20
KAZALO PROGRAMSKE KODE
Programska koda 4.1: Odmiki za pravokotnik .................................................................... 17
Programska koda 4.2: Odmiki za krog ................................................................................ 18
Programska koda 5.1: Primer json formata ......................................................................... 22
Programska koda 5.2: Primer metode deserialize ............................................................... 24
Programska koda 6.1: Nastavitev sistemskih indikatorjev .................................................. 28
Programska koda 6.2: Izris pravokotnika ............................................................................ 30
Programska koda 6.3: Izris besedila s skaliranjem .............................................................. 32
Programska koda 7.1: Dodajanje značk za čas .................................................................... 37
Programska koda 8.1: Optimizacija x koordinate ............................................................... 39
KAZALO TABEL
Tabela 8.1: Primer zapisa značk .......................................................................................... 41
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
1
1 UVOD
Pametne ure so najnovejši trend zabavne elektronike. Ljudje jih uporabljajo za hiter in
priročen dostop do obvestil in informacij, ki jih na uro posreduje povezan pametni telefon.
Ena izmed najpomembnejših prednosti pred klasičnimi urami je ravno prilagajanje ure
ţeljam vsakega posameznika. Da bi ure zadovoljile to ključno zahtevo, večina naprav
podpira izbiro oblike ure, v nadaljevanju watchface, ki je vedno vidna na zaslonu pametne
ure.
Uporabnik dobi pametno uro z ţe pred naloţenimi watchface-i. Vsak watchface je
samostojen program, ki teče na operacijskem sistemu pametne ure. Uporabniki lahko
prenesejo na svojo pametno uro nove watchface-e ali pa izdelajo svoje, vendar izdelava
popolnoma novega watchface-a ni enostavna in zahteva znanje programiranja za uro, na
kateri bo ta tekel. Razvoj naše platforme je vzpodbudila potreba po enostavnem sistemu, s
katerim bi lahko uporabniki pametnih ur po svojih ţeljah ustvarili watchface-e in jih delili
z drugimi.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
2
2 PAMETNE URE
Pametne ure so naprave, ki zraven prikaza časa ponujajo še dodatne funkcionalnosti [1]. Za
eno izmed prvih pametnih ur štejemo uro Mimo Loga iz leta 1941, slika 2.1. To je bila
analogna ura, ki je ponujala še moţnost izvajanja enostavnih računskih operacij.
Uporabnik je račune izvajal s pomočjo logaritemskega računala, vgrajenega v številčnico
ure [2].
Slika 2.1: Pametna ura Mimo Loga
V letih, ki so sledila, je prišlo na trg ogromno različnih modelov pametnih ur. Z napredkom
v razvoju tehnologije digitalnih zaslonov in baterij so začele pametne ure postajati vedno
bolj podobne pravim računalnikom.
Leta 1984 je podjetje Seiko na trg izdalo pametno uro UC-2000, na sliki 2.2, ki so jo lahko
uporabniki povezali z zunanjo tipkovnico in na uro naloţili zapiske. Za zapiske in opombe
je imela ura na voljo 2922 bajtov pomnilnika, ki so jih lahko uporabniki prebirali na
zaslonu, ki je prikazoval 4x10 znakov. Ko je bila povezana z zunanjo enoto, je bilo moţno
na njej poganjati kratke programe, napisane v programskem jeziku BASIC [3] [4].
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
3
Slika 2.2: Pametna ura UC-200 s tipkovnico
2.1 Android Wear pametne ure
Podjetje Google je 18. marca 2014 na svojem uradnem blogu oznanilo prihod sistema
Android tudi na pametne ure. Prirejena verzija operacijskega sistema za ure se imenuje
Android Wear [5]. Po besedah podjetja Google je osnovni namen sistema Android Wear
ta, da pametne ure uporabnikom prikazujejo informacije iz povezanega pametnega
telefona. Uporabniki lahko na uri na enostaven načni prebirajo sporočila in elektronsko
pošto.
Ena izmed največjih razlik v primerjavi s sistemom na mobilnih telefonih je uporabniški
vmesnik. Ker je zaslon ure dosti manjši od zaslona na mobilnem telefonu, interakcija z
grafičnim vmesnikom poteka preko sistema ročnih gest in z govornimi ukazi.
Android Wear podpira integracijo z Googlovim sistemom za prepoznavo govora, ki ga
vključimo s ključnima besedama »OK, Google«. Ura nato posluša za ukazi, s katerimi
lahko poţenemo aplikacije, narekujemo sporočila ali poţenemo štoparico. Prav tako imajo
razvijalci aplikacij za ure na voljo dodajanje novih govornih ukazov, ki lahko močno
izboljšajo uporabniško izkušnjo.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
4
Ura nam vsa pomembna opozorila in podatke prikazuje v obliki kartic, vidno na sliki 2.3,
ki se pojavijo na zaslonu. Kartice lahko odstranimo iz zaslona s potegom prsta po zaslonu
od desne proti levi. Prav tako lahko na uro namestimo samostojne aplikacije [6]. Te tečejo
na strojni opremi ure, zato je ura do neke mere uporabna tudi, če ni povezana s pametnim
telefonom. Aplikacije za uro so v osnovi enake kot aplikacije za Android pametne telefone.
Največja sprememba v razvijanju aplikacij je ravno v uporabniškem vmesniku, saj se mora
uporabniška izkušnja prilagoditi mali površini zaslona ure. O majhnih razlikah med
različicama Androida za mobilne telefone in ure priča dejstvo, da lahko aplikacije,
napisane za pametne telefone Android, brez sprememb poţenemo kar neposredno na uri.
Slika 2.3: Sporočilo na sistemu Android Wear
S prihodom Androida na pametne ure so dobili razvijalci še dodaten izziv, saj je bilo med
mnoţico različnih vrst zaslonov z različnimi razmerji stranic sedaj potrebno elemente
grafičnega uporabniškega vmesnika prilagoditi še okroglemu zaslonu.
Uradna stran Android Wear trenutno v času pisanja predstavlja 12 različnih pametnih ur,
na katerih teče Googlov operacijski sistem [7].
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
5
2.2 Watchface
Watchface je oblika ura, ki je vedno vidna na naši pametni uri. Izbiramo lahko med
mnoţico pred naloţenih oblik, prenesemo pa si lahko tudi nove iz Googlove trţnice z
aplikacijami. Watchface-i so le še ena vrsta aplikacij, ki tečejo na sistemu Android. Google
je izdal posebne zahteve, da morajo biti vsi watchface-i za pravilno delovanje zgrajeni s
pomočjo razredov, ki se nahajajo v knjiţnici Wearable Support.
Sistem Android nam za izris watchface-a ponudi objekt Canvas, na katerega lahko rišemo
primitivne oblike, kot so pravokotniki, krogi ali črte. Ustvarimo si lahko tudi svoj števec,
ki osveţi stanje ure in ponovno izriše elemente z novimi vrednostmi na Canvas. Da
izdelamo svoj watchface, moramo upoštevati smernice, ki so zapisane na uradni strani za
Android pametne ure.
2.3 Način spanja
Sistem za pametne ure je bil načrtovan za čim manjšo porabo baterije. Iz tega razloga
ostane zaslon na uri vklopljen le kratek čas, nato pa se preklopi v način spanja. Kot
razvijalci watchface-ov se moramo pravilno odzvati na ti različni stanji. Ko je zaslon v
načinu spanja, je slika na uri še vedno vidna, toda zaslon lahko prikaţe le črno in belo
barvo, pri nekaterih modelih ur pa barve iz 8-bitno barvne palete. Google v smernicah za
razvoj watchface-ov predlaga, da v stanju spanja ne posodabljamo grafičnih elementov na
uri več kot enkrat na minuto. V namen posodobitve podatkov v času spanja nam sistem
Android ponuja metodo, ki se kliče vsako minuto in kjer lahko posodobimo pozicije
kazalcev ali besedilo. Sistem nam zagotavlja, da se bo ta metoda klicala vsako minuto, kar
ne drţi za števce, ki jih lahko implementiramo sami in tečejo le, ko je naprava budna. Ko je
ura v stanju budnosti, lahko ustvarjamo vse vrste animacij in osveţujemo zaslon po ţeleni
frekvenci. Seveda moramo upoštevati dejstvo, da bolj grafično zahteven watchface prej
izprazni majhno baterijo v pametni uri [8].
Ker so watchface-i samostojne aplikacije, napisane za sistem Android, lahko v programski
kodi razvijalci dostopajo do vseh podatkov, do katerih lahko dostopamo, ko razvijamo
običajne mobilne aplikacije. Iz tega razloga lahko na številčnici ure prikaţemo ogromno
različnih podatkov, ki ne rabijo biti omejeni na prikaz trenutnega časa. Na trgu obstaja
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
6
ogromno različnih watchface-ov, ki prikazujejo informacije o vremenskih parametrih,
podatke o trenutni lokaciji, stanje baterije ure in telefona. Podatki, za katere je potrebna
internetna povezava, se lahko pridobijo na mobilnem telefonu in se nato preko bluetooth
povezave pošljejo na uro.
2.4 Sistemski elementi
Ob podatkih, ki jih razvijalec ponudi v ogled uporabnikom watchface-a, se preko površine
Canvasa na uri izrišejo še sistemski elementi, s katerimi upravlja operacijski sistem:
Kartice:
Vsako opozorilo ali sporočilo, ki ga uporabnik prejme na telefon, se prenese tudi na uro,
kjer se prikaţe v obliki kartic. Kartice s sporočili za uporabnika se pojavijo na spodnji
strani watchface-a. Razvijalec se lahko odloči, kako visoka bo kartica in koliko ure bo
prekrila. V programski kodi lahko izberemo, da bo kartica visoka le eno vrstico ali pa si bo
rezervirala toliko prostora, kot ga potrebuje za prikaz celotne vsebine sporočila.
Indikatorji:
Operacijski sistem na uri prikazuje tudi stanje baterije, stanje bluetooth povezave s
telefonom in ali je ura trenutno povezana v električno omreţje, kot je vidno na sliki 2.4.
Prav tako se vedno v trenutku, ko se ura zbudi, na zaslonu prikaţeta ključni besedi »OK,
Google«, ki uporabniku sporočita, da lahko z glasno izgovorjavo prikazanih besed poţene
sistem za glasovni nadzor naprave. V programski kodi lahko izbiramo poloţaj sistemskih
indikatorjev med nekaj pred pripravljenimi lokacijami na zaslonu ure. Če smo izdelali uro
z belim ozadjem, lahko izberemo, da bodo indikatorji narisani na sivo ozadje, saj drugače
ne bi bili vidni [9].
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
7
Slika 2.4: Sistemski indikatorji za baterijo in bluetooth povezavo
2.5 Oblika zaslona
Ker v ekosistemu pametnih ur Android najdemo zelo različne oblike zaslonov, moramo
pri razvijanju aplikacij in še posebej pri razvoju watchface-ov posvetiti veliko pozornosti
ravno tej tematiki. Sistem Android nam ponuja več različnih metod, po katerih lahko
razvijalci dostopajo do informacij o zaslonu naprave, na kateri teče njihova aplikacija. Od
sistema Android lahko dobimo podatke o zaslonu, kot so:
Tip zaslona: pravokoten, okrogel
Velikost brade v slikovnih pikah
Čeprav ima morda okrogla ura enako resolucijo zaslona kot pravokotna, na okroglem
zaslonu ne moremo prikazati enakega števila slikovnih pik kot na pravokotnem. Zaradi
različnih oblik zaslona se lahko zgodi, da bo del našega watchface-a na nekaterih urah
odrezan. Iz tega razloga moramo prilagoditi izris elementov glede na različne zaslone. Če
ţelimo ustvariti uro, ki se bo brez večji sprememb prikazala pravilno tako na pravokotni
kot okrogli uri, moramo paziti, da grafičnih elementov ne izrisujemo v kotih zaslona.
Ko izdelujemo grafično podobo ure, moramo upoštevati tudi okrogle zaslone, ki imajo
spodnji del »kroga« odrezan, da njihova podoba spominja na izgled prazne pnevmatike. V
metodi onApplyWindowInsets nam sistem Android sporoči, kako velik je odrezan del
kroga, da lahko primerno priredimo izris uporabniškega vmesnika.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
8
2.6 Pametna ura Pebble
Prva verzija pametne ura Pebble je na trg izšla januarja 2013, po tem, ko je podjetje Pebble
Technology Corporation uspešno zaključilo Kickstarter kampanjo, s katero so zbrali več
kot 10 milijonov dolarjev denarne podpore od skoraj 70 tisoč podpornikov. Ko se je
zbiranje denarja zaključilo, je bila to najbolj uspešna kampanja skupinskega financiranja na
spletni strani Kickstarter. Leta 2015 je Kickstarter kampanja za novo verzijo, imenovano
Pebble Time, zbrala več kot 20 milijonov dolarjev [10].
Pametna ura Pebble, vidna na sliki 2.5, ima dvo-barvni zaslon resolucije 144x168
slikovnih pik, ki lahko prikaţe samo črno in belo barvo. Transflektiven LCD zaslon porabi
zelo malo energije, saj za prikaz slike ne potrebuje lastnega vira svetlobe. Svetloba iz
okolice zadostuje, da vidimo ostro sliko na zaslonu, vidnost pa je zaradi tega odlična tudi
zunaj na močnem soncu. Zaradi majhne porabe baterije lahko ura deluje kar 7 dni, brez da
bi jo morali ponovno napolniti [10].
Slika 2.5: Pametna ura Pebble
Ura podpira poganjanje programov, ki jih lahko napišejo razvijalci s pomočjo Pebble SDK
v programskem jeziku C. Razvijalci lahko naredijo tudi svoje watchface-e in jih naloţijo
na uro. Ker ima ura za aplikacije, ki tečejo na njej, rezerviranega le 24 KB pomnilnika,
morajo razvijalci bolj kot pri drugih napravah paziti na porabo sistemskih sredstev. Prav
tako manjša procesorska moč ure ni primerna za vključitev zahtevnih grafičnih animacij v
programe in watchface-e.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
9
2.7 Izdelava Watchface-ov
Trg za različne watchface-e je postal v zadnjem času zelo velik. Ljudje vedno iščejo
watchface, ki najbolj ustreza njihovemu trenutnemu počutju ali okolju, v katerem so se
znašli. Lastniki pametnih ur ţelijo z watchface-i drugim ljudem prenesti sporočilo o tem,
kar si mislijo ali kaj jim je všeč. Tako za Android Wear kot za Pebble platformo lahko na
spletnih trţnicah najdemo zelo veliko število različnih oblik ur, toda mnogo ljudi kljub
velikemu številu watchface-ov, ki so na voljo, ne najde takšnega, ki bi jim bil po volji. Iz
tega razloga bi radi ljudje ustvarili popolnoma svoj izdelek, ki bi bil prirejen natančno
njihovim potrebam.
Ker so watchface-i v osnovi le aplikacije, ki tečejo na operacijskem sistemu ure, moramo
za njihovo izdelavo zelo dobro poznati ta sistem. Prav tako potrebujemo dobro znanje
programiranja. Če ţelimo ustvariti watchface za pametno uro Android, se moramo naučiti
programiranja v programskem jeziku Java. Prav tako moramo znati uporabljati orodja, ki
so potrebna za uspešno implementacijo aplikacij za platformo Android. Izdelava aplikacij
vključuje znanje programskega orodja Android Studio in sistema Gradle, s pomočjo
katerega se aplikacije pretvorijo v .apk pakete, ki jih je moţno pognati na uri. Če ţelimo
programirati za pametno uro Pebble, moramo znati programirati v programskem jeziku C
in se seznaniti z delovanjem Pebble SDK in spletne aplikacije Pebble Cloud. Na trgu ţe
obstajajo aplikacije, ki močno poenostavijo izdelavo watchface-ov in ki ponudijo
uporabnikom enostavno okolje, kjer lahko brez strokovnega znanja o platformi, za katero
gradijo, ustvarijo kompleksne izdelke.
Za pametne ure Android Wear obstajata aplikaciji Facer in Watchmaker, ki omogočata
uporabnikom, da zgradijo svoje watchface-e in jih poţenejo na svoji uri. Aplikacija Facer
je plačljiva in stane okoli 1 evro na trţnici Google Play [11]. Aplikacijo Watchmaker si
lahko prenesemo zastonj, doplačati moramo le za dodatne funkcionalnosti, kot so dodatni
grafični efekti pri gradnji svojih ur [12]. Za gradnjo watchface-ov na platformi Pebble
lahko uporabniki koristijo zelo popularno stran watchface generator . Stran ponuja veliko
izbiro gradnikov, ki jim lahko uporabniki prirejajo grafične lastnosti. Uporabnik lahko nato
prenese izvršilno datoteko s končnico pbw, ki jo nato namesti na svojo uro.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
10
3 PLATFORMA WATCHFACE EDITOR
3.1 Povzetek
Platforma Watchface Editor omogoča uporabnikom izgradnjo watchface-ov na naši spletni
strani, vidni na sliki 3.1. Ko si uporabnik ustvari uporabniški račun, dobi dostop do
programskega orodja, napisanega v programskem jeziku JavaScript, s pomočjo katerega
lahko na prazno risalno površino dodaja različne elemente, kot so pravokotnik, krog ali
besedilo. Orodje omogoča uporabnikom, da nastavljajo različne parametre likov, kot so
med drugimi tudi višina, širina in pozicija na risalni površini.
Slika 3.1: Spletna stran Watchface Editor
Uporabniki lahko za vsako lastnost lika vnesejo tudi značke, ki omogočajo animacijo
objektov glede na trenutno vrednost časa ali stanja vremena. Ker se vrednosti značk skozi
čas spreminjajo, se liki na risalni površini spreminjajo glede na to, katero značko
uporabimo.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
11
Ko uporabnik konča z delom na svojem watchface-u, ga lahko shrani. Ponudimo mu
seznam vseh njegovih izdelkov, ki jih lahko ponovno naloţi in ureja. Prav tako si lahko
ogleda ure, ki so jih ustvarili drugi uporabniki in so jih ti delili s celotno skupnostjo. Cilj
izdelave svoje oblike ure je v tem, da jo lahko naloţiš na svojo pametno uro. V ta namen
smo izdelali mobilno aplikacijo, vidno na sliki 3.2, ki omogoča brskanje po seznamu
javnih watchface-ov iz našega streţnika kot tudi ogled uporabnikovih privatnih izdelkov.
Slika 3.2: Domača stran mobilne aplikacije
Ko uporabnik izbere watchface iz seznama, se odpre predogled ure, viden na sliki 3.3, kjer
se ura prikaţe in animira popolnoma enako kot na spletni strani. Uporabnik lahko oceni, ali
mu je izbran watchface všeč in se odloči, ali si ga bo namestil na pametno uro, kar lahko
stori s pritiskom na gumb »Install on watch«.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
12
Slika 3.3: Predogled ure na mobilnem telefonu
3.2 Načrtovanje platforme
Preden smo začeli z implementacijo platforme, smo najprej dobro preučili ţe obstoječe
rešitve. Namestili smo si aplikaciji Facer in Watchmaker in na obeh preizkusili sistem
izdelave ure. Aplikaciji omogočata gradnjo watchface-ov zgolj na mobilnem telefonu, kar
ima dosti pomanjkljivosti. Ugotovili smo, da je bilo delo zaradi majhnega zaslona in
teţkega nadzora dokaj naporno in nepregledno. Aplikaciji sta med delom večkrat prenehali
delovati, zaradi česar smo izgubili dotedanji napredek pri izdelavi.
Izdelava samih watchface-ov je bila pri obeh aplikacijah rešena na podoben način s
pomočjo značk. Aplikaciji ponujata nabor več kot sto značk za različne vrednosti, ki jih
lahko priredimo grafičnim elementom in jih s tem animiramo. Čeprav je nabor značk pri
obeh aplikacijah velik, smo si ţeleli še več dodatnih značk, s katerimi bi lahko naredili še
bolj unikatne oblike ur.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
13
V aplikaciji Facer in Watchmaker smo zelo pogrešali tudi moţnost deljenja svojih izdelkov
z drugimi uporabniki. Za ogled in prenos watchface-ov smo morali obiskati spletno stran,
ki ponuja velik nabor uporabniških del, vendar njeno delovanje ni integrirano v nobeno od
aplikacij, ki smo ju testirali.
Za pametno uro Pebble smo testirali spletno aplikacijo watchface generator. Proti
mobilnima aplikacijama za izdelavo ur za Android Wear, spletna stran watchface generator
ponuja dosti manj nadzora nad izdelavo in animiranjem ure. Ko izdelujemo svojo uro,
lahko izberemo med pred pripravljenimi analognimi ali digitalnimi urami in jim nato
spreminjamo lastnosti, kot so višina, širina in barva. Dodajamo lahko tudi besedilo in
naloţimo tudi poljubne tipe pisav.
3.2.1 Cilji
Naš cilj pri razvoju aplikacije Watchface Editor je bil ta, da bodo lahko uporabniki zgradili
tak watchface, kakršnega bodo ţeleli. Prav tako smo ţeleli omogočiti veliki skupini
uporabnikov, da enostavno delijo svoja dela preko spleta in mobilne aplikacije, kar ni
ponujala nobena od aplikacij, ki so bile na voljo v času načrtovanja. Da bi uporabnikom
omogočili močan sistem za urejanje, shranjevanje in deljenje watchface-ov, samo se
odločili, da bo izdelava ur potekala preko spletne aplikacije. Naš cilj je bil, da ustvarimo
profesionalno orodje, s katerim bodo lahko delali tako začetniki kot izkušeni uporabniki.
Zelo dosti truda smo namenili načrtovanju sistema, po katerem bodo lahko uporabniki svoj
izdelek preprosto prenesli iz spletne strani na svojo pametno uro. Naša Android aplikacija
se preko uporabniškega računa poveţe na naš spletni streţnik tako, da lahko uporabniki
dostopajo do svojih shranjenih del. Prav tako smo ţeleli na mobilni aplikaciji uporabnikom
ponuditi veliko trţnico z izdelanimi urami in morda tudi prodajo avtorskih izdelkov.
Veliko truda smo vloţili v načrtovanje sistema, ki animira uro na telefonu Android in na
pametni uri Android Wear. Ţeleli smo ustvariti sistem, ki bo zelo optimalen in bo deloval
brez problemov tudi ob velikih obremenitvah. Vedeli smo, da lahko izdelamo bolj
učinkovit sistem, kot so ga ponujale konkurenčne aplikacije. Pri aplikacijah Facer in
WatchMaker smo ugotovili, da animacija le majhnega števila elementov ure ni bila tekoča.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
14
Ţeleli smo tudi izboljšati sistem za uporabo značk. Čeprav konkurenčne aplikacije
ponujajo veliko mero prilagodljivosti, smo ţeleli našim uporabnikom ponuditi še večjo
stopnjo nadzora nad osnovnimi gradniki, ki sestavljajo uro.
S platformo Watchface Editor smo vedno imeli cilj, da bodo watchface-i, izdelani v našem
formatu, lahko tekli na različnih vrstah pametnih ur. Trenutno smo podprli razvoj
watchface-ov za Pebble in Android Wear.
3.2.2 Modul za prikaz oblike ure
Ker lahko na pametni uri in telefonu Android poganjamo enako programsko kodo, smo se
odločili, da vse potrebno za nalaganje, prikaz in animiranje watchface-ov zdruţimo v en
velik paket z imenom Watchface Editor engine. Ko ustvarjamo aplikacijo za pametno uro,
se v Android Studiu samodejno ustvarita dva modula. Programska koda za mobilno
aplikacijo se nahaja v modulu »mobile«, programska koda za uro pa v modulu »wear«. V
razvijalnem okolju Android Studio smo ustvarili nov modul, v katerega smo prestavili vso
kodo, ki si jo bosta ura in telefon delila. Da smo lahko uporabili razrede iz modula v
mobilnem delu ali na uri, smo morali v datoteko build.gradle dodati vrstico »compile
project(':watchfaceeditorengine')«. S tem smo dodali povezavo med moduli in smo lahko
uporabili kodo iz modula Watchface Editor engine. Prednost takšne rešitve je predvsem v
tem, da lahko imamo le eno kopijo kode, ki poskrbi, da se watchface pravilno izriše in
animira. Ko dodajamo ali spreminjamo funkcionalnosti v modulu, so spremembe takoj
vidne tako na mobilni aplikaciji kot na pametni uri.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
15
4 OSNOVNI GRADNIKI
Watchface Editor omogoča uporabnikom, da iz osnovnih elementov zgradijo zapletene
oblike ur po svojih ţeljah. Kot razvijalci platforme smo morali prepustiti razvoj
uporabnikom, čeprav smo večkrat začutili ţeljo po tem, da bi v sistem uvedli
funkcionalnosti, ki bi jim na prvi pogled omogočile, da naredijo več, v resnici pa bi
nezavedno usmerjali njihovo kreativnost. Iz tega razloga smo poskusili ustvariti sistem, ki
omogoča dodajanje in manipulacijo z najbolj preprostimi elementi, uporabnikom pa
prepustili odločitve o tem, kako bodo ta sistem izkoristili.
Vsi liki imajo lokacijo podano z izhodiščno točko.
4.1 Poravnave
Skoraj vsak lik, ki ga uporabnik doda v risalno površino, ima nastavljivo lastnost
poravnave po navpični kot po vodoravni osi. Platforma Watchface Editor podpira
naslednje poravnave:
Navpično zgoraj
Navpično na sredini
Navpično spodaj
Vodoravno levo
Vodoravno na sredini
Vodoravno desno
Poravnava je podatek, ki nam pove, kje v liku se bo nahajala njegova izhodiščna točka. Ker
je izhodiščna točka določena s koordinatami pozicije lika, se bo ob spremembi poravnave
premaknil lik, izhodiščna točka pa bo ostala na enakem poloţaju.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
16
4.2 Rotacijska točka
Vsak lik, ki ga dodamo na risalno površino, lahko uporabnik prosto rotira. Ustvarili smo
točno določena pravila, po katerih se liki rotirajo. Liki se vedno rotirajo okoli točke, ki se
imenuje rotacijska točka lika. Rotacijska točka je relativna na izhodiščno točko lika, ki je
določena s poravnavami. Uporabnik lahko rotacijsko točko prestavi na poljubno relativno
razdaljo od izhodiščne točke, kar pomeni, da lahko leţi tudi izven mej lika.
4.3 Kvadrat
Kvadrat je osnovni gradnik, ki ga lahko uporabnik na spletni strani doda na delovno
površino, ko izdeluje watchface. Kvadrat ima lastnosti, kot so višina, širina. Prav tako
lahko kvadratu nastavimo barvo. Kvadrat smo v mobilni aplikaciji za Android izrisovali s
pomočjo metod, ki jih ponuja element Canvas. Za izris smo uporabili metodo
drawRoundedRect, ki sprejme koordinate ogljišč pravokotnika in stopnjo zaobljenih robov.
To metodo smo izbrali zato, da lahko uporabniki na uro dodajo tudi zaobljene
pravokotnike.
Če za izris pravokotnika uporabljamo element Canvas, se bo pravokotnik na risalni
površini izrisal tako, da bodo podane koordinate za izris leţale v zgornjem levem kotu
pravokotnika. Za pravilen izris glede na poravnave moramo izračunati odmik po navpični
kot po pravokotni osi, kar je vidno na primeru programska koda 4.1.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
17
Programska koda 4.1: Odmiki za pravokotnik
Pri kvadratu smo se soočili s problemom izrisa na različnih platformah. Element Canvas na
sistemu Android ne podpira izrisa kvadrata, ki bi bil zapolnjen z eno barvo in imel obrobo
drugačne barve. Iz tega razloga smo morali omejiti nastavitve za kvadrat tako, da lahko
uporabniki izberejo le eno ali drugo moţnost. Če ţelijo ustvariti kvadrat z obrobo drugačne
barve kot je polnilo, morajo ustvariti dva kvadrata različne barve in postaviti enega znotraj
drugega.
Na pametni uri Pebble lahko pri kvadratu izbiramo med tem, ali bo lik zapolnjen s črno ali
belo barvo in ali bo imel obrobo črne ali bele barve. Na Pebblu je pravokotnik vedno
zapolnjen s polnilom, kar pomeni, da se elementi, izrisani pod njim, ne vidijo, kar je
drugače kot pri Androidu, kjer ima pravokotnik prozorno polnilo, če mu nastavimo obrobo.
Iz tega razloga se ura, zgrajena za Pebble, ne bo prikazala enako na Android Wear pametni
uri.
4.4 Krog
Krog smo na Android napravi izrisali s pomočjo metode drawCircle, ki sprejme parametre
za lokacijo kroga in polmer. Ker smo izbrali to metodo, ki prejme le polmer, smo omejili
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
18
uporabnika, saj ne mora izrisati elipse. Ker se izhodiščna točka kroga nahaja v središču
lika, smo morali spremeniti implementacijo izračuna odmikov za namen poravnave, vidno
na primeru programska koda 4.2.
Programska koda 4.2: Odmiki za krog
Tudi pri krogu se je pojavil enak problem z obrobami, kot sem ga opisal v podpoglavju o
pravokotniku.
4.5 Kroţni lok
Uporabniki lahko na svoj watchface dodajo tudi kroţni lok. To je lik, ki je zelo podoben
krogu, vendar ima še dva dodatna parametra. Uporabnik mora loku nastaviti začetni in
končni kot. Oba parametra sprejmeta vrednosti v razponu od 0 do 360 stopinj. Vrednost
začetnega kota predstavlja začetno točko za izris kroţnega loka, končni kot pa je relativen
na začetnega in predstavlja zaključek kroţnega loka.
Metoda na objektu Canvas za izris kroţnega loka za parameter sprejme velikost kvadrata,
ki zaobjema celoten lok. Iz tega razloga je v implementaciji programske kode kroţni lok
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
19
bolj podoben kvadratu kot krogu in iz tega razloga za parametre sprejme višino in širino
namesto polmera.
Ker na pametni uri Pebble kroţnega loka ni mogoče narisati z vgrajenimi metodami, smo
ta lik odstranili iz specifikacije formata za Pebble.
4.6 Besedilo
Da lahko uporabniki ustvarijo tudi digitalno uro in na risalno površino dodajo svoja
besedila, imajo na voljo element za prikaz besedila. Element prejme koordinate izhodiščne
točke, velikost pisave, vrsto pisave in besedilo, ki se mora prikazati. Da bi se besedilo
pravilno prikazalo na vseh platformah, kjer lahko poţenemo ustvarjene watchface-e, se
morajo mere besedila vedno izmeriti popolnoma enako. Zaradi različnih implementacij
merjenja teksta na različnih platformah se je to izkazalo za dokaj teţko opravilo.
Sistem Android nam ponudi nekaj metod, ki nam pomagajo pri merjenju višine in širine
besedila. Razred Paint vsebuje dve metodi, ki vrneta dolţino podanega niza znakov glede
na tip pisave in velikost. Sprva smo za merjenje dolţine uporabljali metodo getTextBounds
razreda Paint, kar pa se je izkazalo za napako, saj metoda za merjenje dolţine besedila
elementa Canvas v HTML5, ki se uporablja na spletni strani, ni vračala enakega rezultata.
Da bi uskladili mere, smo na Android strani morali uporabiti metodo measureText.
Višino besedila lahko na sistemu Android izmerimo s pomočjo metode getTextBounds, ki
vrne podatke o merah pisave. Višina, ki jo vrne metoda, ne predstavlja dejanske višine
besedila, temveč le od zgornje do črkovne črte. Da dobimo višino pravokotnika, v katerem
leţi celotno besedilo, moramo prišteti še razdaljo med črkovno in spodnjo črto. Črkovne
črte so vidne na sliki 4.1.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
20
Slika 4.1: Črkovne črte
4.7 Slika
Slika je eden izmed najbolj pomembnih elementov za ustvarjanje watchface-ov. Slike
lahko grafični oblikovalec izdela v profesionalnem orodju za urejanje slike, kot je na
primer Photoshop. Takšne slike se lahko nato uporabijo za kazalce ure, ozadje ali kakšne
druge elemente. Sliko na element Canvas narišemo z metodo drawBitmap, ki sprejme
pozicijo, višino in širino slike ter sliko za prikaz. Pri pametni uri Pebble je zaradi
omejenega prostora moţno dodati le eno sliko.
4.8 Mnogokotnik
Mnogokotnik je lik, ki ga lahko sestavimo iz poljubnega števila točk. Prva točka
mnogokotnika je vedno definirana kot izhodiščna točka, njene koordinate so absolutne
glede na risalno površino celotne ure. Vrednosti koordinat vseh nadaljnjih točk v
mnogokotniku predstavljajo relativen odmik od izhodiščne točke. Mnogokotniku ne
moremo nastaviti poravnav, na Canvas pa ga narišemo z metodo drawPath, ki ji kot
parameter podamo seznam vseh točk, ki so del mnogokotnika.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
21
5 DATOTEČNI FORMAT
Za prenos in hranjenje podatkov o sestavljeni obliki ure smo implementirali shranjevanje
vseh potrebnih datotek v zip arhiv. Shranjevanje v datotečni format poteka na spletni
strani, kjer uporabniki gradijo svoj watchface. Da si lahko uporabniki ogledajo svoj izdelek
tudi na mobilni aplikacij in jo kasneje naloţijo na pametno uro, smo morali implementirati
branje podatkov iz našega formata v programskem jeziku Java.
5.1 Opis
Za prikaz celotnega watchface-a potrebujemo več različnih datotek. Za potrebe našega
projekta smo razvili datotečni format z natančno določenimi specifikacijami. Vse potrebne
datoteke se shranijo v zip arhiv, ki si ga lahko uporabniki delijo med seboj ali pa se shrani
na našem spletnem streţniku, kjer je na voljo vsem uporabnikom naše spletne in tudi
mobilne aplikacije. Za naš zip arhiv smo določili končnico wfe, ki jo lahko uporabniki iz
datotečnega sistema odprejo z našo aplikacijo.
Da se lahko watchface pravilno naloţi, mora zip arhiv vsebovati datoteko watchface.txt,
kjer je v formatu json shranjen podroben opis vseh elementov, ki jih uporabnik doda na
risalno površino. Prav tako mora arhiv vsebovati mapi Fonts in Images. V mapo Fonts se
dodajo vse pisave, ki jih uporabnik doda v spletnem vmesniku, v mapo Images pa vse
slike. Če uporabnik izdela watchface za pametno uro Pebble, se bo v arhiv dodala še
izvršilna datoteka s končnico .pbw in datoteka z okrajšanim json zapisom elementov, ki se
uporabi za prikaz oblike ure na prostorsko omejenem Pebblu.
5.2 Struktura json datoteke
Na začetku json zapisa, vidnega na primeru programska koda 5.1, so zapisani potrebni
meta podatki o watchface-u. Shranijo se podatki, kot so ime avtorja, naslov watchface-a,
opis in verzija. Ker obstaja moţnost implementacije trga, kjer bi se lahko watchface-i
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
22
prodajali, smo dodali še podatek o ceni, ki pa ga trenutno ne uporabljamo nikjer v
aplikaciji. Podatek o verziji je potreben zato, da se lahko verzija lokalne datoteke primerja
z verzijo na spletnem streţniku, od koder se po potrebi prenese posodobitev. Vedno, ko
avtor shrani spremembo v svojem watchface-u, se številka verzije poveča za ena.
Programska koda 5.1: Primer json formata
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
23
Zraven vseh meta podatkov je v json datoteki shranjen še seznam »wfLayouts«. WFLayout
je element, v katerem shranimo celoten izgled watchface-a. Ima podatke, ki so pomembni
za pravilen izris ure. Naš format za shranjevanje ur je sestavljen tako, da podpira dodajanje
večjega števila elementov WFLayout, kar posledično pomeni, da bi lahko v enem zip
arhivu imeli shranjenih več popolnoma različnih watchface-ov. Vsak WFLayout je
popolnoma neodvisen od drugih. Vsebuje podatke o postavitvi sistemskih elementov ure, o
priporočeni hitrosti osveţevanja ure. Vsebuje tudi zastavice, ki nam povejo, ali watchface
prikazuje podatke, kot so stanje vremena ali lokacijo.
Vsak WFLayout vsebuje tudi seznam vseh elementov, iz katerih je sestavljena njegova
grafična podoba. Seznam elementov je shranjen v lastnosti wfElementArrayList. V
seznamu elementov ima vsak element shranjen svoj tip in vse podatke, ki so potrebni, da
ga lahko izrišemo na zaslon in animiramo.
5.3 Branje json podatkov
Za nalaganje podatkov smo ustvarili sistem, s pomočjo katerega naloţimo vse podatke iz
zip arhiva. Naš cilj je bil, da naredimo preprost in učinkovit sistem, ki bo pregleden in
enostaven za uporabo. Prav tako je bilo pomembno, da je sistem odporen na posodobitve,
če moramo kaj dodati v specifikacijo formata.
Za enostavno uporabo smo ustvarili razred WatchfaceInfo, preko katerega lahko v
programski kodi naloţimo watchface. Za nalaganje watchface-a iz datoteke smo ustvarili
statično metodo loadWatchfaceInfo, ki sprejme pot do datoteke, kjer je shranjen arhiv z
vsemi potrebnimi podatki. Metoda iz zip arhiva najprej pridobi tekstovno datoteko z
imenom »watchface.txt«. Vsebino te datoteke metoda pošlje razredu GsonSerializer. Ta
razred smo napisali za enostavnejšo uporabo Googlove knjiţnice Gson, s pomočjo katere
lahko v Javanske objekte napolnimo podatke iz json formata. Razredu GsonSerializer smo
dodali metodo deserializeWFElement.
Metoda deserializeWFElement ustvari nov objekt tipa GsonBuilder, ki ga ponuja knjiţnica
Gson. Pred pričetkom deserializacije podamo zahtevo, da se naj podatki vstavijo le v polja,
ki so posebej označena z anotacijo @Expose. Ta zahteva ni nujno potrebna, saj lahko
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
24
knjiţnica Gson dostopa tudi do polj, ki niso eksplicitno označena. Anotacijo @Expose smo
morali uporabiti v namen testiranja sistema, ko smo potrebne razrede za watchface-e
proizvedli kar v programski kodi in jih v obratni operacij nato serializirali v json format. V
tem primeru se v json zapis shranijo le polja z @Expose anotacijo.
Za pravilno obdelavo json zapisa smo morali napisati svojo implementacijo adapterja, ki
nadzira pretvorbo zapisa v Javanske objekte, ki je vidna na primeru programska koda 5.2.
Razred smo poimenovali WFElementAdapter. Potrebno je bilo, da smo v njem
implementirali metodi deserialize in serialize, ki ju definirata interface-a JsonSerializer in
JsonDeserializer.
Programska koda 5.2: Primer metode deserialize
Svojo implementacijo metode deserialize smo morali uporabiti zato, ker se v seznamu
elementov za izris pojavljajo elementi različnih tipov, ki vsi dedujejo od nad razreda
WFElement. V Javi jih lahko iz tega razloga vse dodamo v en seznam tipa WFElement. Da
bi lahko vedeli, kateri tip moramo ustvariti, mora json zapis vsakega elementa vsebovati
tudi ta podatek. Za vsak element smo v parameter type shranili tip objekta v Javi, v
parameter properties pa vse vrednosti za polja tistega razreda. Tip objekta smo nato v Javi
sestavili iz imena paketa »com.blukz.wear.watchfacegeneratorengine.elements« in imena
tipa.
Po uspešno zaključeni operaciji nalaganja se vsi podatki iz jsona zapisa shranijo v polja
objekta tipa WatchfaceInfo. Podatki, kot so naslov in avtor watchface-a, pa tudi vsi
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
25
grafični elementi so potem dostopni vsepovsod, kjer imamo referenco na prej omenjen
objekt.
5.4 Nalaganje slik
Slike, ki so bile naloţene v watchface, se v arhivu shranijo v mapo Images. Da bi vedeli,
katere slike so na voljo, ko bomo prikazovali watchface, smo v json format dodali seznam
z imenom imagesArrayList. V tem seznamu so zapisana imena vseh slik, ki se nahajajo v
mapi Images skupaj z njihovimi končnicami. V metodi razreda WatchfaceInfo se po
uspešno končanem branju json zapisa poţene metoda za nalaganje slik z imenom
preloadBitmaps. Podamo ji pot do zip arhiva in instanco objekta WatchfaceInfo, preko
katere lahko dostopamo do seznama vseh slik.
V metodi preloadBitmaps iteriramo skozi celoten seznam slik in jih s pomočjo metode
loadBitmap razreda ZipLoader pretvorimo v objekte tipa Bitmap. Za enostaven dostop do
vseh naloţenih slik smo ustvarili HashMap, ki se uporablja za hranjenje ključa in
vrednosti. Za dostop do vrednosti moramo le podati iskani ključ v HashMap objekt. Ključ
je v našem primeru ime slike, vrednost pa naloţena slika v objektu Bitmap. Ko dodamo v
HashMap vse slike, shranimo podatke v singleton objekt WFBitmapContainer. Za dostop
do slik moramo le pridobiti referenco na instanco objekta preko metode getInstance in nato
preko metode getWatchfaceBitmap zahtevati sliko pod ţelenim imenom.
5.5 Nalaganje pisav
Nalaganje pisav deluje po enakem postopku kot nalaganje slik. Naloţena pisava iz zip
arhiva se naloţi v objekt tipa Typeface. Razlika od postopka nalaganja slik je bila v načinu
pridobitve objekta, ki predstavlja pisavo v programski kodi. Za pridobitev objekta
Typeface smo napisali metodo loadFont v razredu ZipLoader. Metoda pridobi objekt
Typeface na tak način, da najprej iz zip arhiva odpakira datoteko s pisavo na poljubno
mesto na datotečni sistem naprave. Objekt Typeface lahko nato ustvarimo s klicem metode
createFromFile, ki mu podamo pot do odpakirane datoteke s pisavo. Vse naloţene pisave
dodamo v singelton WFFontContainer po enakem sistemu, kot smo to storili s slikami.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
26
6 IZRIS ELEMENTOV
Ko vse elemente naloţimo iz našega formata za shranjevanje, moramo naloţeno obliko
izrisati na zaslon. Za izris poskrbi razred WatchfaceEngine. WatchfaceEngine je bil
načrtovan tako, da ga lahko brez teţav uporabimo na pametni uri ali pa ga vključimo v
mobilno aplikacijo. Pri implementaciji takšnega delovanja smo naleteli na teţavo, saj na
pametni uri za izris watchface-a uporabimo nad razred CanvasWatchFaceService.Engine,
na mobilnem telefonu pa nad razred View, ki med seboj nista kompatibilna.
WatchfaceEngine potrebuje referenco na objekt, kjer je bil ustvarjen, da lahko proţi
metodo invalidate, ki osveţi risalno površino, tako da ponovno izriše vse, kar je na njej.
Ker smo morali pridobiti referenco na dva različna objekta, smo ustvarili dva
konstruktorja, pri čemer je eden sprejel objekt tipa View, drugi pa objekt tipa
CanvasWatchFaceService.Engine. Rešitev se je izkazala za problematično, saj smo v
modul Watchface Editor engine uvozili razred CanvasWatchFaceService.Engine, ki je
obstajal samo na pametni uri, ne pa tudi na strani mobilne aplikacije, kar je povzročilo
napako pri zagonu programske kode. Čeprav sta si platformi zelo podobni, obstajajo
razredi, ki jih ne moremo uporabiti na obeh straneh aplikacije. Da bi rešili problem, smo
uvedli »interface« Redraw. Zdaj sta lahko različna razreda implementirala enako metodo
onDraw, ki jo kliče WatchfaceEngine, ko ţeli osveţiti risalno površino. Dejanska osveţitev
je prepuščena implementaciji v posameznem razredu, ki ga WatchfaceEngine kliče.
6.1 Uporaba razreda
Za enostavno uporabo razreda WatchfaceEngine smo napisali dva razreda, ki poskrbita za
nekatere podrobnosti implementacije.
6.1.1 WatchfaceView
Za vgradnjo v mobilno aplikacijo smo ustvarili razred WatchfaceView. To je razred, ki
deduje od razreda View, kar nam omogoči dostop do metode onDraw, ki je potrebna za to,
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
27
da lahko rišemo na risalno površino Canvas, ki nam jo posreduje sistem Android.
WatchfaceView vsebuje instanco razreda WatchfaceEngine in nam preko svojih metod
omogoča posreden dostop do njega. Razred implementira tudi metodo redraw iz
»interface-a« Redraw, v kateri kliče metodo invalidate nad razreda View in s tem sproţi
osveţitev risalne površine. Z WatchfaceView razredom pridobimo element, ki ga lahko
enostavno dodamo kamorkoli v grafični vmesnik naše aplikacije in brez teţav prikaţemo
in animiramo obliko ure. V naši mobilni aplikaciji smo WatchfaceView uporabili za
predogled watchface-ov na telefonu, preden jih uporabniki namestijo na uro.
6.1.2 WatchfaceEngineHelper
Za pomoč pri prikazu in animaciji watchface-ov na pametni uri Android smo napisali
razred WatchfaceEngineHelper, ki deduje od razreda CanvasWatchFaceService. V
navodilih za razvoj watchface-ov na uradni strani za Android razvijalce je zapisano, da
moramo za pravilno delovanje watchface-ov na uri uporabiti enega izmed dveh nad
razredov. Izbiramo lahko med razredom CanvasWatchFaceService, ki nam omogoča izris
watchface-ov na element Canvas, in razredom Gles2WatchfaceService, ki nam omogoča
risanje watchface-a z OpenGL ES 2.0. Ker nam element Canvas ponuja metode za izris
vseh elementov, ki jih ţelimo izrisati in je tudi bolj enostaven za uporabo, smo se odločili,
da za izris in animacijo ne bomo uporabili OpenGL načina. Tako kot WatchfaceView tudi
WatchfaceEngineHelper implementira metodo »redraw« in ob instanciranju objekta
WatchfaceEngine v konstruktorju poda referenco na sebe. SetWatchface metoda v
WatchfaceEngineHelper razredu nastavi še dodatne parametre za izgled sistemskih
gradnikov na uri, kot je vidno na primeru programska koda 6.1.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
28
Programska koda 6.1: Nastavitev sistemskih indikatorjev
Da na uri uporabimo WatchfaceEngine, moramo ustvariti razred, ki deduje od
WatchfaceEngineHelper razreda. Nato lahko kličemo metodo »setWatchface«, da
naloţimo ţeleno uro, za podrobnosti implementacije pa poskrbi nad razred.
6.2 Opis delovanja razreda WatchfaceEngine
WatchfaceEngine nam ponudi vrsto metod, ki omogočajo izbiro watchace-a, ki ga ţelimo
prikazati, pa tudi nastavitev nekaterih parametrov, ki jih WatchfaceEngine potrebuje, da
lahko pravilno izriše elemente na zaslon.
Preden se začne izris elementov na zaslon, moramo WatchfaceEngine-u sporočiti podatke
o uri, na kateri bo izrisoval grafične elemente. Engine mora sprejeti podatek o tem, ali je
pametna ura okrogla ali pravokotna ter velikost brade v slikovnih pikah. Te podatke
posredujemo preko metode setLayoutProperties. Na pametni uri te podatke pridobimo v
metodi onApplyWindowInsets, na mobilnem telefonu, kjer nam sistem teh podatkov ne
posreduje, pa jih lahko prirejamo glede na naše zahteve. Prav tako moramo v
WatchfaceEngine pošiljati podatek o tem, ali je ura v spanju ali v stanju budnosti.
Watchface naloţimo s pomočjo metode setWatchface, ki sprejme objekt tipa
WatchfaceInfo, v katerega moramo predhodno naloţiti podatke o watchface-u. Prav tako
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
29
sprejme parameter »selectedLayout«, ki označuje izbiro skupine elementov, ki se naj
izriše, saj naš format podpira dodajanje večih slojev v en watchface.
6.2.1 SetWatchface
Metoda »setWatchface« iz objekta tip WatchfaceInfo prebere hitrost osveţevanja risalne
površine in tip ure, za katero je bil watchface ustvarjen. Dimenzije posameznega tipa ure
so definirane v razredu WFLayout in jih pridobimo s klicem statične metode
getLayoutDimensions, ki ji podamo tip ure iz naloţenih podatkov. Metoda vrne objekt tipa
Point, ki vsebuje resolucijo podanega tipa ure. Definirali smo 4 različne tipe ur:
Android Wear Square: 320x320 slikovnih pik
Android Wear Round: 320x320 slikovnih pik
Android Wear Round Chin: 320x290 slikovnih pik
Pebble: 144x168
Metoda setWatchface nato dostopi do seznama vseh elementov, ki jih mora izrisati in nato
pokliče metodo »initialize« vsakega posameznega elementa. Tukaj damo elementom
priloţnost, da si pripravijo vse potrebne vire, preden se začne osveţevanje na zaslon. Vsak
grafični element mora dedovati od nad razreda WFElement, ki tudi delno skrbi za
ţivljenjski cikel vsakega elementa.
Prav tako v metodi »setWatchface« ustvarimo razred tipa WFCanvas s parametri resolucije
zaslona ure, za katerega je bil watchface ustvarjen. Preko razreda WFCanvas bo potekal
izris elementov na zaslon.
6.2.2 Render
Po tem, ko smo nastavili vse potrebno, lahko začnemo z izrisom elementov na zaslon. Izris
poteka v metodi render, ki sprejme parameter tipa Canvas. Metodo render mora v metodi
onDraw klicati objekt, ki uporablja razred WatchfaceEngine. Metodo onDraw kliče sistem
Android in s tem sporoči objektu, da lahko osveţi svojo risalno površino. Sami nimamo
popolnega nadzora nad tem, kdaj bo sistem poklical metodo onDraw, lahko pa sporočimo,
da je osveţitev potrebna s klicem metode invalidate. Sistem Android na uri poskrbi, da se
bo metoda onDraw poklicala enkrat na minuto. Če ţelimo povečati hitrost osveţevanja,
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
30
moramo narediti svoj števec, ki bo na določen čas zahteval osveţitev zaslona. V
WatchfaceEngine smo tak števec implementirali s pomočjo razreda Handler, kar je tudi
priporočen način na sistemu Android. Števcu nastavimo hitrost osveţevanja na vrednost, ki
jo preberemo iz shranjenega watchface-a. Nato števec na določeno število milisekund
pokliče metodo »redraw« na objektu, čigar referenco smo poslali v WatchfaceEngine.
V metodi onDraw v WFCanvas pošljemo Canvas objekt, ki ga onDraw sprejme kot
parameter. Prav tako iteriramo skozi seznam vseh grafičnih elementov. Preden nad vsakim
kličemo metodi »updateValues« in »render«, za vsak element preverimo, ali je namenjen
izrisu, ko je ura v stanju budnosti ali v stanju spanja in primerjamo to nastavitev s
trenutnim stanjem ure preko metode isCandidateForRendering, katere implementacija je
postavljena v nad razred WFElement, od katerega dedujejo vsi grafični elementi.
Naš sistem je urejen tako, da vsak grafični element poskrbi za izris samega sebe, ko
WatchfaceEngine pokliče njegovo metodo render, kot je vidno na primeru programska
koda 6.2.
Programska koda 6.2: Izris pravokotnika
Na tak način smo ustvarili sistem, kjer lahko brez teţav dodajamo nove vrste grafičnih
elementov, in sicer tako, da preprosto dodamo novo implementacijo izrisa, drugih stvari pa
ne rabimo spreminjati, saj je vsak lik neodvisen od preostalega sistema.
Vsak lik poskrbi za implementacijo sestavnih delov, ki so potrebni za njegovo pravilno
delovanje, nekateri deli pa so skupni vsem likom. Te smo prestavili v nad razred
WFElement in si jih delijo vsi grafični elementi, ki dedujejo od tega nad razreda. Nad
razred WFElement poskrbi za lastnosti, kot so koordinate lika, rotacijska točka, rotacija in
stopnja vidnosti lika.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
31
6.3 Skaliranje
Zato ker mora WatchfaceEngine izrisovati ure na različne oblike zaslonov, smo morali
poskrbeti za pravilno skaliranje prikazane slike. Naš cilj je bil, da bomo lahko po ţelji
spreminjali razmerja stranic risalne površine, ki jo podamo WatchfaceEngine-u, ta pa bo
izris prilagodil tako, da bo ohranil originalno razmerje ure, za katero je bil ustvarjen
naloţen watchface. Za namen skaliranja smo ustvarili razreda Metrics in WFCanvas.
6.3.1 Metrics
Razred Metrics v konstruktorju sprejme podatke o višini in širini originalne risalne
površine, za katero je bil watchface ustvarjen, in trenutno višino in širino risalne površine,
na katero se bo moral izrisati watchface. Če bi vedno izrisali elemente na njihove absolutne
koordinate, ki so shranjene v json zapisu, bi se zgodilo, da bi na manjših urah nekateri
segali izven zaslona, pri večjih urah pa ne bi napolnili celotne površine.
Razred Metrics primerja razmerje med dolţinami višine in širine originalne in trenutne
risalne površine. Izbere stranico originalne površine, ki se mora najmanj povečati ali
zmanjšati, da dobi velikost kot enaka stranica trenutne površine. Dobljeno razmerje priredi
tudi skalirnemu razmerju za drugo stranico, tako da bo izrisana slika ohranila enako
razmerje stranic.
Prav tako smo morali skalirano sliko prestaviti na sredino trenutne risalne površine. To
smo dosegli s parametroma »offsetX« in »offsetY«. Vrednosti predstavljata odmik od ţe
pretvorjenih izhodiščnih točk vsakega elementa, ki ga izrišemo. Vrednost za offsetX smo
izračunali tako, da smo polovico skalirane originalne širine odšteli od polovice trenutne
širine. Seveda smo vrednost za offset izračunali le za stranico, ki smo ji spremenili velikost
po skalirnem razmerju obratne stranice. Ko razred Metrics izračuna skalirno razmerje in
odmike po x in y osi, so ti podatki na voljo preko javnih metod razreda.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
32
6.3.2 WFCanvas
Da se nismo rabili ob vsakem izrisu grafičnih elementov na zaslon ukvarjati s skaliranjem,
smo ustvarili razred WFCanvas, ki deluje kot konkretna implementacija risanja na
površino. S tem smo dosegli veliko ločenost med kodo za izris elementov in dejanskim
risanjem. Trenutno uporabljamo izris na element Canvas, če pa bi ţeleli risati z OpenGL,
bi morali samo ustvariti novo implementacijo razreda WFCanvas. Programska koda, ki
dostopa do metod za izris preko WFCanvasa, bi ostala popolnoma enaka. V WFCanvas
smo dodali metode, ki smo jih potrebovali, da smo lahko izrisali podprte elemente. V
konstruktorju ustvarimo razred Metrics, da lahko nato s podatki, ki jih nudi, pravilno
skaliramo vsak izris na Canvas.
Vedno ko ţelimo izrisati grafični element, moramo njegove x in y koordinate skalirati s
pomočjo metode convertHeightForPosition ali convertWidthForPosition. To moramo
storiti iz tega razloga, ker morajo biti vsem pozicijskim vrednostim prišteti še odmiki, da je
slika izrisana v sredini trenutne risalne površine. Za vsako vrednost, ki ni odvisna od
poloţaja elementa, kot je na primer višina besedila, moramo uporabiti skalirni metodi
convertHeightForSize in convertWidthForSize. Ti dve metodi pri računanju ne upoštevata
odmikov in vrneta le originalno vrednost, pomnoţeno s skalirnim faktorjem. Uporaba
omenjenih metod je vidna na primeru programska koda 6.3.
Programska koda 6.3: Izris besedila s skaliranjem
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
33
7 ZNAČKE
Da lahko uporabniki ustvarjajo dinamične elemente, ki se premikajo, spreminjajo velikost
in se vrtijo, smo uvedli sistem značk. Značka v okolju platforme Watchface Editor
predstavlja spremenljivko, ki se ji lahko skozi čas spreminja vrednost. Značke lahko
dodamo v skoraj vse lastnosti elementov. Zato ker je naša platforma ločena na mobilno
aplikacijo in spletno stran, smo morali sistem značk implementirati tako v programskem
jeziku JavaScript kot tudi v programskem jeziku Java. Podrobneje bomo obdelali del, ki
teče na mobilni aplikaciji in pametni uri Android Wear.
Z uvedbo značk v naš sistem smo dali uporabnikom veliko moč pri upravljanju z elementi
na risalni površini. Uporabnik lahko na primer vstavi značko v lastnost pravokotnika, ki
predstavlja x koordinato njegove pozicije. Če bo za koordinato x vstavil značko za trenutno
sekundo v minuti, se bo pravokotnikov poloţaj spremenil vsako sekundo, glede na
vrednost značke. Če dodamo značko v lastnost, ki predstavlja višino pravokotnika, se bo
pravokotniku vsako minuto velikost povečala od 0 do 59, kot se bo spreminjala vrednost
značke za sekundo.
7.1 Oblika zapisa
Da bi bile značke takoj prepoznavne v nizu znakov in da bi imele enostavna imena, ki si jih
ne bi bilo teţko zapomniti, smo uvedli sistem poimenovanja značk:
Vsebina vsake značke se zapiše v oglatih oklepajih
Prve črke v znački označujejo skupino, v katero značka spada. WH pomeni vreme,
T pomeni čas
Sledi opis podatka, ki ga značka vrne. Lahko je okrajšan ali pa izpisan s celotno
besedo za laţje razumevanje
Če značka vrne samo tekstovno vrednost, moramo na koncu imena dodati veliko
črko T.
Značka za število trenutnega meseca torej izgleda tako: [Tmonth]
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
34
7.2 Vrste značk
V našo aplikacijo smo vgradili veliko število različnih značk. Zraven obveznih značk za
časovne parametre smo dodali še značke za vreme, lokacijo, stanje telefona in ure, koledar
in značke za senzorje na uri.
7.2.1 Čas
Značke za čas so najbolj temeljne značke našega sistema. So največkrat uporabljene, saj
brez njih ne moremo ustvariti watchface-a, ki kaţe čas. V kategoriji značk za čas najdemo
18 značk, med drugim tudi:
Značke, ki vrnejo vrednost trenutnega časa
To so značke za trenutno sekundo v minuti, minuto v uri in uro v dnevu.
Uporabljajo se lahko za izpis časa v obliki digitalne ure
Značke za rotacijo
Te značke vrnejo rotacijske vrednosti v stopinjah za sekunde, minute itd.
Uporabljajo se za nastavitev rotacije za analogne kazalce
Značke za neprekinjeno rotacijo
Te značke vrnejo rotacijske vrednosti v stopinjah za sekunde, minute itd. Vrednosti,
ki jih vrnejo, so takšne, da je rotacija kazalcev neprekinjena in se na primer
vrednost za uro spreminja vsako minuto in ne samo vsako polno uro.
Značke za datum
Vrnejo vrednosti, ki predstavljajo trenutni mesec, leto in dan v mesecu itd.
7.2.2 Vreme
Ker uporabniki ţelijo zraven trenutnega časa na pametni uri videti še druge podatke, smo
dodali še značke za vreme. Trenutno ponujamo na izbiro šest značk za stanje vremena:
Trenutna temperatura
Kratek opis vremena
Stanje vremena
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
35
Vlaţnost
Pritisk
Hitrost vetra
7.2.3 Stanje telefona
Za prikaz trenutnega stanja telefona kar na naši pametni uri ponujamo tudi sedem značk za
te vrednosti:
Stanje baterije
Temperatura baterije
Stanje polnjenja telefona
Ali imamo omogočene mobilne podatke
Ime mobilnega operaterja
Stanje povezave na WiFi omreţje
Ime povezanega WiFi omreţja
7.3 Pridobitev podatkov
Vrednosti za časovne značke lahko pridobimo neposredno iz ure ali telefona, kjer teče
programska koda modula Watchface Editor engine. Podatke za nekatere skupine značk, kot
so značke za vreme in stanje telefona, pa lahko pridobimo samo na telefonu, na uri pa ne.
Da pridobimo podatke za vreme, potrebujemo dostop do interneta, saj so podatki na voljo
preko spletnega servisa. Podatke o telefonu, kot so stanje baterije, pa lahko pridobimo
samo s pomočjo programske kode, ki teče na telefonu.
Napisali smo sistem, po katerem lahko iz telefona na uro enostavno pošiljamo potrebne
podatke. Za pridobitev podatkov poţenemo na mobilnem telefonu »Service«. To je del
aplikacije, ki lahko teče v ozadju in ne potrebuje grafičnega vmesnika. Vsaka skupina
značk ima svoj »Service«, ki ga aplikacija poţene po določenem času. Ker imamo v json
zapisu navedeno, katere skupine značk uporablja naloţen watchface, lahko mobilna
aplikacija poganja samo potrebne »Service«, da prihrani baterijo. Prav tako lahko
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
36
uporabniki v nastavitvah aplikacije ročno vklopijo ali izklopijo pridobivanje podatkov za
izbrano skupino značk.
7.4 Razredna arhitektura
Vsaka skupina značk se nahaja v svoji mapi v modulu Watchface Generator engine. To
smo naredili za večjo preglednost in da iskano značko laţje najdemo. Za primer arhitekture
bomo opisali skupino značk za čas, saj so vse druge skupine narejene po istem principu.
Vse značke za čas se nahajajo v mapi »tag«, ki jo najdemo v mapi »timegroup«. Znotraj
mape »timegroup« lahko najdemo razred TimeGroup, ki deduje od nad razreda TagGroup.
V razred TimeGroup moramo dodati vse značke, ki so del skupine značk za čas, kar je
vidno na primeru programska koda 7.1. Prav tako lahko na tem mestu značkam podamo še
dodatne specifične parametre, ki jih potrebujejo, da lahko vrnejo zahtevane vrednosti. V
primeru značk za čas vsaki znački podamo referenco na objekt tipa Time. To storimo
predvsem zato, da ne rabi vsaka značka ustvariti svoje instance. Nad razred TagGroup
vsebuje metodo getTag, ki sprejme parameter tipa String. Parameter je ime značke, ki jo
metoda poskusi poiskati v seznamu dodanih značk. Če najde ujemajoče ime, vrne
referenco na objekt iskane značke.
Vsaka značka je v modulu Watchface Generator engine zapisana v svoj razred. Vse značke
morajo dedovati od razreda Tag. V razredu Tag obstajajo metode za pridobitev vrednosti
značke in za spremembo njene vrednosti. Prav tako vsebuje abstraktno metodo
updateValue, ki jo mora implementirati vsaka značka, in kjer se pridobi in posodablja
vrednost, ki jo značka vrne. Ker časovne značke v konstruktorju sprejmejo objekt tipa
Time, smo tega dodali v razred TimeTag, od katerega dedujejo vse časovne značke, sam pa
deduje od razreda Tag.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
37
Programska koda 7.1: Dodajanje značk za čas
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
38
8 OBDELAVA ZNAČK IN IZRAZOV
Eden izmed najpomembnejših delov celotnega Watchface Editor engine modula je
nedvomno razred Parser. Glavna naloga tega razreda je ta, da pretvori niz znakov, ki jih
lahko uporabniki vpišejo v lastnosti elementov v število, ki se nato uporabi za izris
elementa na zaslon. Parser, napisan za mobilno aplikacijo in pametno uro, podpira
pretvorbo samostojne značke, več značk zapisanih v enem nizu za prikaz v elementu
WFLabel, ovrednotenje preprostih matematičnih izrazov kot tudi skriptiranje s skriptnim
jezikom JavaScript.
Da lahko učinkovito pretvarjamo značke ali izraze v števila, smo morali v ta namen
prilagoditi velik del celotnega Watchface Editor engine modula. Objekt tipa Parser
ustvarimo v WatchfaceEngine-u, od koder ga posredujemo vsem grafičnim elementom.
Grafični elementi so v namen optimizacije obdelave značk dobili ţivljenjski cikel, pa tudi
značke same so tesno povezane z razredom Parser, saj le-ta iz njih pridobi potrebne
podatke, da lahko v grafične elemente vrne zahtevana števila ali nize.
8.1 Ţivljenjski cikel grafičnih elementov
Da lahko na mobilnem telefonu in uri animiramo elemente glede na vrednost značk,
moramo ugotoviti, katera značka se nahaja v lastnosti elementa. Zaradi potrebe po vpisu
značk v lastnosti grafičnih elementov so vse lastnosti, kot na primer koordinate x in y, ki
lahko sprejmejo značko, tipa String.
V namen obdelave značk smo uvedli ţivljenjski cikel vseh grafičnih elementov, ki
dedujejo od nad razreda WFElement. Ţivljenjski cikel razreda definira metode in vrstni
red, po katerem se bodo te metode klicale. Ţivljenjski cikel grafičnih elementov se sproţi v
metodi setWatchface razreda WatcfaceEngine. V tej metodi se kliče metoda »initalize«
vsakega grafičnega elementa, ki ima implementacijo tudi v abstraktnem razredu
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
39
WFElement. Metoda v abstraktnem razredu nato nadaljuje s klici specifičnih metod, kjer se
obdelajo vse značke določenega elementa in se element pripravi na animiranje.
8.1.1 Optimizacija lastnosti
Kot prva se vedno kliče metoda optimizeProperties. Ker vse lastnosti elementov vedno
prejmemo kot niz tipa String, v začetku obdelave ne vemo, v kateri lastnosti je zapisana
značka in v kateri samo število. Če je v lastnosti zapisano število, pomeni, da se vrednost
te lastnosti v času izrisa ure ne bo nikoli spremenila. Ker bo vrednost vedno enaka, je ne
rabimo posodabljati. V metodi optimizeProperties za vsako lastnost preverimo, ali vsebuje
število ali še kakšne druge znake. Abstraktni razred WFElement vsebuje svojo
implementacijo te metode, v kateri optimizira lastnosti, ki so skupne vsem grafičnim
elementom. Če ima grafični element še kakšne dodatne lastnosti, mora poskrbeti, da bo
dodal kodo za njihovo optimizacijo v svojo optimizeProperties metodo. Primer tega je
krog, ki ima lastnost polmer.
Lastnosti, ki jih preberemo iz json zapisa, se bodo v grafične elemente naloţile v
spremenljivke tipa String. To so koordinate, podatki o višini, širini in rotaciji. Da lahko te
vrednosti uporabimo za izris elementov na risalno površino, jih moramo pretvoriti v
spremenljivke tipa float. V metodi optimizeProperties preverimo, ali je določena lastnost
število, in to število priredimo pripadajoči spremenljivki tipa float, kot je vidno na primeru
programska koda 8.1.
Programska koda 8.1: Optimizacija x koordinate
Iz programske kode 9 je razvidno, da vsako lastnost grafičnega elementa v kodi
predstavimo z dvema spremenljivkama. Pri x koordinati sta to spremenljivki x tipa String
in xF tipa float. S tem, ko spremenljivko tipa String nastavimo na null, damo nadaljnjemu
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
40
postopku optimizacije vedeti, da ta lastnost ne vsebuje značke in da ne potrebuje dodatne
obdelave.
8.1.2 Grajenje HashMap
Po tem, ko se izvajanje metode optimizeProperties zaključi, se kliče metoda
buildHashMap. Vsaka lastnost tipa String, ki ni bila nastavljena na vrednost null v metodi
optimizeProperties, se pošlje v nadaljnjo obdelavo. Lastnost podamo kot parameter metode
buildHashMap objekta Parser, kjer izvedemo pred procesiranje nizov.
8.1.3 Posodobitev lastnosti
Pred vsakim klicem metode render grafičnih elementov se pokliče metoda updateValues.
Klic izvede WatchfaceEngine. V tej metodi pridobimo dejanske številčne vrednosti za vse
lastnosti, ki so imele vpisane značke. Preskočimo tiste, ki so vsebovale samo števila.
Razred Parser nam nudi dve vrsti metod za pridobitev vrednosti. Za numerične lastnosti
uporabimo metodo parseNumber, za lastnosti, kot so vsebina teksta, pa imamo na voljo
metodo parseString.
8.1.4 Izris
Ko se mora grafični element izrisati na risalno površino, WatchfaceEngine pokliče njegovo
metodo render. Če smo pravilno implementirali metode ţivljenjskega cikla elementa, bo ta
imel na tem mestu vse potrebne vrednosti, da se izriše na zaslon. Metoda render je kritična
za delovanje celotnega sistema, saj se kliče ob vsaki osveţitvi, kar je lahko tudi 50 krat na
sekundo. Iz tega razloga moramo biti zelo pozorni na programsko kodo, ki se nahaja v tej
metodi. Paziti moramo, da v tej metodi ne izvajamo nepotrebnih operacij in da ne
ustvarjamo novih objektov.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
41
8.2 Parser
Razred Parser ustvarimo, preden se začne izris slike in ga nato posredujemo razredom, ki
ga potrebujejo. V konstruktorju razreda ustvarimo objekte, ki dedujejo od razreda
TagGroup, da lahko Parser dostopa do podatkov vsake posamezne značke.
Parser mora razčleniti in ovrednotiti niz, ki ga prejme kot argument v metodi parseNumber
in parseString. V tabeli 8.1 si lahko ogledamo vrnjene vrednosti teh dve metod glede na
vhodni parameter, če za primer vzamemo, da je trenutni čas 15:30:24. Značka Ts
predstavlja trenutno sekundo in značka Tm trenutno minuto.
Tabela 8.1: Primer zapisa značk
Vhodni parameter parseNumber parseString
»[Ts]« 24 »24«
»[Tm]-[Ts]« Ni definirano »30-24«
»=[Tm]-[Ts]« 6 »6«
Ker se vrednosti značk spreminjajo skozi čas, moramo ob vsaki osveţitvi ponovno
ovrednotiti vse lastnosti, ki se lahko spremenijo. Iz tega razloga mora biti programska koda
v Parserju optimizirana do take meje, da se ob klicu metod parseNumber in parseString
izvajajo le najbolj nujne operacije.
8.2.1 Predprocesiranje
Operacije za ugotavljanje, katera značka se nahaja v nizu in kakšna je njena natančna
pozicija v nizu, so dokaj zahtevne in bilo bi zelo slabo za delovanje sistema, če bi jih
izvajali v vsaki osveţitvi risalne površine. Čeprav se elementi lahko premikajo po zaslonu
in izgledajo zelo dinamično, se podatki o njihovih lastnostih nikoli ne spremenijo. To
posledično pomeni, da moramo v Parserju vedno pregledovati enake nize znakov, za katere
grafični elementi zahtevajo vrednosti, da lahko sami sebe izrišejo na zaslon. Iz tega razloga
smo se odločili, da bomo poskusili pridobiti čimveč podatkov o nizih ţe pred začetkom
izrisovanja. To storimo v metodi »buildHashMap«. Metodo morajo klicati grafični
elementi in poslati v njo vse lastnosti, ki jih ţelijo kasneje ovrednotiti.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
42
Metoda kot parameter sprejme niz znakov, ki lahko vsebuje samo eno značko ali celoten
izraz, ki ga je potrebno ovrednotiti. Niz najprej pregledamo za vse značke. Uporabimo
regex izraz, ki poišče niz znakov, ki se sklada z našimi pravili za izgled značke. Nato
ustvarimo seznam za objekte tipa PreprocessedTagInfo, v katerega shranimo vse najdene
značke skupaj z njihovimi pozicijami v originalnem nizu. Objekti TagGroup nam
posredujejo značke glede na iskano ime značke in nam vedno vrnejo samo eno instanco
določene značke. Referenco na to značko shranimo še v globalni seznam značk, ki ga
hranimo v Parserju. Iz tega sledi, da čeprav se enaka značka pojavi v več različnih nizih,
bo v celotnem sistemu obstajala samo ena instanca te značke.
Seznam značk in originalen niz nato shranimo v objekt tipa PreprocessedStringInfo. Ta
preveri, ali je niz izraz in posledično tudi, če vsebuje le preproste matematične operacije ali
tudi JavaScript programsko kodo. Objekt PreprocessedStringInfo z vsemi informacijami o
nizu dodamo v HashMap, ki hrani podatke v obliki ključ in vrednost. Kot ključ podamo
hash vrednost originalnega niza, kot vrednost pa objekt tipa PreprocessedStringInfo. S tem
smo podatke o nizu shranili za uporabo v času osveţevanja risalne površine.
8.2.2 Osveţevanje vrednosti značk
Ker sistem nima podatka o tem, kdaj bo katera značka spremenila vrednost, se mora ob
vsaki osveţitvi poslati ukaz v vse aktualne značke, da osveţijo svoje vrednosti. Omenjeno
operacijo izvedemo v razredu WatchfaceEngine s klicem metode updateTags razreda
Parser, preden kličemo metode render vsakega grafičnega elementa. V metodi updateTags
se nad vsako značko v globalnem seznamu značk pokliče metoda updateValue. Metoda
updateValue vsake značke je pomembna za Parser zato, ker je vsaka značka zadolţena, da
v tej metodi preveri, ali se je njena vrednost od zadnje osveţitve spremenila. Če se je,
nastavi zastavico hasChanged na vrednost true.
Programska oprema za animiranje oblik ur in izdelava formata za njihovo shranjevanje na platformi Watchface Editor
43
8.2.3 Pridobitev vrednosti za podan niz
Metodi parseNumber in parseString delujeta zelo podobno. Razlikujeta se le v tem, da
metoda parseNumber vrne numerično vrednost tipa float, metoda parseString pa tekstovno
vrednost tipa String. Metodi se izvajata v času osveţevanja, zato moramo biti pazljivi, da
implementacija ni procesorsko zahtevna in da ne ustvarjamo nepotrebnih objektov.
Najprej iz HashMap seznama pridobimo PreprocessedStringInfo objekt za niz, ki je podan
v metodo. Če niza prej nismo poslali v obdelavo v metodo buildHashMap, ga sistem na tej
točki ne bo mogel ovrednotiti in bo metoda parseNumber vrnila privzeto vrednost 1,
metoda parseString pa kar nespremenjen niz.
Če bo niz najden v HashMap seznamu, bosta metodi najprej preverili, ali je v nizu zapisan
izraz. Ta podatek je shranjen v objektu PreprocessedStringInfo, ki smo ga pridobili iz
seznama HashMap. Če je niz izraz, bosta tega najprej posredovali metodi replaceTags, ki
bo vse značke v nizu zamenjala z njihovimi vrednostmi. Metoda replaceTags uporablja
StringBuilder, preko katerega manipulira z nizom, zato ker ta ob operacijah nad nizom ne
ustvarja dodatnih objektov. Originalen niz dodamo v StringBuilder in nato zamenjamo v
tej kopiji originalnega niza vse pojavitve značk z njihovimi trenutnimi vrednostmi. To
lahko naredimo brez teţav, saj imamo podatke o vrsti in poziciji značk shranjene v objektu
PreprocessedStringInfo. V kopijo originalnega niza zapišemo vrednosti vseh značk,
pretvorjenih v obliko tipa Stri