Contextual Mode, často spouštěný dlouhým stiskem na prvek uživatelského rozhraní, představuje speciální režim, ve kterém se zobrazuje tzv. Contextual Action Bar (CAB). Tento režim umožňuje uživateli vykonávat akce specifické pro právě vybraný prvek nebo více prvků. V Androidu je implementace Contextual Mode založena na použití rozhraní ActionMode a jeho callbacků, které zajišťují správu životního cyklu této akce.

Prvním krokem je přidání potřebných zdrojů, zejména řetězců, které budou reprezentovat položky v menu Contextual Mode. Tyto položky definujeme v XML souboru menu, například v res/menu/context_menu.xml, kde specifikujeme jednotlivé akce, jež se uživateli nabídnou. Poté je nutné vytvořit UI prvek, například ImageView, který bude aktivovat Contextual Mode při dlouhém stisku.

Klíčovou částí je vytvoření callbacku ActionMode.Callback, který obsahuje metody pro vytvoření menu, jeho aktualizaci, zpracování kliknutí na položky a ukončení režimu. V metodě onCreateActionMode() se menu nafoukne z XML a zobrazí se v Contextual Action Bar. Po výběru položky v menu callback onActionItemClicked() provede odpovídající akci, například zobrazí uživateli notifikaci (Toast) a ukončí režim.

Contextual Mode je spuštěn metodou startActionMode(), která přijímá právě tento callback jako argument. Důležité je také správně spravovat instanci ActionMode, aby nedocházelo k opakovanému spouštění režimu, pokud již běží. Tuto instanci je vhodné uchovávat v globální proměnné.

Při práci s Contextual Mode je užitečné uvědomit si, že kromě základního režimu pro jednu položku existuje i režim dávkového výběru (batch mode). Ten je často využíván v aplikacích, kde uživatel může vybrat více položek najednou, například ve správci souborů nebo v e-mailových klientech. V takovém režimu je nutné použít rozhraní MultiChoiceModeListener, které kromě základních funkcí navíc sleduje změny stavu výběru jednotlivých položek. Tento režim výrazně rozšiřuje možnosti Contextual Mode a nahrazuje starší kontextové menu, které nepodporovalo vícenásobné výběry.

Pro implementaci dávkového režimu je nutné upravit aktivitu tak, aby například rozšiřovala ListActivity, a nastavit ListView na vícenásobný výběr pomocí metody setChoiceMode(). Následně přiřadit MultiChoiceModeListener, který bude řídit chování CAB, jeho menu a reakce na uživatelské akce. Díky tomu lze nejen zpracovat výběr položek, ale i dynamicky měnit titul nebo další atributy Contextual Action Bar.

Významným aspektem je, že Contextual Mode v sobě spojuje správu uživatelského rozhraní a logiku aplikace – vývojář může velmi pružně reagovat na akce uživatele, přičemž CAB poskytuje přehledné a intuitivní ovládání. Díky tomu je uživatelská zkušenost lepší a vývoj moderních aplikací efektivnější.

Kromě samotné technické implementace je důležité chápat kontext použití Contextual Mode. Jeho síla spočívá v možnosti dynamicky reagovat na výběr uživatele a nabídnout relevantní akce přímo v místě interakce. Zároveň je třeba dbát na to, aby uživatelské rozhraní bylo konzistentní a odpovídalo běžným očekáváním uživatelů, zejména pokud jde o možnosti ukončení režimu nebo vizuální zpětnou vazbu.

Dále je vhodné pamatovat, že Contextual Mode není omezen jen na ImageView nebo ListView, ale může být aplikován na jakýkoli View prvek v rámci Android UI. Správná implementace vyžaduje pečlivé plánování, jaké akce budou dostupné, jak budou zpracovány a jak bude uživatel informován o probíhajícím režimu.

Jak implementovat funkci Pinch-to-Zoom a Swipe-to-Refresh v Android aplikacích

Pokud chcete přidat do své Android aplikace funkci Pinch-to-Zoom nebo Swipe-to-Refresh, budete potřebovat správně využít nástroje a widgety, které Android SDK poskytuje. V tomto textu si ukážeme, jak implementovat tyto dvě funkce krok za krokem.

Začněme s funkcí Pinch-to-Zoom, což je gesto, při kterém uživatel pohybuje dvěma prsty na obrazovce, aby změnil velikost objektu. Tato funkce je užitečná zejména pro aplikace, které zobrazují obrázky nebo mapy. K implementaci Pinch-to-Zoom v Androidu použijeme třídu ScaleGestureDetector.

V první řadě je nutné vytvořit instanci ScaleGestureDetector, která bude sledovat změny ve velikosti prstů. Následující kód ukazuje, jak nastavit ScaleGestureDetector a připojit jej k ImageView:

java
mImageView = (ImageView) findViewById(R.id.imageView);
mScaleGestureDetector = new ScaleGestureDetector(this, new ScaleListener());

Metoda ScaleListener je třída, která implementuje logiku pro zpracování gesta zvětšení. V rámci této třídy můžete definovat metodu onScale(), která je volána při změně měřítka:

java
public boolean onScale(ScaleGestureDetector detector) {
float scaleFactor = detector.getScaleFactor(); scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 10.0f)); // Omezujeme maximální a minimální hodnoty mImageView.setScaleX(scaleFactor); mImageView.setScaleY(scaleFactor); return true; }

Tento kód zajišťuje, že uživatel může zvětšit nebo zmenšit obrázek pomocí gesta Pinch-to-Zoom, přičemž se hodnoty měřítka omezí na interval od 0.1 do 10.0, aby nedošlo k extrémním změnám velikosti.

Dále, pro implementaci funkce Swipe-to-Refresh, která se používá k manuálnímu obnovení obsahu (např. seznamu) tažením prstem dolů, se využívá widget SwipeRefreshLayout. Tento widget je navržen tak, aby byl snadno použitelný, a poskytuje vizuální zpětnou vazbu uživateli, když je obsah aktualizován.

Nejprve musíte do layoutu přidat widget SwipeRefreshLayout a ListView, který bude obsahovat seznam dat. V XML layoutu bude kód vypadat takto:

xml
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

Poté v aktivitu přidáte potřebný kód pro inicializaci SwipeRefreshLayout a implementujete metodu pro obnovení seznamu:

java
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefresh);
mListView = (ListView) findViewById(android.R.id.list); String[] countries = new String[]{"Čína", "Francie", "Německo", "Indie", "Rusko", "Spojené království", "Spojené státy"}; List<String> mArrayList = new ArrayList<>(Arrays.asList(countries));
ArrayAdapter<String> countryAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mArrayList);
mListView.setAdapter(countryAdapter); mSwipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { refreshList(); } });

Metoda refreshList() přidává nový prvek do seznamu pokaždé, když je spuštěna akce obnovení:

java
private void refreshList() { mRefreshCount++; mArrayList.add("Obnovení: " + mRefreshCount);
ArrayAdapter<String> countryAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mArrayList);
mListView.setAdapter(countryAdapter); mSwipeRefreshLayout.setRefreshing(
false); // Ukončení indikace načítání }

Aby bylo zajištěno, že indikátor obnovení bude viditelný, když je akce obnovy prováděna programově (například z nabídky), použijte následující kód:

java
mSwipeRefreshLayout.setRefreshing(true);

Tento kód aktivuje indikátor načítání a informuje uživatele o tom, že obsah je aktualizován.

Pokud jde o implementaci senzorů v Android aplikacích, Android SDK poskytuje širokou podporu pro různé hardware senzory, které mohou být součástí zařízení. Nejčastěji používané senzory zahrnují akcelerometr, gyroskop, kompas, senzor tlaku a světelný senzor. Každý senzor je zastoupen třídou Sensor, a aplikace může získat přístup k těmto senzorům prostřednictvím třídy SensorManager.

Pokud chcete zjistit, jaké senzory jsou k dispozici na konkrétním zařízení, můžete použít následující kód:

java
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

Tento kód vám vrátí seznam všech dostupných senzorů na zařízení, a vy můžete zjistit, které z nich vaše aplikace může použít pro různé funkce, jako je detekce pohybu, změna orientace zařízení, nebo zjišťování světelných podmínek.

Pokud vaše aplikace vyžaduje konkrétní senzor (například kompas), nezapomeňte ho specifikovat v Android manifestu, jinak se aplikace nebude moci spustit na zařízeních, které tento senzor nemají:

xml
<uses-feature android:name="android.hardware.sensor.compass" android:required="true" />

Pokud není senzor pro vaši aplikaci nezbytný, můžete místo toho použít android:required="false", což znamená, že aplikace bude fungovat i na zařízeních, která tento senzor nemají.

Endtext

Jak vytvořit efekt otočení karty v Android aplikaci

Pro vytvoření efektu otočení karty v aplikaci pro Android je třeba připravit několik základních kroků a strukturu projektu. Tento efekt, jak jeho název naznačuje, simuluje otočení karty, kdy se na chvíli zobrazí její zadní strana. Celý proces zahrnuje přípravu obrázků pro přední a zadní stranu karty, definování animací a práci s fragmenty. Zde je podrobný návod, jak tento efekt implementovat.

Prvním krokem je připravení obrázků pro přední a zadní stranu karty. Tyto obrázky je potřeba zkopírovat do složky res/drawable a pojmenovat je například jako card_front.jpg a card_back.jpg. Pokud jsou soubory obrázků v jiném formátu, je nutné zachovat původní příponu.

Dále je třeba vytvořit složku pro animace. V Android Studiu zvolte File | New | Android Resource Directory a jako typ zdroje vyberte „animator“. Tato složka bude obsahovat všechny animace pro efekt otočení karty.

Pro animaci otočení karty je potřeba vytvořit čtyři různé soubory XML ve složce res/animator. Tyto soubory definují jednotlivé kroky animace pro vstup a výstup karty při otočení na obě strany. Vytvoříme následující soubory:

  1. card_flip_left_enter.xml pro vstup karty zleva.

  2. card_flip_left_exit.xml pro výstup karty zleva.

  3. card_flip_right_enter.xml pro vstup karty zprava.

  4. card_flip_right_exit.xml pro výstup karty zprava.

Poté přidáme soubor timing.xml do složky res/values, který bude definovat časové parametry pro animace, například dobu trvání animace a její zpoždění.

Následuje vytvoření dvou layoutů pro přední a zadní stranu karty v res/layout. Soubor fragment_card_front.xml bude reprezentovat přední stranu karty a soubor fragment_card_back.xml bude reprezentovat zadní stranu. Tyto layouty obsahují potřebné obrázky a strukturu pro každou stranu karty.

Nyní přichází na řadu vytvoření dvou Java tříd pro jednotlivé fragmenty karty: CardFrontFragment a CardBackFragment. Každý fragment jednoduše nafoukne příslušný layout pro přední nebo zadní stranu karty.

Po vytvoření fragmentů je potřeba upravit soubor activity_main.xml, který bude obsahovat FrameLayout pro zobrazení karty. Když uživatel klikne na kartu, spustí se animace jejího otočení.

V aktivitu MainActivity.java přidáme deklaraci pro sledování stavu, zda je zobrazená přední, nebo zadní strana karty. Také přidáme metodu pro obsluhu kliknutí na kartu, která zavolá metodu flipCard(). Tato metoda se stará o přepnutí mezi zobrazením přední a zadní strany karty s animací.

Animace samotná je realizována pomocí metody setCustomAnimations(), která přebírá čtyři animační soubory pro přechod mezi přední a zadní stranou karty. Všechny animace byly definovány v XML souborech ve složce animator. Když je karta kliknuta, zavolá se metoda flipCard(), která provede přechod mezi fragmenty karty a otočí ji, přičemž používá definované animace pro vstup a výstup.

Je důležité si uvědomit, že pro tento efekt není použit FragmentManager z knihovny Support Library, protože ten nepodporuje ObjectAnimator, který je potřebný pro tento typ animace. Pokud chcete zajistit kompatibilitu s verzemi Androidu staršími než 3.0, budete muset zahrnout starší animační soubory a provést kontrolu verze operačního systému za běhu aplikace, nebo vytvořit animační zdroje v kódu.

Tento efekt otočení karty je poměrně jednoduchý na implementaci a poskytuje vizuálně atraktivní způsob interakce s uživatelem. Pomocí tohoto efektu můžete v aplikaci přidat interaktivní prvky, které zaujmou uživatele a zvýší celkový dojem z aplikace.

Důležité je také nezapomenout na optimalizaci animací pro různé zařízení a verze Androidu, aby aplikace fungovala plynule na co největším počtu zařízení.