Slajd 1/55
Przykłady aplikacji - wprowadzenie
Cel slajdu: zapowiedź trzeciej prezentacji cyklu - zestawu opisanych przykładów aplikacji.

Strona tytułowa

Tytuł: Przykłady aplikacji w App Inventor - od powitania do quizu i stopera.

Przykłady aplikacji – Laboratorium praktyczne 8 Projektów AI2 👋 🧮 🎨 🎲 Praktyczne wzorce projektowe • Od prostych zdarzeń po bazy danych i zegary • Kompletna implementacja: UI + logika blokowa Osiem gotowych aplikacji • Powitanie, Kalkulator, Paleta kolorów, Mowa • Kostka do gry, Tabliczka mnożenia, Quiz, Stoper Metodyka laboratoryjna • Specyfikacja -> Designer -> Blocks -> Testy na żywo • Samodzielna rozbudowa o nowe funkcjonalności
Slajd 2/55
Spis treści prezentacji 3
Spis treści – Osiem aplikacji laboratoryjnych 1. Powitanie (Hello World) Podstawowa reakcja na kliknięcie i blok join 2. Prosty kalkulator 4 działania, walidacja i dzielenie przez zero 3. Zmiana kolorów ekranu ListPicker, przyciski oraz losowanie barw 4. Mówiący telefon Syntezator TextToSpeech i ustawienia języka 5. Rzut kostką do gry Losowanie liczb, zmiana grafiki i licznik rzutów 6. Trener tabliczki mnożenia Generowanie pytań, weryfikacja i punktacja 7. Interaktywny Quiz Pytania w listach, indeksowanie i ekran podsumowania 8. Zegar i stoper cyfrowy Zdarzenie Timer, odliczanie i formatowanie czasu Każdy przykład omawiany jest według jednolitego schematu inżynierskiego
Slajd 3/55
Cele uczenia się prezentacji 3

Co student będzie umiał

  • W1: odtworzyć osiem przykładowych aplikacji w App Inventor.
  • W2: dobrać komponenty do celu aplikacji.
  • W3: połączyć zdarzenia, warunki i zmienne w działający program.
  • W4: zastosować generator liczb losowych, zegar i syntezator mowy.
  • K1: zmodyfikować przykład o własny pomysł i uzasadnić zmiany.
Po tej prezentacji student dysponuje biblioteką ośmiu wzorców, które może łączyć w większe aplikacje.
Efekty kształcenia – Cele modułu przykładów Praktyka AI2 W1: Samodzielna implementacja 8 aplikacji Odtworzenie projektów od czystego ekranu do działającego APK W2: Precyzyjny dobór komponentów Umiejętność wyboru odpowiednich kontenerów UI, audio i sensorów W3: Integracja zdarzeń, warunków i zmiennych Tworzenie spójnej logiki algorytmicznej bez błędów wykonania W4: Walidacja danych i obsługa sytuacji brzegowych Zabezpieczenie przed dzieleniem przez zero i pustymi polami W5: Inżynierska metoda rozwijania kodu Dodawanie własnych rozszerzeń, formatowanie i optymalizacja
Slajd 4/55
Schemat pracy nad przykładem

Podobna struktura pracy nad przykładem

  1. Cel aplikacji - co użytkownik ma móc zrobić?
  2. Komponenty - jakie elementy są potrzebne?
  3. Interfejs - jak zbudować ekran w Designerze?
  4. Logika bloków - co i kiedy ma się dziać?
  5. Testowanie - na telefonie lub emulatorze.
  6. Rozszerzenia - jak można rozwinąć przykład?
Podobny schemat pomaga utrzymać porządek i skupić się na treści, nie na formie.
Sześciostopniowy cykl wytwarzania aplikacji 1. Cel aplikacji • Wymagania usera • Scenariusz użycia 2. Komponenty • Wybór z Palette • Nazewnictwo obiektów 3. Interfejs (UI) • Układ w Viewer • Ustawienie Properties 4. Logika (Blocks) • Spięcie zdarzeń • Zmienne i procedury 5. Testy na żywo • AI Companion • Weryfikacja działania 6. Rozbudowa • Dodatkowe opcje • Refaktoryzacja kodu
Slajd 5/55
Przykład 1: Powitanie - cel

Aplikacja "Powitanie" (Hello World)

  • Cel: pokazanie podstawowej interakcji - użytkownik klika przycisk, aplikacja wyświetla tekst.
  • Poziom: najłatwiejszy, pierwszy kontakt z AI2.
  • Komponenty: Screen1, Button1, Label1.
  • Nowe pojęcia: zdarzenie Click, właściwość Text, metoda.
  • Efekt: po kliknięciu pojawia się napis powitalny.
Przykład 1: Aplikacja Powitanie – Karta projektu Specyfikacja: Powitanie Cel dydaktyczny: Pierwszy kontakt ze środowiskiem AI2. Przetestowanie relacji Zdarzenie -> Reakcja. Wymagane komponenty: • Button1 (przycisk wyzwalający akcję) • Label1 (etykieta na komunikat) Oczekiwane zachowanie: Po dotknięciu przycisku na ekranie pojawia się napis: "Witaj w App Inventor!" Podgląd aplikacji Powitanie [Tekst pojawi się tutaj]
Slajd 6/55
Powitanie - budowa interfejsu

Praca w oknie Designer

  1. Dodajemy komponent Button (sekcja User Interface).
  2. Ustawiamy jego właściwość Text na "Powitanie".
  3. Dodajemy komponent Label i ustawiamy Text na pusty.
  4. Możemy zwiększyć FontSize etykiety dla czytelności.
  5. Ustawiamy nazwy komponentów pozostawione domyślnie (Button1, Label1).
Nazwy komponentów są domyślne, aby nie komplikować przykładu - w większych projektach nadajemy opisowe nazwy.
Powitanie – Projekt ekranu w oknie Designer Palette Button Label Przeciągnij do Viewer Viewer Powitanie Label1 (pusty) Components ▼ Screen1 • Button1 • Label1 Properties Button1: Text="Powitanie" FontSize=18 Label1: Text="" FontSize=20
Slajd 7/55
Powitanie - logika bloków

Program w oknie Blocks

  • Z listy Button1 dodajemy blok when Button1.Click.
  • Z listy Label1 dodajemy blok set Label1.Text to.
  • Do wartości wpisujemy tekst "Witaj w App Inventor!".
  • Blok set wpinamy w zdarzenie Click.
  • Gotowe - aplikacja reaguje na jedno kliknięcie.
Kod słownie: KIEDY kliknięto Button1, USTAW Label1.Text na "Witaj w App Inventor!".
Powitanie – Konstrukcja bloków w oknie Blocks when Button1 .Click do set Label1 .Text to "Witaj w App Inventor!" Przepływ sterowania (Control Flow): 1. Zdarzenie: kliknięcie Button1 wyzwala wykonanie zawartości. 2. Akcja: właściwość Text komponentu Label1 otrzymuje statyczny ciąg znaków.
Slajd 8/55
Powitanie - testowanie

Sprawdzenie działania

  • Łączymy się ze smartfonem (AI Companion) lub uruchamiamy emulator.
  • Klikamy Powitanie na telefonie.
  • Etykieta wyświetla napis powitalny.
  • Zmiany w blokach w trybie testowania na żywo zwykle aktualizują się na telefonie bez ręcznego przeładowywania aplikacji; niektóre zmiany mogą jednak wymagać ponownego uruchomienia lub połączenia.
  • Testuj po każdej zmianie - to zasada pracy z AI2.
Powitanie – Weryfikacja działania w AI Companion Stan 1: Przed kliknięciem Powitanie (pusta etykieta) 👆 Klik! Stan 2: Po kliknięciu Powitanie Witaj w App Inventor! Test natychmiast potwierdza poprawność spięcia klocków w czasie rzeczywistym.
Slajd 9/55
Powitanie - rozszerzenia

Jak wzbogacić prosty przykład

  • Dodać TextBox, aby użytkownik wpisał swoje imię.
  • Zbudować powitanie: "Witaj " + wpisane imię.
  • Dodać drugi przycisk, który czyści etykietę.
  • Zmienić kolor tła etykiety przy powitaniu.
  • Użyć Notifier do wyświetlenia komunikatu zamiast etykiety.
Łączenie tekstu: używamy bloku join z sekcji Text, aby skleić stały tekst ze zmienną.
Powitanie – Koncepcja rozszerzenia programu 1. Pole imienia Komponent TextBox: • Użytkownik wpisuje swoje imię z klawiatury • Dynamiczne czytanie TextBox1.Text 2. Łączenie tekstów Blok Text -> join: • Skleja stały napis "Witaj, " z imieniem • Wynik: spersonalizowane powitanie 3. Przycisk czyszczenia Drugi przycisk Reset: • Czyści pole etykiety oraz pole tekstowe • Resetuje stan ekranu do stanu początkowego Nawet najprostszy program można stopniowo przekształcić w funkcjonalne narzędzie.
Slajd 10/55
Powitanie z imieniem - blok join

Łączenie stałego tekstu z danymi użytkownika

  • Dodajemy komponent TextBox1 z podpowiedzią Hint "Podaj imię".
  • W zdarzeniu Click budujemy: set Label1.Text na join("Witaj ", TextBox1.Text).
  • Blok join z sekcji Text skleja dwa fragmenty w jeden napis.
  • Odczytujemy zawartość pola blokiem get TextBox1.Text.
  • Efekt: "Witaj Anna".
Blok join to najczęstszy sposób budowania dynamicznych tekstów w aplikacjach.
Powitanie z imieniem – Użycie bloku join when ButtonPowitaj .Click do set Label1 .Text to join "Witaj, " TextBox1 .Text Ekran telefonu Anna Powitaj Witaj, Anna
Slajd 11/55
Powitanie - wnioski

Czego uczy pierwszy przykład

  • Schemat zdarzenie - akcja jest podstawą programowania mobilnego.
  • Właściwości komponentów można zmieniać z bloków.
  • Dane od użytkownika odczytujemy z pól tekstowych.
  • Teksty łączymy blokiem join.
  • Testowanie w czasie rzeczywistym przyspiesza naukę.
Podsumowanie i kluczowe zasady przykładu 1 1 Model Zdarzenie – Akcja (Event-Driven): Aplikacja nie działa w próżni – oczekuje na gest użytkownika (kliknięcie, wpisanie tekstu). 2 Interakcja z danymi użytkownika (I/O): Odczyt właściwości wejściowej (TextBox.Text) i dynamiczny zapis wyniku do wyjścia (Label.Text). 3 Manipulacja tekstem (Operatory): Blok join pozwala elastycznie sklejać stałe napisy z dynamicznymi zmiennymi i właściwościami.
Slajd 12/55
Przykład 2: Kalkulator - cel

Aplikacja "Kalkulator"

  • Cel: wykonać podstawowe działanie arytmetyczne na dwóch liczbach.
  • Poziom: łatwy.
  • Komponenty: dwa TextBox z NumbersOnly = true, Button, Label, opcjonalnie ListPicker.
  • Nowe pojęcia: zmienne, konwersja tekstu na liczbę, bloki matematyczne.
  • Efekt: aplikacja dodaje dwie liczby i pokazuje wynik.
Uwaga: pole tekstowe zwraca tekst, dlatego przed liczeniem trzeba upewnić się, że pole zawiera liczbę; AI2 w działaniach arytmetycznych rozpoznaje tekst przypominający liczbę, ale pusty tekst albo niedozwolone znaki powodują błąd wykonania, dlatego przed działaniem sprawdzamy, czy pole nie jest puste.
Przykład 2: Aplikacja Kalkulator – Specyfikacja Specyfikacja: Kalkulator Cel dydaktyczny: Wykonywanie operacji arytmetycznych, konwersja tekstu na liczby, walidacja. Komponenty ekranu: • TextBoxLiczba1, TextBoxLiczba2 • 4 przyciski działań: [ + ] [ - ] [ * ] [ / ] • LabelWynik (etykieta na rezultat) Wymagania brzegowe: • Zabezpieczenie przed dzieleniem przez zero Podgląd kalkulatora Liczba A: 12 Liczba B: 4 + - * / Wynik: 16
Slajd 13/55
Kalkulator - budowa interfejsu

Elementy ekranu

  • TextBox1 i TextBox2 ustawione jako NumbersOnly = true.
  • Button1 z tekstem "Dodaj".
  • Label1 na wynik, początkowy tekst "0".
  • Opcjonalnie Label z podpisami "Liczba 1" i "Liczba 2".
  • Układ pionowy (VerticalArrangement) porządkuje elementy.
Właściwość NumbersOnly: ogranicza klawiaturę do danych liczbowych; nie gwarantuje znaku minus ani separatora dziesiętnego (zależy od urządzenia) - ułatwia pracę, ale nie zastępuje walidacji danych.
Kalkulator – Struktura kontenerów i widok Designer Drzewo obiektów (Components) ▼ Screen1 (Główny) ├ txtLiczbaA (NumbersOnly: True) ├ txtLiczbaB (NumbersOnly: True) ├ ▼ HorizontalArrangement1 ├ btnPlus [ + ] ├ btnMinus [ - ] ├ btnRazy [ * ] └ btnDziel [ / ] └ lblWynik (FontSize: 24, Bold) Kluczowe właściwości (Properties) 1. Właściwość NumbersOnly: Zaznaczenie tej opcji otwiera na telefonie klawiaturę numeryczną. 2. Kontener Arrangement: Ustawienie Width = Fill parent oraz AlignHorizontal = Center. 3. Czytelne prefiksy nazw: txt (TextBox), btn (Button), lbl (Label) ułatwiają programowanie.
Slajd 14/55
Kalkulator - logika dodawania

Bloki kalkulatora

  • Zdarzenie: when Button1.Click.
  • Tworzymy zmienną wynik.
  • Obliczamy: wynik = liczba1 + liczba2.
  • Skorzystamy z bloków: get TextBox1.Text, get TextBox2.Text, blok dodawania (+).
  • Na końcu: set Label1.Text na wynik.
AI2 w działaniach arytmetycznych automatycznie konwertuje tekst przypominający liczbę, ale prawdziwym zagrożeniem jest puste pole lub niedozwolone znaki - dlatego przed działaniem sprawdzamy, czy pole nie jest puste.
Kalkulator – Obsługa operacji dodawania when btnPlus .Click do set lblWynik .Text to txtA.Text + txtB.Text Niejawna konwersja typów (Type Coercion): Mimo że właściwość Text przechowuje napis, blok matematyczny [+] automatycznie konwertuje ciąg cyfr na wartość liczbową i wykonuje sumowanie arytmetyczne.
Slajd 15/55
Kalkulator - obsługa błędów wejścia

Co, gdy użytkownik nic nie wpisze

  • Puste pole nie jest liczbą; w działaniach matematycznych zwykle powoduje błąd. Przed działaniem sprawdzamy, czy pole nie jest puste.
  • Warto sprawdzić warunkiem, czy pole nie jest puste: if TextBox1.Text = "".
  • Gdy puste - wyświetlamy komunikat przez Notifier.ShowAlert.
  • Dzięki temu unikniemy typowego błędu wykonania.
  • Nazywamy to walidacją danych wejściowych.
Przykład: if TextBox1.Text = "" then call Notifier1.ShowAlert("Wpisz pierwszą liczbę").
Kalkulator – Walidacja poprawności danych wejściowych Warunek sprawdzający wejście if is empty? txtA or is empty? txtB call Notifier.ShowAlert "Podaj liczby!" else set lblWynik.Text to txtA + txtB Obsługa pustego pola Problem bez walidacji: Kliknięcie [+] przy pustym polu powoduje błąd: The operation + cannot accept arguments: [] Zalecana ochrona: • Blok Text -> is empty? • Blok Math -> is a number? Aplikacja odporna na błędy usera!
Slajd 16/55
Kalkulator - wybór działania

Dodawanie, odejmowanie, mnożenie, dzielenie

  • Dodajemy komponent ListPicker z opcjami: dodaj, odejmij, pomnóż, podziel.
  • ListPicker ustawiamy właściwość Elements na listę działań.
  • W zdarzeniu po wyborze zapamiętujemy wybór w zmiennej.
  • Przy obliczeniu sprawdzamy warunkami, które działanie wybrano.
  • Dla każdego przypadku stosujemy odpowiedni blok matematyczny.
To pierwszy przykład zastosowania listy wyboru i wielokrotnego warunku if/else.
Kalkulator – Cztery podstawowe operacje arytmetyczne Dodawanie (btnPlus): set lblWynik.Text to txtA.Text + txtB.Text Odejmowanie (btnMinus): set lblWynik.Text to txtA.Text - txtB.Text Mnożenie (btnRazy): set lblWynik.Text to txtA.Text * txtB.Text Dzielenie (btnDziel): set lblWynik.Text to txtA.Text / txtB.Text Dwa podejścia implementacyjne: A. Cztery odrębne zdarzenia .Click dla każdego przycisku (proste i czytelne). B. Wspólna procedura wykonajDzialanie(znak) redukująca duplikację kodu walidacji. Oba warianty uczą porządkowania logiki algorytmicznej.
Slajd 17/55
Kalkulator - dzielenie przez zero

Szczególny przypadek

  • Dzielenie przez zero nie ma wyniku w matematyce.
  • Przed dzieleniem sprawdzamy, czy pole nie jest puste i czy zawiera liczbę równą zero; dopiero potem wykonujemy dzielenie.
  • Jeśli tak - pokazujemy komunikat o błędzie.
  • W przeciwnym razie wykonujemy dzielenie.
  • To przykład myślenia o przypadkach brzegowych.
Kalkulator – Zabezpieczenie przed dzieleniem przez zero if txtB.Text = 0 then set lblWynik.Text to "Nie dziel przez zero!" else set lblWynik.Text to txtA.Text / txtB.Text Reguła arytmetyczna Dzielenie A / 0: • Działanie niewykonalne w ciele liczb rzeczywistych Zachowanie AI2: • Bez warunku: wynik Infinity • Z warunkiem: czytelny komunikat Dobre oprogramowanie zawsze chroni użytkownika przed operacjami niedozwolonymi.
Slajd 18/55
Kalkulator - rozszerzenia i wnioski

Jak rozwinąć kalkulator

  • Dodać przycisk czyszczenia pól i wyniku.
  • Dodać obsługę liczb ujemnych i dziesiętnych.
  • Dodać historię obliczeń w TinyDB.
  • Dodać funkcje: pierwiastek, potęga, procent.
  • Zbudować klawiaturę z przycisków zamiast pól tekstowych.
Wnioski: zmienne przechowują dane, a warunki pozwalają aplikacji reagować na różne sytuacje.
Kalkulator – Kierunki rozwoju i wnioski 1. Przycisk C (Reset) • Czyszczenie obu pól tekstowych txtA i txtB • Zerowanie etykiety wyniku na "0" Szybki powrót do startu 2. Nowe funkcje • Potęgowanie: a ^ b • Pierwiastek: sqrt(a) • Reszta z dzielenia: modulo (a % b) Z sekcji Math 3. Formatowanie • Zaokrąglanie wyniku format as decimal • Do 2 miejsc po przecinku Czytelny interfejs Kluczowy wniosek: Aplikacje obliczeniowe wymagają rygorystycznej kontroli typów, sprawdzania warunków brzegowych oraz przejrzystego rozmieszczenia kontenerów Arrangement.
Slajd 19/55
Przykład 3: Zmiana kolorów - cel

Aplikacja "Zmiana kolorów ekranu"

  • Cel: zmieniać kolor tła ekranu lub etykiety po kliknięciu.
  • Poziom: łatwy.
  • Komponenty: Screen1 (tło ekranu) lub Label1, kilka przycisków, opcjonalnie ListPicker.
  • Nowe pojęcia: właściwości kolorów, listy kolorów, losowość.
  • Efekt: każdy przycisk ustawia inny kolor tła.
Przykład 3: Zmiana kolorów ekranu – Cel projektu Specyfikacja: Zmiana Kolorów Cel dydaktyczny: Sterowanie właściwościami wizualnymi głównego kontenera aplikacji (Screen1). Kluczowe zagadnienia: • Właściwość BackgroundColor • Paleta barw Colors w Blocks • Komponent ListPicker (lista wyboru) Rozszerzenie: Generowanie losowego koloru z funkcji make color (RGB). Wizualizacja ekranu Aktywne tło: Czerwone Czerwony Zielony Niebieski
Slajd 20/55
Zmiana kolorów - interfejs

Przyciski kolorów

  • Dodajemy trzy przyciski: Czerwony, Zielony, Niebieski.
  • Każdy przycisk ma inny BackgroundColor (wizualna podpowiedź).
  • Dodajemy etykietę informującą o aktualnym kolorze.
  • Ustawiamy Screen1.AlignHorizontal na Center.
  • Estetyka: kolory przycisków zgodne z ich nazwami.
Zmiana kolorów – Kompozycja przycisków w Designerze Struktura kontenerów Screen1 └ ▼ HorizontalArrangement1 ├ btnCzerwony ├ btnZielony └ btnNiebieski Właściwości Arrangement: • Width = Fill parent (100% szerokości) • AlignHorizontal = Center Właściwości przycisków Czerwony (BackgroundColor: Red) Zielony (BackgroundColor: Green) Niebieski (BackgroundColor: Blue)
Slajd 21/55
Zmiana kolorów - logika bloków

Ustawianie koloru z bloków

  • Dla każdego przycisku dodajemy jego zdarzenie Click.
  • W zdarzeniu: set Screen1.BackgroundColor to wybrany kolor.
  • Kolory wybieramy z sekcji Colors lub z listy kolorów.
  • Możemy też zmieniać BackgroundColor etykiety.
  • Jedna metoda, trzy różne efekty - w zależności od przycisku.
Kod słownie: KIEDY kliknięto ButtonCzerwony, USTAW Screen1.BackgroundColor na Red.
Zmiana kolorów – Sterowanie tłem z poziomu bloków when btnCzerwony.Click set Screen1.BackgroundColor to Red when btnZielony.Click set Screen1.BackgroundColor to Green when btnNiebieski.Click set Screen1.BackgroundColor to Blue Klocki kolorów z wbudowanej palety Colors pozwalają natychmiast modyfikować styl interfejsu.
Slajd 22/55
Zmiana kolorów - wariant z ListPicker

Wybór koloru z listy

  • Zamiast trzech przycisków używamy ListPicker z listą kolorów.
  • Elements ustawiamy na: red, green, blue, yellow.
  • Po wyborze (AfterPicking) odczytujemy wybór blokiem get Selection.
  • BackgroundColor przyjmuje wartość liczbową koloru, więc nazwę z listy zamieniamy na kolor blokiem if then else.
  • Kod krótszy i łatwiejszy do rozbudowy.
ListPicker to elegancki sposób obsługi wielu opcji bez tworzenia wielu przycisków.
Zmiana kolorów – Zastosowanie komponentu ListPicker 1. Komponent ListPicker Właściwość w Designerze: ElementsFromString: "Czerwony, Zielony, Niebieski, Żółty" • Lista rozwijana na pełny ekran • Zastępuje wiele pojedynczych przycisków Oszczędność miejsca na ekranie! 2. Zdarzenie AfterPicking when ListPicker1.AfterPicking if Selection = "Czerwony" set BackgroundColor to Red else if Selection = "Zielony" set BackgroundColor to Green
Slajd 23/55
Zmiana kolorów - losowy kolor

Kolor losowany przy każdym kliknięciu

  • Używamy bloku random integer from 1 to N z sekcji Math.
  • Tworzymy listę dostępnych kolorów, np. 6 kolorów.
  • Losujemy liczbę od 1 do 6 i wybieramy kolor o tym numerze z listy.
  • Blok select list item pobiera element o danym numerze.
  • Efekt: po kliknięciu tło może mieć wybrany losowo kolor; wynik może się powtórzyć.
Zmiana kolorów – Losowanie barwy RGB (make color) when btnLosuj .Click do set BackgroundColor to make color [list] R: random 0 .. 255 G: random 0 .. 255 B: random 0 .. 255 Model barw RGB R (Czerwony) G (Zielony) B (Niebieski) 16.7 mln barw
Slajd 24/55
Zmiana kolorów - wnioski

Czego uczy ten przykład

  • Właściwości można zmieniać dynamicznie z bloków.
  • Listy pozwalają zgrupować wiele wartości.
  • Blok get Selection odczytuje wybór użytkownika.
  • Losowość wprowadza element zaskoczenia do aplikacji.
  • Ten wzorzec wykorzystamy później w grach.
Losowość i listy to często wykorzystywane mechanizmy w grach i quizach.
Zmiana kolorów – Podsumowanie i wnioski 1 Dynamiczna modyfikacja stylów: Wszystkie cechy wizualne ekranu i kontenerów można płynnie modyfikować w czasie działania aplikacji. 2 Ergonomia ListPicker: Zastąpienie kilkunastu przycisków jednym elementem wyboru listy znacząco porządkuje ekran mobilny. 3 Synteza barw z liczb losowych: Użycie make color uczy studentów reprezentacji barw w standardzie addytywnym RGB (0–255).
Slajd 25/55
Przykład 4: Syntezator mowy - cel

Aplikacja "Mówiący telefon"

  • Cel: aplikacja wypowiada wpisany lub zadany tekst.
  • Poziom: łatwy - średni.
  • Komponenty: TextBox, Button, TextToSpeech.
  • Nowe pojęcia: komponenty Media, metoda Speak, właściwości syntezatora.
  • Efekt: telefon czyta na głos wprowadzony tekst.
Z pam3.pdf: w niektórych emulatorach syntezator mowy bywa ograniczony i może nie obsługiwać polskiego; najlepszy test to prawdziwy telefon z odpowiednim głosem.
Przykład 4: Mówiący telefon – Specyfikacja Specyfikacja: Syntezator Mowy Cel dydaktyczny: Integracja z multimedialnym silnikiem systemowym syntezy mowy (TTS). Wymagane komponenty: • TextBox (pole wpisania tekstu) • Button (przycisk "Powiedz to!") • TextToSpeech (komponent niewidoczny) Działanie sprzętowe: Generowanie głosu lektora przez głośnik. Podgląd w telefonie Dzień dobry, witam na wykładzie! 🔊 Powiedz to! Emisja dźwięku przez głośnik
Slajd 26/55
Syntezator mowy - interfejs

Komponenty i ich ustawienia

  • TextBox1 - pole na tekst do wypowiedzenia, Hint "Wpisz tekst".
  • Button1 - tekst "Powiedz".
  • TextToSpeech1 - komponent Media, niewidoczny na ekranie.
  • Ustawiamy TextToSpeech1.Country = "POL", Language = "pol" (dla polskiego, jeśli urządzenie obsługuje ten wariant).
  • Zwiększamy TextBox1.FontSize dla wygody.
Syntezator mowy – Projekt ekranu w Designerze Komponenty w Designerze 1. Komponenty widoczne (UI): • txtWiadomosc (MultiLine: True) • btnMow (Text: "Przeczytaj tekst") 2. Komponent niewidoczny: • TextToSpeech1 (z sekcji Media) • Umieszczany pod ekranem telefonu Non-visible components reprezentują usługi sprzętowe systemu Android. Właściwości TextToSpeech1 Country (Kraj): POL (Polska) Language (Język): pol (Język polski) Pitch (Ton głosu): 1.0 SpeechRate (Szybkość mowy): 1.0
Slajd 27/55
Syntezator mowy - logika bloków

Wywołanie metody Speak

  • Zdarzenie: when Button1.Click.
  • Wywołujemy metodę: call TextToSpeech1.Speak.
  • Argumentem jest get TextBox1.Text.
  • Przed wypowiedzeniem można ustawić język i tempo.
  • Aplikacja odczyta wpisany tekst na głos.
Kod słownie: KIEDY kliknięto Button1, WYWOŁAJ TextToSpeech1.Speak z get TextBox1.Text.
Syntezator mowy – Wywołanie metody Speak w Blocks when btnMow .Click do call TextToSpeech1 .Speak message: txtWiadomosc .Text Mechanizm działania: Aplikacja przekazuje tekst do wbudowanego w systemie Android modułu Google TTS, który syntezuje mowę bez konieczności pobierania zewnętrznych bibliotek dźwiękowych.
Slajd 28/55
Syntezator mowy - ustawienia języka

Właściwości i metody TextToSpeech

  • Language - kod języka wymowy (np. pol, eng).
  • Country - kod kraju lub wariantu językowego (np. POL).
  • Pitch - wysokość głosu (zakres 0-2, domyślnie 1).
  • SpeechRate - tempo wypowiedzi (zakres 0-2, domyślnie 1).
  • Metoda Speak wykonuje wypowiedź, metoda Stop przerywa.
Ustawienia języka można zmieniać w Designerze lub dynamicznie blokami - np. po wyborze z listy.
Syntezator mowy – Konfiguracja językowa i dialekty Język docelowy Kod Language (ISO 639-1) Kod Country (ISO 3166) Język polski "pol" / "pl" "POL" / "PL" Angielski (USA) "eng" / "en" "USA" / "US" Niemiecki "deu" / "de" "DEU" / "DE" Wymóg zainstalowanych danych głosu: Jeśli w telefonie brak pakietu polskiego głosu, system użyje domyślnego lektora angielskiego.
Slajd 29/55
Syntezator mowy - rozszerzenia i wnioski

Jak rozwinąć aplikację

  • Wybór języka i wariantu regionalnego przez ListPicker.
  • Odczyt losowych słów - połączenie z losowaniem.
  • Nauka języka: aplikacja wypowiada słówka do powtórzenia.
  • Połączenie z rozpoznawaniem mowy (SpeechRecognizer).
  • Wnioski: komponenty Media wzbogacają aplikacje o dźwięk i mowę.
Syntezator mowy – Rozszerzenia i zastosowania praktyczne 1. Regulacja suwakami • Komponent Slider • Zmiana wysokości (Pitch) od 0.5 (bas) do 2.0 (pisk) • Zmiana tempa mowy Personalizacja głosu 2. Rozmówki językowe • Gotowe przyciski: "Dziękuję", "Pomoc" • Przełączanie języków z polskiego na angielski Aplikacja turystyczna 3. Dostępność (a11y) • Pomoc dla osób niedowidzących • Czytanie na głos komunikatów i wyników Standardy WCAG Wniosek: Synteza mowy to potężne narzędzie podnoszące dostępność (Accessibility) i interaktywność aplikacji mobilnych.
Slajd 30/55
Przykład 5: Rzut kostką - cel

Aplikacja "Rzut kostką"

  • Cel: symulować rzut sześcienną kostką (liczby 1-6).
  • Poziom: łatwy - średni.
  • Komponenty: Button, Label lub Image; losowość zapewnia blok random integer z sekcji Math.
  • Nowe pojęcia: generator liczb losowych, obrazy dla wyników.
  • Efekt: po kliknięciu pokazuje się losowy wynik od 1 do 6.
To pierwsza aplikacja z prawdziwą losowością - podstawa wielu gier i quizów.
Przykład 5: Rzut kostką – Specyfikacja projektu Specyfikacja: Rzut Kostką Cel dydaktyczny: Generowanie liczb pseudolosowych, dynamiczna zmiana zasobów graficznych. Wymagane komponenty: • Image (wyświetla ściankę kostki) • Button ("Rzuć kostką!") • LabelWynik, LabelLicznik Zasoby graficzne: 6 plików: kosc_1.png do kosc_6.png w Media. Wizualizacja kostki Rzuć kostką! Wyrzucono: 5 oczek
Slajd 31/55
Rzut kostką - interfejs

Elementy ekranu

  • Button1 - tekst "Rzuć kostką".
  • Label1 - na wynik liczbowy.
  • Opcjonalnie Image1 - pokazuje obrazek kostki dla wyniku.
  • Do Media wgrywamy 6 obrazków: kostka1.jpg ... kostka6.jpg.
  • Układ: kostka u góry, przycisk na dole.
Rzut kostką – Projekt ekranu i zarządzanie zasobami Elementy w oknie Designer Hierarchia obiektów: ▼ Screen1 (AlignHorizontal: Center) ├ imgKosc (Width: 150px, Height: 150px) ├ btnRzut (Text: "Rzuć kostką!") ├ lblWynik (Text: "Wyrzucono: -") └ lblLicznik (Liczba rzutów: 0) Środkowanie elementów nadaje aplikacji profesjonalny wygląd. Zasoby w sekcji Media Pliki graficzne ścianek: 🎲 kosc_1.png (1 oczko) 🎲 kosc_2.png (2 oczka) 🎲 kosc_3.png (3 oczka) 🎲 kosc_4.png (4 oczka) 🎲 kosc_5.png (5 oczek) 🎲 kosc_6.png (6 oczek) Spójny schemat nazewnictwa kosc_X.png!
Slajd 32/55
Rzut kostką - logika losowania

Blok random integer

  • Zdarzenie: when Button1.Click.
  • Losujemy: random integer from 1 to 6.
  • Wynik zapisujemy w zmiennej wynik (set wynik to ...).
  • Ustawiamy Label1.Text na wynik.
  • Możemy też ustawić Image1.Picture na obrazek kostka{wynik}.jpg.
Kod: set wynik to random integer from 1 to 6; set Label1.Text to get wynik.
Rzut kostką – Losowanie liczby z zakresu 1 do 6 initialize global wynik to 1 when btnRzut .Click do set global wynik to random integer from 1 to 6 Funkcja losująca Rozkład: Dyskretny jednostajny P(X = k) = 1/6 Granice: Obustronnie domknięte: od 1 do 6 włącznie
Slajd 33/55
Rzut kostką - obrazek wyniku

Dobór obrazka do wyniku

  • Potrzebujemy listy nazw obrazków lub bloku join.
  • Najprościej: join("kostka", wynik, ".jpg") daje kostka3.jpg.
  • Ustawiamy: set Image1.Picture to wynikowy napis.
  • Obrazki muszą być wcześniej wgrane w sekcji Media.
  • Efekt: widzimy obrazek odpowiadający wylosowanej liczbie.
Uwaga: nazwy plików bez polskich znaków i spacji - to warunek poprawnego działania.
Rzut kostką – Dynamiczne przypisanie grafiki Elegancka metoda bez 6 warunków if: set imgKosc .Picture to join: "kosc_" + get wynik + ".png" Metoda naiwna (Nieoptymalna): • Sześć zagnieżdżonych warunków: if wynik = 1 then Picture = "kosc_1.png" else if wynik = 2... • Kod jest długi, podatny na literówki i trudny w modyfikacji. Metoda ze sklejaniem nazw (join) redukuje cały algorytm do 1 pojedynczego bloku!
Slajd 34/55
Rzut kostką - licznik rzutów

Dodajemy zliczanie

  • Tworzymy zmienną globalną liczbaRzutow = 0.
  • W zdarzeniu Click zwiększamy: set liczbaRzutow to liczbaRzutow + 1.
  • Wyświetlamy liczbę rzutów w osobnej etykiecie.
  • To powtórzenie wzorca akumulacji z prezentacji 2.
  • Można dodać sumę oczek i średnią.
Rzut kostką – Zliczanie wykonanych rzutów Inkrementacja licznika rzutów set global rzuty to rzuty + 1 set lblLicznik.Text to join("Rzuty: ", rzuty) Zastosowania zliczania: • Monitorowanie aktywności użytkownika w trakcie sesji gry • Możliwość obliczenia średniej wartości wyrzuconych oczek (suma / rzuty) Wzorzec inkrementacji zmiennej (x = x + 1) to fundament gier komputerowych.
Slajd 35/55
Rzut kostką - wnioski

Czego uczy przykład

  • Generator liczb losowych to podstawa gier.
  • Wynik losowania łączymy z obrazkami.
  • Zmienne pozwalają prowadzić statystyki.
  • Blok join buduje dynamiczne nazwy i teksty.
  • Ten wzorzec wykorzystamy w quizie i grach.
Rzut kostką to miniatura każdej gry losowej - od loterii po rzuty w grach RPG.
Rzut kostką – Wnioski i podsumowanie projektu 1 Generatory pseudolosowe (PRNG): Blok random integer pozwala na symulację losowych zjawisk fizycznych i gier planszowych. 2 Wzorzec konstrukcji nazw zasobów: Sklejanie nazwy pliku join("plik_", nr, ".png") eliminuje potrzebę pisania wielu warunków if. 3 Zarządzanie stanem (State Management): Zmienne globalne przechowują historię i licznik sesji niezależnie od odświeżania ekranu.
Slajd 36/55
Przykład 6: Tabliczka mnożenia - cel

Aplikacja "Tabliczka mnożenia"

  • Cel: trenować tabliczkę mnożenia i sprawdzać odpowiedzi.
  • Poziom: średni.
  • Komponenty: Labels, TextBox, Button, Notifier, zmienne.
  • Nowe pojęcia: losowanie zadania, porównanie, punktacja.
  • Efekt: aplikacja zadaje pytanie i ocenia odpowiedź.
To zapowiedź prezentacji 4, w której rozbudujemy ten pomysł w pełny program.
Przykład 6: Trener tabliczki mnożenia – Specyfikacja Specyfikacja: Trener Mnożenia Cel dydaktyczny: Aplikacja edukacyjna z procedurami, weryfikacją i elementami grywalizacji. Kluczowe mechaniki: • Losowanie pytania A × B (1–10) • Sprawdzanie odpowiedzi usera • Zliczanie punktów i serii (Streak) Informacja zwrotna (Feedback): Kolor zielony dla sukcesu, czerwony dla błędu. Ekran treningu 7 × 8 = ? Wpisz: 56 Sprawdź odpowiedź Punkty: 12 | Seria: 🔥 4
Slajd 37/55
Tabliczka mnożenia - interfejs

Ekran treningu

  • Label_pytanie - pokazuje np. "7 x 8 = ?".
  • TextBox_odpowiedz - NumbersOnly = true.
  • Button_sprawdz - sprawdza odpowiedź.
  • Button_nastepne - losuje nowe pytanie.
  • Label_wynik - punkty i informacja zwrotna.
Tabliczka mnożenia – Projekt interfejsu w Designerze Komponenty ekranu Struktura UI: ▼ Screen1 (Center) • lblPytanie (FontSize: 28, Bold) • txtOdpowiedz (NumbersOnly) • btnSprawdz ("Sprawdź!") • lblKomunikat (Informacja) • lblPunkty ("Punkty: 0") • lblSeria ("Seria: 0") Dobre praktyki UX/UI 1. Czytelność pytania: Duży rozmiar czcionki (28 pt) zapewnia wygodne czytanie z odległości. 2. Klawiatura numeryczna: Włączenie NumbersOnly ułatwia wpisywanie cyfr bez liter. 3. Hierarchia komunikatów: Wyniki i statystyki na dole ekranu.
Slajd 38/55
Tabliczka mnożenia - losowanie pytania

Generowanie zadania

  • Zmienne globalne: a, b, iloczyn, punkty.
  • Losujemy a = random 1..10 oraz b = random 1..10.
  • Obliczamy iloczyn = a * b.
  • Budujemy pytanie blokiem join: a + " x " + b + " = ?".
  • Ustawiamy Label_pytanie na zbudowany tekst.
Przykład: dla a=7, b=8 pytanie brzmi "7 x 8 = ?", a iloczyn = 56.
Tabliczka mnożenia – Procedura losowania zadania Procedura: to nowePytanie do set global czynnikA to random(1, 10) set global czynnikB to random(1, 10) set global poprawnyWynik to czynnikA * czynnikB set lblPytanie.Text to join(czynnikA, " × ", czynnikB, " = ?") Dlaczego w procedurze? Procedura jest wywoływana zarówno przy starcie ekranu (Initialize), jak i po każdej odpowiedzi!
Slajd 39/55
Tabliczka mnożenia - sprawdzanie

Porównanie odpowiedzi

  • W zdarzeniu Button_sprawdz klik.
  • Warunek: if TextBox_odpowiedz.Text (tekst liczbowy) = iloczyn then ...
  • Gdy poprawnie: komunikat "Dobrze!", punkty + 1.
  • Gdy błędnie: komunikat "Spróbuj jeszcze raz" i podpowiedź.
  • Aktualizujemy etykietę z punktami.
AI2 w porównaniu zwykle rozpoznaje tekst przypominający liczbę jak liczbę; problem sprawiają puste pole albo niedozwolone znaki, dlatego przed porównaniem sprawdzamy pole blokiem is a number? (sekcja Math) oraz warunkiem pustego tekstu.
Tabliczka mnożenia – Weryfikacja odpowiedzi i punktacja if txtOdpowiedz.Text = poprawnyWynik then punkty = punkty + 1; seria = seria + 1 lblKomunikat.Text = "Brawo! Prawidłowo!" else seria = 0 (reset serii) lblKomunikat.Text = "Błąd! Prawidłowa to: " + poprawny Kolejny krok call nowePytanie set txtOdpowiedz.Text to "" • Czyszczenie pola edycji • Gotowość na kolejną odpowiedź ucznia
Slajd 40/55
Tabliczka mnożenia - punkty i seria

Rozbudowa o punktację i serię

  • Zmienna punkty rośnie przy poprawnej odpowiedzi.
  • Zmienna seria liczy kolejne poprawne odpowiedzi.
  • Błędna odpowiedź zeruje serię.
  • Po 10 punktach wyświetlamy gratulacje.
  • Wynik można zapisać w TinyDB i zapamiętać rekord.
Tabliczka mnożenia – Mechanizmy grywalizacji (Streak) Punkty ogólne (Score) Zasada działania: • Za każdą poprawną odpowiedź: +1 punkt • Wynik nie spada poniżej zera Funkcja psychologiczna: • Poczucie stałego postępu • Nagradzanie zaangażowania Seria poprawnych (Streak 🔥) Zasada działania: • Rośnie z każdą poprawną odpowiedzią z rzędu • Błąd natychmiast zeruje serię! Funkcja psychologiczna: • Utrzymanie maksymalnego skupienia i motywacji
Slajd 41/55
Tabliczka mnożenia - wnioski

Czego uczy przykład

  • Łączenie losowania z logiką sprawdzania.
  • Budowanie pytania z wielu elementów (join).
  • Warunki decydują o przebiegu programu.
  • Punktacja to praktyczne zastosowanie zmiennych.
  • Gotowy wzorzec pod quiz i gry edukacyjne.
Dokładne, krok po kroku rozbudowanie tego przykładu pokażemy w prezentacji 4.
Tabliczka mnożenia – Podsumowanie i architektura 1 Hermetyzacja logiki w procedurze: Wydzielenie losowania pytania do procedury to klasyczny przykład zasady pojedynczej odpowiedzialności. 2 Walidacja i natychmiastowy feedback: Komunikat o poprawności wraz ze zmianą barwy natychmiast informuje ucznia o popełnionym błędzie. 3 Rozbudowa o bazy trwałe: Projekt można w prosty sposób rozszerzyć o zapis rekordu do pamięci TinyDB (np. NajlepszaSeria).
Slajd 42/55
Przykład 7: Quiz - cel

Aplikacja "Quiz"

  • Cel: zadawać pytania z opcjami i liczyć punkty.
  • Poziom: średni.
  • Komponenty: Label, ListPicker lub przyciski, zmienne, TinyDB.
  • Nowe pojęcia: listy pytań i odpowiedzi, indeks pytania.
  • Efekt: aplikacja prowadzi użytkownika przez serię pytań.
Quiz to uniwersalny szkielet - może dotyczyć historii, biologii, języków itd.
Przykład 7: Interaktywny Quiz – Specyfikacja projektu Specyfikacja: Quiz Cel dydaktyczny: Wykorzystanie struktur listowych (Lists), indeksowania i sekwencyjnego sterowania. Baza pytań: • Pytania i odpowiedzi w listach • Zmienna indeksPytania (1, 2, ... N) Sterowanie: • Przycisk "Następne pytanie" • Ekran podsumowania po ostatnim zadaniu. Podgląd Quizu Pytanie 2 z 5: Stolica Polski to? Warszawa Zatwierdź odpowiedź
Slajd 43/55
Quiz - pytania w listach

Przechowywanie pytań i odpowiedzi

  • Tworzymy listę pytania z kolejnymi pytaniami.
  • Tworzymy listę odpowiedzi z poprawnymi odpowiedziami.
  • Numer pytania trzymamy w zmiennej indeks.
  • Pytanie pobieramy: select list item z listy pytania na pozycji indeks.
  • Poprawną odpowiedź porównujemy z odpowiedzią użytkownika.
Przykład: pytania[1] = "Stolica Polski?", odpowiedzi[1] = "Warszawa".
Quiz – Reprezentacja pytań i odpowiedzi w strukturach list Lista pytań: global pytania (make a list) Indeks [1]: "Stolica Polski?" Indeks [2]: "Najwyższy szczyt?" Indeks [3]: "Rok chrztu Polski?" Lista odpowiedzi: global odpowiedzi (make a list) Indeks [1]: "Warszawa" Indeks [2]: "Rysy" Indeks [3]: "966" Ważna cecha App Inventor: Listy są indeksowane od 1 (nie od 0 jak w C/Java)!
Slajd 44/55
Quiz - przebieg i sterowanie

Logika przechodzenia przez pytania

  • Po sprawdzeniu odpowiedzi zwiększamy indeks o 1.
  • Pobieramy kolejne pytanie i wyświetlamy je.
  • Warunek: jeśli indeks > długość listy, quiz się kończy.
  • Na końcu pokazujemy wynik (punkty / liczba pytań).
  • Przyciskiem można zrestartować quiz.
Quiz – Sekwencyjne sterowanie pytaniami when btnDalej .Click do set indeks to indeks + 1 if indeks > length of list pytania call pokazKoniecQuizu Sterowanie Granica: Gdy numer pytania przekroczy liczbę elementów w liście, Quiz się kończy! Zabezpieczenie przed błędem indeksu.
Slajd 45/55
Quiz - odpowiedzi i ocena

Sprawdzenie odpowiedzi użytkownika

  • Odpowiedź użytkownika pobieramy z pola lub ListPicker.
  • Porównujemy z poprawną odpowiedzią (uwaga na wielkość liter); zaleca się wcześniejsze normalizowanie obu tekstów, np. blokiem downcase.
  • Możemy użyć bloku compare texts lub porównania =.
  • Za poprawną odpowiedź punkty + 1 i komunikat.
  • Za błędną - informacja o prawidłowej odpowiedzi.
Warto normalizować wielkość liter (blok downcase z sekcji Text) przed porównaniem tekstów.
Quiz – Weryfikacja odpowiedzi i aktualizacja punktacji if txtOdp.Text = select list item (odpowiedzi, indeks) then punkty = punkty + 1 lblKomunikat.Text = "Poprawna odpowiedź!" else lblKomunikat.Text = "Błędna odpowiedź..." select list item Działanie klocka: • Pobiera element z listy pod wskazanym indeksem • Dynamicznie weryfikuje odpowiedź dla pytania [N] Zero duplikacji kodu!
Slajd 46/55
Quiz - ekran wyniku

Podsumowanie quizu

  • Osobny ekran lub etykieta z wynikiem końcowym.
  • Procent poprawnych odpowiedzi.
  • Komunikat słowny zależny od wyniku (0-100%).
  • Zapis najlepszego wyniku w TinyDB.
  • Przycisk powrotu do menu lub restartu.
Quiz – Podsumowanie punktacji i restart sesji Logika ekranu końcowego Procedura pokazKoniecQuizu: 1. Ukryj panel pytań (Visible: False) 2. Pokaż panel wyniku (Visible: True) 3. Wyświetl wynik: Punkty / Wszystkie Przycisk "Zagraj ponownie": • Zerowanie punktów (punkty = 0) • Reset indeksu (indeks = 1) • Przywrócenie widoku pytań Ekran końcowy 🏆 Gratulacje! Twój wynik: 4 / 5 Skuteczność: 80% Zagraj ponownie
Slajd 47/55
Quiz - wnioski

Czego uczy przykład

  • Listy pozwalają przechować treści quizu.
  • Indeks steruje przechodzeniem przez pytania.
  • Warunki oceniają odpowiedzi i decydują o zakończeniu.
  • TinyDB zapamiętuje wyniki między uruchomieniami.
  • Gotowy szkielet do samodzielnego quizu studenta.
Quiz łączy wszystkie dotychczasowe pojęcia: zmienne, listy, warunki, indeksowanie i dane trwałe.
Quiz – Podsumowanie i architektura struktur listowych 1 Separacja danych od logiki (Data-Driven): Dodanie 50 nowych pytań do listy nie wymaga modyfikacji ani jednego klocka w logice działania! 2 Przełączanie widoków w obrębie 1 ekranu: Ukrywanie i pokazywanie kontenerów (VerticalArrangement.Visible) zastępuje tworzenie wielu ekranów. 3 Bezpieczne indeksowanie list: Kontrola indeksu przed wywołaniem select list item chroni aplikację przed błędem IndexOutOfBounds.
Slajd 48/55
Przykład 8: Zegar i stoper - cel

Aplikacja "Zegar i stoper"

  • Cel: pokazywać aktualny czas oraz mierzyć upływ czasu.
  • Poziom: średni.
  • Komponenty: Clock, Label, przyciski Start/Stop.
  • Nowe pojęcia: zdarzenie Timer, czas w milisekundach.
  • Efekt: zegar odświeża się co sekundę, stoper odmierza czas.
Komponent Clock jest sercem animacji i wszelkich aplikacji czasowych.
Przykład 8: Zegar i Stoper cyfrowy – Specyfikacja Specyfikacja: Zegar i Stoper Dwa moduły funkcjonalne: 1. Zegar cyfrowy czasu rzeczywistego Format HH:MM:SS odświeżany co 1 s 2. Stoper laboratoryjny Start, Stop, Reset, pomiar sekund Komponenty: • Clock1 (Zegar), Clock2 (Stoper) • Przyciski: btnStart, btnStop, btnReset Podgląd w telefonie 14:35:08 00:42.5 Start Stop Reset
Slajd 49/55
Zegar - zdarzenie Timer

Odświeżanie czasu

  • Ustawiamy Clock1.TimerInterval na 1000 (ms).
  • W zdarzeniu when Clock1.Timer.
  • Odczytujemy godzinę, minutę i sekundę metodami Clock1.Hour, Clock1.Minute, Clock1.Second, przyjmującymi jako argument Clock1.Now.
  • Składamy je w napis np. "12:45:07" blokiem join.
  • Ustawiamy Label1.Text na ten napis.
Formatowanie: do wartości jednocyfrowych dokładamy zero z przodu - prosta obróbka tekstu.
Zegar – Odświeżanie czasu rzeczywistego (Timer) when ClockZegar .Timer do set lblCzas .Text to call ClockZegar .FormatTime (call Clock.Now) Metoda FormatTime oraz Now: • Clock.Now zwraca bieżący stempel czasu (Instant) z zegara systemowego telefonu. • FormatTime zamienia znacznik czasu na elegancki napis w lokalnej strefie czasowej.
Slajd 50/55
Stoper - pomiar upływu czasu

Liczenie sekund od startu

  • Zmienne: sekundy, dziala (flaga logiczna).
  • Start: ustawiamy sekundy = 0, dziala = true.
  • W zdarzeniu Timer: if dziala then sekundy = sekundy + 1.
  • Wyświetlamy sformatowany czas.
  • Stop: ustawiamy dziala = false.
Stoper – Logika sterowania Start, Stop, Reset btnStart .Click TimerEnabled = True • Włącza tykanie • Zegar odlicza sekundy Stoper rusza btnStop .Click TimerEnabled = False • Zatrzymuje zegar • Wynik zostaje na ekranie Pauza pomiaru btnReset .Click sekundy = 0 lblStoper.Text="00:00" • Wyzerowanie czasu Stan początkowy Sterowanie właściwością TimerEnabled: Włączanie (True) i wyłączanie (False) timera to najprostsza metoda zarządzania cyklami w AI2.
Slajd 51/55
Zegar i stoper - wnioski

Czego uczy przykład

  • Zdarzenia czasowe pozwalają na animację i pomiar czasu.
  • Flaga logiczna (prawda/fałsz) włącza i wyłącza działanie.
  • Formatowanie czasu to praktyczna obróbka tekstu.
  • Ten wzorzec wykorzystamy w grach (odliczanie, tempo).
Zegar to pomost do prezentacji 5, gdzie dodamy czujniki i gry.
Zegar i stoper – Podsumowanie i wnioski 1 Asynchroniczność czasu: Zdarzenie Timer wywoływane jest niezależnie od aktywności użytkownika, w równych odstępach czasu. 2 Formatowanie matematyczne: Przeliczanie całkowitej liczby sekund na minuty i sekundy (sekundy // 60 oraz sekundy % 60). 3 Zarządzanie zasobami baterii: Nieużywane timery należy zawsze wyłączać (TimerEnabled = False), aby oszczędzać energię urządzenia.
Slajd 52/55
Jak samodzielnie rozwijać przykłady

Metoda pracy studenta

  1. Wybierz przykład i odtwórz go wiernie.
  2. Zmień jeden parametr (kolor, tekst, liczby) i zaobserwuj efekt.
  3. Dodaj jedną nową funkcję.
  4. Połącz dwa przykłady w jedną aplikację.
  5. Zapisz projekt (.aia) i udokumentuj zmiany.
Najlepsza nauka to modyfikowanie działającego kodu, a nie pisanie od zera.
Metodyka samodzielnego rozwoju projektów Krok 1: Odtwórz wersję bazową • Zbuduj ekran zgodnie ze wzorem • Uruchom w AI Companion Upewnij się, że baza działa poprawnie Krok 2: Zrozum przepływ logiki • Prześledź zdarzenia i wartości • Sprawdź działanie warunków if Wyjaśnij cel każdego użytego bloku Krok 3: Dodaj 1 nową funkcję • Dźwięk, wibracja, reset, punktacja • Stosuj małe kroki przyrostowe Testuj natychmiast po dodaniu Krok 4: Zapisz nową wersję (.aia) • Menu Projects -> Save project as • Nadaj nazwę z numerem v2, v3 Eksportuj archiwum na dysk
Slajd 53/55
Podsumowanie prezentacji 3

Co zapamiętać

  • Powitanie uczy zdarzeń i właściwości.
  • Kalkulator uczy zmiennych, warunków i walidacji danych.
  • Kolory ćwiczą listy i losowość.
  • Syntezator mowy pokazuje komponenty Media.
  • Kostka i tabliczka mnożenia to wzorce losowania i punktacji.
  • Quiz łączy listy, warunki i dane trwałe.
  • Zegar wprowadza zdarzenia czasowe.
Mamy osiem działających wzorców - w prezentacji 4 zbudujemy z nich pełny program.
Podsumowanie – Panorama 8 aplikacji kursu 1. Interakcja z użytkownikiem • Powitanie (Hello World) & join • Odczyt wejścia i zmiana etykiet Fundament aplikacji mobilnych 2. Arytmetyka i walidacja • Kalkulator & Tabliczka mnożenia • Dzielenie przez zero, obsługa błędów Zabezpieczenie przed awarią 3. Multimedia i losowość • Zmiana kolorów RGB & TextToSpeech • Rzut kostką (random integer) Wykorzystanie możliwości sprzętu 4. Struktury i zdarzenia czasu • Quiz z bazą pytań w listach • Zegar i stoper (Clock.Timer) Kompletny zestaw narzędzi studenta
Slajd 54/55
Pytania kontrolne i zadania

Sprawdź się

  1. Jak odczytać tekst z pola TextBox i wyświetlić go w etykiecie?
  2. Jak wylosować liczbę z zakresu 1-6 i dlaczego dzielenie przez zero jest problemem?
  3. Do czego służy blok join? Podaj dwa zastosowania.
  4. Jak sprawdzić poprawność odpowiedzi w quizie?
  5. Jak działa zdarzenie Timer i do czego służy flaga logiczna?
  6. Zadanie: połącz kalkulator z rzutem kostką w jedno menu aplikacji.
Pytania kontrolne – Sprawdzenie wiedzy z przykładów 1 Do czego służy blok Text -> join? Odp: Do łączenia (sklejania) stałych napisów ze zmiennymi i wartościami pól. 2 W jaki sposób zabezpieczyć kalkulator przed dzieleniem przez zero? Odp: Warunkiem if mianownik = 0 wyświetlamy ostrzeżenie zamiast dzielić. 3 Od jakiej liczby indeksowane są listy w App Inventorze? Odp: Zawsze od 1 (pierwszy element ma index 1, drugi 2 itd.). 4 Jaką rolę pełni właściwość TimerInterval w komponencie Clock? Odp: Określa w milisekundach czas, co jaki wyzwalane jest zdarzenie when Timer.
Slajd 55/55
Zakończenie prezentacji 3

Dziękuję za uwagę

  • Poznaliśmy osiem gotowych aplikacji.
  • Każda z nich ćwiczyła inne pojęcia programistyczne.
  • Mamy bibliotekę wzorców do dalszej pracy.
  • W prezentacji 4 zbudujemy rozbudowany program krok po kroku.
Zakończenie modułu – Podsumowanie i zapowiedź części 4 ★ Prezentacja 3 ukończona! Opanowano osiem kluczowych praktycznych aplikacji mobilnych. Gratulacje! Zapowiedź kolejnej części Prezentacja 4: Pełny program • Projekt "Trener matematyczny" • Architektura 4 ekranów • Baza TinyDB i zapis rekordów • Pełny cykl: od makiety do .apk Dalsza praktyka laboratoryjna