Näyttöjen tarkkuudet

Android laitteiden näyttöjen koot ja tarkkuudet vaihtelevat suuresti. Näin ollen käyttöliittymien suunnittelussa on otettava huomioon eri laitteet. Tässä paneudutaan näytön tarkkuuteen ja grafiikkaan.

Laitteiden näytöt jaetaan useaan eri tarkkuusluokkaan, jotka ovat 120, 160, 240 ja 320 pistettä tuumalle, eli nimeltään ldpi, mdpi, hdpi ja xhdpi. Kun ohjelmaan lisätään kuvia, voidaan jokaiselle tarkkuudelle tehdä oma kuvatiedosto. Tiedostot erotellaan laittamalla ne eri resurssi hakemistoihin, esim. “res/drawable-hdpi/kuva.png” — tämä kuva on tarkoitettu laitteille, jossa on tarkempi resoluutio. Jos laitteen resoluutio on esim. mdpi, niin ohjelma yrittää ensin löytää laiteelle tarkoitetun kuvatiedoston “res/drawable-mdpi/kuva.png”, mutta jos tätä ei löydy, niin tarvittava kuva skaalataan muista resoluutioista. Loppukäyttäjänä kannalta on paras, jos jokaiselle tarkkuudelle on tehty omat graafiikat — skaalatut graafikat voivat näyttää suttuisilta, mutta toisaalta lisäävät ohjelman kokoa.

Yksi oiva tapa pitää ohjelma sekä pienenä, että näyttämään hyvältä kaikilla tarkkuuksilla, on tehdä väriliu’ut ja skaalautuvat nappien taustat xml-tiedostoina ja nine-patch-kuvilla. Väriliut voidaan määritellä parilla rivillä xml-tiedostossa. Nappien ja muidenkin venyvien grafiikat voidaan tehdä nine-patch kuvalla, missä määritellään mikä osa kuvasta venyy.

iPadin piilotetut kosketuskomennot

iPadille tuli iOS 4.3 käyttöjärjestelmä päivityksen mukana pari uutta piilotettua kosketuskomentoa. Kyseiset komennot saa käyttöönsä automaattisesti päivityksen mukana, kunhan kyseinen iPad on sovelluskehitys käytössä.

Uudet komennot ovat viiden sormen pinch, joka vastaa home-napin painamista ja 4 sormen swipet, jotka vaihtavat käynnissä olevien appien välillä. Kuvasimme nopeasti videon, joka havainnollistaa uusia komentoja.

Kyseisillä komennoilla voidaan tehdä kaikki mitä home-nappia painamallakin. Voidaankin siis olettaa, että iPad 3:ssa kyseinen nappi tulee poistumaan.

Block-objektien käyttämisestä

iOS versiosta 4 lähtien iOS-koodissa on voinut käyttää block-objekteja. Nämä ovat etäistä sukua C-kielestä tutuille funktiopointtereille, mutta niitä voidaan luoda dynaamisesti koodissa, ja ne voivat viitata scopen sisällä oleviin muuttujiin. Esimerkki selventänee asiaa:

void(^myBlock)(double); // määrittää muuttujan nimeltä myBlock,
                        // jonka tyyppi on "block-object joka palauttaa void:n
                        // ja ottaa yhden double-argumentin
                        //(vrt. vastaavan funktiopointterin määritys)
double a = sqrt(2.);

// asetetaan arvo muuttujalle myBlock
myBlock = ^(double x) // tämä aloittaa block-objektin.
                      // Argumentti on nimetty jotta siihen voidaan viitata.
                      // Paluuarvon tyyppiä ei tarvitse erikseen ilmoittaa.
{
    // näiden sulkeiden sisällä oleva koodi kuuluu blokkiin (sitä ei siis suoriteta tässä vaiheessa)
    NSLog(@"I was called with :%f", x);
    NSLog(@"a == %f", a);
    NSLog(@"a * x == %f", a * x);
};

myBlock(sqrt(2.)); // blokkia kustutaan näin
myBlock(3.);

a = 2; // vaihdetaan a:n arvoa

myBlock(sqrt(2.)); // ja kutsutaan blokkia uudestaan.
myBlock(3.);

Em. koodi tuottaa tulosteena seuraavaa:

I was called with: 1.414214
a == 1.414214
a * x == 2.000000
I was called with: 3.000000
a == 1.414214
a * x == 4.242641
I was called with: 1.414214
a == 1.414214
a * x == 2.000000
I was called with: 3.000000
a == 1.414214
a * x == 4.242641

Kuten tulosteesta ehkä huomaa, a:n arvon muuuttaminen blokin luomisen jälkeen ei vaikuta blokkiin. Blokki “kaappaa” muuttujan arvon kun se luodaan.

Mitä näillä sitten voi tehdä? Esimerkki on aikalailla triviaalin tuntuinen, mutta isompana esimerkkinä on liitteenä QVURLConnection, blokkeihin perustuva wrapperi iOS:n NSURLConnectionille. Kirjoitin tämän, koska mielestäni NSURLConnection on useissa tapauksissa varsin hankala käyttää. Ideana siis on, että käytetään delegaattiolion sijaan blokkeja. Tällä tavalla saadaan koodin kulusta suoraviivaisempaa. Jälleen esimerkki valottanee.

// NSURLConnection:lla
// koodia
NSURLConnection* c = [NSURLConnection connectionWithRequest:req delegate:self];
// koodia
// ...
// toisaalla samassa luokassa
-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data {
    // tehdään jotain datalla
}
// jne...

// QVURLConnectionilla
QVURLConnection* c = [QVURLConnection connectionWithRequest:req
        completionBlock:^(QVURLConnection* connection, NSURLResponse* response, NSData* data) {
            // tehdään jotain responsella ja datalla
        } failureBlock:^(QVURLConnection* connection, NSError* error) {
            // tapahtui virhe
        }];

Koodin seuraaminen on helpompaa, sillä kutsun jälkeen tulee välittömästi se koodi, joka suoritetaan kutsun päätyttyä. Lisäksi tämä helpottaa todella paljon
tilanteita missä on useampia samanaikaisia kutsuja.

Block-objekteista saa lisää tietoa mm. Applen dokumentaatiosta.

QVURLConnectionia saa käyttää vapaasti miten tahtoo. Alkuperän mainitsemisesta saa karmapisteitä. Pyytäisin myös välittämään tietoa bugeista. Mahdolliset parannusehdotukset ovat toki tervetulleita (en kuitenkaan lupaa mitään).

Lataa QVURLConnection koodi tästä.

iOS 4.3, Xcode 4 ja iPad 2.

Apple on julkaissut kasan uusia tuotteita ja työkaluja sovelluskehittäjien iloksi.

iOS-sovelluskehittäjille karkkia.

iOS 4.3

iOS-käyttöjärjestelmän 4.3 versio tuli iTunesin kautta ladattavaksi tänään. Päivityksen luvataan nostavan Safarin suorituskykyä ja se tuo myös Oma yhteyspiste-ominaisuus iPhone 4:lle. Oma yhteyspiste-ominaisuudella voit jakaa iPhone 4:sen 3g-yhteyden muille laitteille langattomasti. Ominaisuus toimii vain, jos operaattori on sen sallinut, eli Suomessa ainakin Elisan ja Soneran liittymillä.

Päivitys on saatavissa seuraaville laitteille: iPhone 3GS, iPhone 4, iPod touch 3 gen, iPod touch 4 gen, iPad ja iPad 2.

Lue lisää Apple:n sivuilta : iOS 4.3 -ohjelmistopäivitys

XCode 4

iOS-sovelluskehittäjien työkalu XCode 4 on saannut pitkään odotetun kasvojenkohotuksen ja tukun kaivattuja parannuksia. XCode 4:sta kirjoitamme tulevaisuudessa varmaan lisää, kunhan pääsemme tekemään sillä enemmän töitä.

Lue lisää XCode:sta : What’s new in Xcode 4

iPad 2

Appel julkisti iPad 2 – tablettinsa viime viikolla ja julkaisee sen huomenna Yhdysvalloissa. Suomessa iPad 2 tulee kauppoihin 25 maaliskuuta, noin neljä kuukautta iPad 1:sen jälkeen. Tämä luo sovelluskehittäjille Suomessa erikoisen tilanteen, kun voidaan olettaa, että iPad 2 saa huomattavasti isomman markkinaosuuden kuin muualla maailmassa.

Palaan iPad 2:seen tarkemmin, kunhan saan sellaisen hyppysiini. Sillä aikaa voit lukea mitä mieltä Engadget on Applen uutukaisesta.

Lue lisää Applen-sivuilta : iPad 2