Kontekstuaalinen tila on työkalu, joka tarjoaa käyttäjälle vaihtoehtoja valituista kohteista, kuten kuvia tai listan alkioita, mutta vain, kun ne ovat aktiivisesti valittuja. Tämä tila, joka käynnistyy pitkällä painalluksella, on olennainen osa monia sovelluksia, joissa valitaan useita objekteja tai tehdään erityistoimintoja, kuten kopiointi, liittäminen, tai poistaminen.
Kontekstuaalisen tilan käynnistäminen alkaa pitkällä klikkauksella. Ensimmäinen askel on luoda pitkän klikkauksen kuuntelija onCreate()-metodissa ImageView-komponentille. Kun pitkä painallus tunnistetaan, aktivoidaan kontekstuaalinen tila ja annetaan ActionMode-palautekutsun hallita kyseistä tilaa. Kontekstuaalisen tilan käyttöön liittyvät vaiheet voidaan jakaa useisiin yksinkertaisiin osiin.
Ensimmäiseksi luodaan kaksi merkkijonoa strings.xml-tiedostoon. Nämä merkkijonot edustavat toimintovalintoja, jotka näkyvät valikossa. Esimerkiksi "Cast" ja "Print". Tämän jälkeen luodaan kontekstuaalinen valikko XML-muodossa context_menu.xml-tiedostoon, joka määrittelee valikon sisältämät toiminnot. XML-tiedosto voisi näyttää seuraavalta:
Seuraavaksi lisätään ImageView komponentti activity_main.xml-tiedostoon, joka toimii lähteenä kontekstuaalisen tilan aloittamiselle. ImageView määritellään seuraavasti:
Kun käyttöliittymä on luotu, voidaan siirtyä koodin kirjoittamiseen kontekstuaalisen tilan hallitsemiseksi. Ensimmäiseksi määritellään globaali muuttuja, joka tallentaa ActionMode-instanssin, joka palautetaan, kun startActionMode()-metodia kutsutaan:
Seuraavaksi luodaan ActionMode.Callback, joka käsittelee kontekstuaalisen tilan tapahtumat, kuten valikon luomisen ja valitun toiminnon suorittamisen. Tämä palautekutsu määritellään seuraavasti:
Kun palautekutsu on luotu, kontekstuaalinen tila voidaan aktivoida pitämällä sormea ImageView-komponentin päällä. Tämä tapahtuu onCreate()-metodissa asettamalla pitkä painalluskuuntelija seuraavasti:
Kun ohjelma ajetaan laitteella tai emulaattorilla, pitkä painallus aktivoikin kontekstuaalisen tilan, ja käyttäjä voi valita yhden tai useamman toiminnon.
Ymmärtääksesi tämän toiminnan syvemmin, on tärkeää tietää, että ActionMode-instanssia voidaan käyttää muokkaamaan itse kontekstuaalista toimintapalkkia. Esimerkiksi, jos sovelluksessa valitaan useita kohteita, voit muuttaa toimintapalkin otsikkoa seuraavalla koodilla:
Tämä on erityisen hyödyllistä, kun käsitellään useiden kohteiden valintaa, kuten seuraavassa esimerkissä. Kontekstuaalinen tila mahdollistaa myös muiden kuin yksittäisten elementtien valinnan, kuten ListView-komponentin avulla. Tässä tilassa voi valita useita kohteita, ja sovellus suorittaa valitun toiminnon koko valitulle ryhmälle, mikä parantaa käyttäjäkokemusta verrattuna perinteisiin oikealla klikkauksella avautuviin valikkoihin, jotka tukevat vain yhden kohteen valintaa.
Lisäksi on tärkeää huomioida, että kontekstuaalinen tila ei ole rajoitettu vain pitkään painallukseen. Voit myös yhdistää sen muiden käyttöliittymäelementtien kanssa, kuten yksittäisten kohteiden klikkaukset tai muiden tapahtumien, kuten pyyhkäisyn, tunnistamiseen.
Miten ottaa valokuvia Android-sovelluksessa käyttämällä Camera API:ta ja Camera2 API:ta
Android-kameran käyttöön liittyvä ohjelmointi voi aluksi tuntua yksinkertaiselta, mutta se sisältää monia yksityiskohtia ja erilaisia haasteita. Vanhemman Camera API:n ja uudemman Camera2 API:n välinen ero tekee kameran käytöstä monivaiheisen prosessin, jossa on otettava huomioon monenlaisia parametreja ja käyttäjän toivomia toimintoja. Tässä käsitellään ensin vanhemman Camera API:n käyttämistä ja sen jälkeen siirrytään Camera2 API:n tarjoamaan mahdollisuuteen.
Aluksi tarkastellaan perusasetuksia, jotka liittyvät kuvan ottamiseen. Vanhan Camera API:n käyttöön liittyy kaksi päävaihetta: esikatselun asetukset ja kuvan ottaminen. Esikatseluvaiheessa tarvitaan TextureView-objekti, joka toimii kameran esikatselupintana. Tämä näkymä määritellään XML-tiedostossa, ja sen jälkeen asetetaan kuuntelija, joka reagoi pinnan saatavuuteen. Kun esikatselupinta on valmis, käytämme Camera-objektia, joka määrittelee esikatselun ja aloittaa sen. Kun käyttäjä ottaa kuvan, kutsutaan takePicture-metodia, joka pyytää kameran ottamaan valokuvan.
Kuva otetaan niin, että kamera tallentaa sen tietyssä tiedostokohteessa. Tiedosto nimetään aikaleiman mukaan ja tallennetaan laitteen julkiseen kuvatiedostohakemistoon. Tämä tapahtuu FileOutputStream-objektin avulla, joka kirjoittaa kuvatiedot tiedostoon. Kuvan tallentamisen jälkeen käyttäjälle annetaan visuaalinen ilmoitus, että kuva on otettu onnistuneesti.
Yksi keskeinen haaste tämän prosessin toteutuksessa on kameran asetusten hallinta. Camera API tarjoaa mahdollisuuden muokata esikatselun ja kuvan asetuksia. Esimerkiksi voidaan muuttaa esikatselun kokoa ja tarkistaa laitteiston tukemat resoluutiot ennen kuin asetukset otetaan käyttöön. Tärkeää on kuitenkin muistaa, että kaikki laitteet eivät tue kaikkia asetuksia, ja siksi on tärkeää tarkistaa laitteiston tuki ennen asetusten määrittämistä.
Tässä yhteydessä on tärkeää huomata, että vaikka tämän kaltaisessa koodissa näkyy varoitus vanhentuneesta Camera API:sta, se ei tarkoita, että sitä ei voisi käyttää. Androidin uudempi Camera2 API on kuitenkin suositeltava, sillä se tarjoaa enemmän hallintaa ja joustavuutta kameran käytössä, vaikka sen käyttö on monimutkaisempaa ja asynkronista.
Camera2 API ja sen käyttö
Siirryttäessä uuteen Camera2 API:in huomataan, että se eroaa vanhasta API:sta monella tavalla. Camera2 API on suunniteltu monimutkaisempaa käyttöä varten ja se tuo mukanaan mahdollisuuden hallita kameran asetuksia tarkemmin. Esimerkiksi voidaan hallita tarkasti, miten kuvat otetaan ja miten kameran virtausprosessi hallitaan. Toisin kuin vanhassa Camera API:ssa, joka käyttää synkronisia kutsuja, Camera2 API käyttää asynkronisia menetelmiä, jotka mahdollistavat paremman suorituksen ja vähemmän viivettä.
Uuden API:n käyttöön valmistautuminen edellyttää monia vaiheita. Ensimmäinen askel on määritellä tarvittavat käyttöoikeudet Android-manifestissa. Tämä varmistaa, että sovelluksella on oikeus käyttää laitteen kameraa ja tallentaa kuvia. Seuraavaksi määritellään tarvittavat näkymät ja asetetaan TextureView, joka toimii esikatselupintana, sekä muut tarvittavat elementit käyttöliittymään.
Camera2 API:n käyttöön liittyy myös tärkeä vaihe, jossa määritellään CameraDevice, joka vastaa kameran avaamisesta ja sulkemisesta. Tämä objekti luodaan käyttämällä CameraDevice.StateCallback-luokkaa, joka huolehtii kameran tilan seuraamisesta. Kun kamera on avattu, luodaan tarvittavat ponnahdusnäytöt ja määritellään kameraa varten tarvittavat asetukset, kuten resoluutio ja esikatselun koko.
Tärkeä ero Camera API:n ja Camera2 API:n välillä on siinä, että Camera2 API tuo paljon enemmän säätömahdollisuuksia, mutta myös lisää monimutkaisuutta. Uuden API:n avulla voidaan määritellä muun muassa kuvan tarkkuus, tarkennus ja valotusaika paljon tarkemmin. Tämä mahdollistaa erikoistuneiden valokuvien ottamisen ja paremman hallinnan verrattuna perinteisiin kamerasovelluksiin.
Käytännön haasteet ja parannukset
Vaikka Camera2 API tuo mukanaan joustavuutta ja tarkempaa hallintaa, sen käyttö ei ole ongelmatonta. Yksi suurimmista haasteista on sen asynkroninen luonne, joka voi johtaa monimutkaisempaan koodiin ja virheiden käsittelyyn. Lisäksi ohjelmointi vaatii tarkempaa laitteistotuen huomioimista, koska ei kaikki laitteet tue kaikkia Camera2 API:n tarjoamia ominaisuuksia.
Kun rakennetaan oikeaa sovellusta, on tärkeää huomioida myös käytettävissä olevat resurssit, kuten muistinhallinta ja sovelluksen suoritusteho. Kuvan ottaminen ja käsitteleminen on raskasta prosessointia, ja sen toteuttaminen taustalla, ei käyttöliittymässä, on suositeltavaa suorituskyvyn parantamiseksi.
Lopuksi on muistettava, että Camera2 API on suunniteltu laajempaan ja syvempään kameran käyttöön, mutta sen käyttö vaatii huolellista virheiden käsittelyä ja optimointia. Jos tavoitteenasi on yksinkertainen kamerasovellus, vanha Camera API voi olla riittävä, mutta jos haluat tarjota enemmän mukautettavuutta ja tarkempaa hallintaa, Camera2 API on oikea valinta.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский