Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00473 007823 10467526 na godz. na dobę w sumie
Windows 8. Programowanie aplikacji z wykorzystaniem C# i XAML - książka
Windows 8. Programowanie aplikacji z wykorzystaniem C# i XAML - książka
Autor: Liczba stron: 1088
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-7383-4 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> systemy operacyjne >> windows 8
Porównaj ceny (książka, ebook, audiobook).

Przewodnik programisty Windows 8!

Sztandarowy produkt giganta z Redmond - Windows 8 - na dobre zagościł na rynku komputerowym. Już po pierwszym uruchomieniu rzuca się w oczy nowy interfejs użytkownika. Kafelki, bo o nich mowa, wzbudziły skrajne emocje. Część użytkowników wyjątkowo polubiła nowy wygląd ekranu, a inni mają problemy z przyzwyczajeniem się do niego. Jedno jest pewne - twórcy aplikacji powinni podążać za trendami wyznaczonymi przez Windows 8 i tworzyć spójne, przejrzyste aplikacje, wykorzystujące potencjał platformy.

Właśnie trzymasz w rękach najlepszą książkę poświęconą programowaniu dla platformy Windows. Jej najnowsze wydanie zostało zaktualizowane o wszystkie nowości, które pojawiły się w Windows 8. W trakcie lektury dowiesz się, co to jest XAML, poznasz jego składnię oraz możliwości. W kolejnych rozdziałach nauczysz się obsługiwać zdarzenia, tworzyć animacje, korzystać z wywołań asynchronicznych oraz wykonywać operacje natywne. Druga część książki zawiera informacje o funkcjach specjalnych: obsłudze urządzeń dotykowych, kamer, drukarek i rysików. Książka ta jest kompletnym przewodnikiem dla wszystkich programistów C# i osób zainteresowanych tym językiem.

Sięgnij po tę książkę i:

Twórz najlepsze aplikacje dla systemu Windows 8!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Programming Windows: Writing Windows 8 Apps With C# and XAML Tłumaczenie: Paweł Gonera ISBN: 978-83-246-7383-4 © 2013 Grupa Wydawnicza Helion S.A. Authorized Polish translation of the English edition Programming Windows®, Sixth Edition ISBN 9780735671768 © 2013 Charles Petzold This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Wydawnictwo HELION dołożyło wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie bierze jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Wydawnictwo HELION nie ponosi również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/win8pa.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/win8pa Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treści Wprowadzenie CZĘŚĆ I PODSTAWY 9 Rozdział 1. Znaczniki i kod ...................................................................................... 21 Pierwszy projekt .....................................................................................................................21 Graficzne pozdrowienia ......................................................................................................27 Manipulowanie tekstem .....................................................................................................30 Multimedia również ..............................................................................................................38 Alternatywne programy realizowane za pomocą kodu ..........................................39 Wstawianie grafik za pomocą kodu ................................................................................43 To nawet nie strona ..............................................................................................................45 Rozdział 2. Składnia XAML ...................................................................................... 49 Pędzel gradientu w kodzie .................................................................................................49 Składnia element-właściwość ...........................................................................................52 Właściwości ContentProperty ...........................................................................................55 Właściwość ContentProperty elementu TextBlock ...................................................59 Współdzielenie pędzli (oraz innych zasobów) ............................................................61 Zasoby są współdzielone ....................................................................................................65 Grafika wektorowa ................................................................................................................65 Rozciąganie tekstu za pomocą elementu Viewbox ..................................................75 Style ............................................................................................................................................78 Trochę o wiązaniu danych .................................................................................................83 Rozdział 3. Podstawowa obsługa zdarzeń ............................................................. 87 Zdarzenie Tapped .................................................................................................................87 Obsługa zdarzeń routowanych ........................................................................................90 Przesłanianie ustawienia Handled ..................................................................................96 Wejście, wyrównanie i tła ...................................................................................................98 Zmiany rozmiaru i orientacji ........................................................................................... 101 Wiązanie danych dla elementów Run? ....................................................................... 106 Odmierzanie czasu i animacja ........................................................................................ 108 3 Kup książkęPoleć książkę Rozdział 4. Prezentacja z wykorzystaniem elementów Panel ............................ 117 Element Border .................................................................................................................... 118 Elementy Rectangle i Ellipse ........................................................................................... 121 Element StackPanel ........................................................................................................... 123 Stosy poziome ..................................................................................................................... 125 Program WhatSize z wiązaniem danych (i elementem Converter) .................. 128 Wykorzystanie elementu ScrollViewer ....................................................................... 132 Osobliwość czy normalność? ......................................................................................... 138 Tworzenie e-booka ............................................................................................................ 140 Bardziej wyszukane elementy StackPanel ................................................................. 143 Pochodne klasy UserControl .......................................................................................... 145 Tworzenie bibliotek Windows Runtime ..................................................................... 147 Alternatywa z zawijaniem ............................................................................................... 150 Element Canvas i właściwości załączone ................................................................... 153 Właściwość ZIndex ............................................................................................................. 157 Osobliwości elementu Canvas ....................................................................................... 158 Rozdział 5. Interakcje z kontrolkami .................................................................... 161 Specyfika kontrolek ........................................................................................................... 161 Suwak do zakresów ........................................................................................................... 163 Grid .......................................................................................................................................... 167 Orientacja i współczynniki proporcji ........................................................................... 173 Slider i konwerter sformatowanego tekstu .............................................................. 176 Wskazówki ekranowe i konwersja ................................................................................ 177 Szkicowanie za pomocą suwaków ............................................................................... 179 Różne odmiany przycisków ............................................................................................ 181 Definiowanie właściwości zależności .......................................................................... 189 Znaczniki RadioButton ..................................................................................................... 198 Wprowadzanie danych z klawiatury a elementy TextBox ................................... 205 Dotyk i kontrolka Thumb ................................................................................................. 208 Rozdział 6. WinRT i MVVM ..................................................................................... 215 Model MVVM w skrócie .................................................................................................... 215 Powiadomienia wiązań danych ..................................................................................... 216 Warstwa ViewModel w programie ColorScroll ........................................................ 218 Skróty składniowe .............................................................................................................. 223 Właściwość DataContext ................................................................................................. 226 Wiązania i TextBox ............................................................................................................. 228 Przyciski a wzorzec MVVM ............................................................................................... 233 Klasa DelegateCommand ................................................................................................ 235 Rozdział 7. Wywołania asynchroniczne ............................................................... 243 Wątki i interfejs użytkownika ......................................................................................... 243 Korzystanie z klasy MessageDialog .............................................................................. 244 Wywołania zwrotne jako funkcje lambda ................................................................. 250 Operator await ..................................................................................................................... 251 Anulowanie operacji asynchronicznej ........................................................................ 253 4 Spis treści Kup książkęPoleć książkę Sposoby wykonywania plikowych operacji wejścia-wyjścia .............................. 255 Lokalny magazyn aplikacji ................................................................................... 256 Okna dialogowe do wskazywania plików ...................................................... 256 Dostęp masowy ....................................................................................................... 257 Okna do wskazywania plików i operacje wejścia-wyjścia ................................... 257 Obsługa wyjątków .............................................................................................................. 262 Konsolidacja wywołań asynchronicznych ................................................................. 263 Uproszczona obsługa plikowych operacji wejścia-wyjścia ................................. 265 Problemy związane z cyklem życia aplikacji ............................................................. 267 Własne metody asynchroniczne ................................................................................... 272 Rozdział 8. Paski aplikacji i wyskakujące okna .................................................... 283 Implementacja menu kontekstowych ........................................................................ 283 Wyskakujące okna dialogowe ........................................................................................ 287 Paski aplikacji ....................................................................................................................... 290 Styl przycisków paska aplikacji ...................................................................................... 293 Wewnątrz czcionki Segoe UI Symbol .......................................................................... 298 Kontrolki pól wyboru i przełączników na paskach aplikacji ............................... 304 Pasek aplikacji Notatnika ................................................................................................. 308 Wprowadzenie do programu XAML Cruncher ........................................................ 314 Ustawienia aplikacji a warstwa ViewModel .............................................................. 329 Element Page aplikacji XAML Cruncher ..................................................................... 332 Parsowanie znaczników XAML ...................................................................................... 337 Plikowe operacje wejścia-wyjścia w XAML ............................................................... 339 Okno dialogowe ustawień .............................................................................................. 343 Więcej niż Windows Runtime ......................................................................................... 348 Rozdział 9. Animacje .............................................................................................. 349 Przestrzeń nazw Windows.UI.Xaml.Media.Animation .......................................... 349 Podstawy animacji ............................................................................................................. 350 Zmienne animacje .............................................................................................................. 354 Inne animacje wartości typu double ........................................................................... 359 Animowanie właściwości załączanych ....................................................................... 366 Funkcje łagodzące .............................................................................................................. 369 Animacje AII-XAML ............................................................................................................ 378 Animowanie własnych klas ............................................................................................. 382 Animacje kluczowych klatek .......................................................................................... 386 Animacje właściwości klasy Object .............................................................................. 390 Predefiniowane animacje i przejścia ........................................................................... 392 Rozdział 10. Transformacje ..................................................................................... 397 Przegląd informacji o transformacjach ....................................................................... 397 Obroty (ręczne i animowane) ......................................................................................... 400 Wizualna komunikacja z użytkownikiem ................................................................... 405 Translacje ............................................................................................................................... 407 Grupy transformacji ........................................................................................................... 411 Skalowanie ............................................................................................................................ 416 Spis treści 5 Kup książkęPoleć książkę Tworzenie zegara analogowego ................................................................................... 418 Pochylenie ............................................................................................................................. 424 Tworzenie efektów startowych ..................................................................................... 427 Podstawy matematyczne transformacji ..................................................................... 428 Transformacja Composite ............................................................................................... 436 Transformacje z wykorzystaniem klasy Geometry ................................................. 438 Transformacje z wykorzystaniem klasy Brush .......................................................... 440 Gdzie się podział mój element? .................................................................................... 444 Transformacje rzutów — projekcje .............................................................................. 447 Obliczanie macierzy Matrix3D ....................................................................................... 454 Rozdział 11. Trzy szablony ....................................................................................... 465 Dane w przyciskach ........................................................................................................... 466 Podejmowanie decyzji ...................................................................................................... 475 Kontrolki kolekcji i rzeczywiste zastosowanie szablonu DataTemplate ......... 479 Kolekcje i interfejsy ............................................................................................................ 489 Dotyk i zaznaczanie ........................................................................................................... 491 Panele i wirtualizacja ......................................................................................................... 496 Własne panele ...................................................................................................................... 500 Tworzenie wykresu słupkowego z wykorzystaniem szablonu .......................... 513 Kontrolka FlipView ............................................................................................................. 515 Szablon ControlTemplate ................................................................................................ 518 Menedżer stanu wizualizacji ........................................................................................... 528 Korzystanie z pliku generic.xaml ................................................................................... 535 Części szablonu ................................................................................................................... 536 Własne kontrolki ................................................................................................................. 544 Szablony i kontenery elementów ................................................................................. 550 Rozdział 12. Strony i nawigacja ............................................................................... 555 Problemy z rozdzielczością ekranu .............................................................................. 555 Problemy ze skalowaniem .............................................................................................. 560 Widok przyciągnięty .......................................................................................................... 564 Zmiana orientacji ................................................................................................................ 569 Prosta nawigacja pomiędzy stronami ......................................................................... 572 Stos powrotu ........................................................................................................................ 577 Zdarzenia nawigacji i przywracanie stron ................................................................. 579 Zapisanie i odtworzenie stanu aplikacji ..................................................................... 583 Akceleratory nawigacji i przyciski myszy ................................................................... 587 Przekazywanie i zwracanie danych .............................................................................. 590 Standardowe szablony Visual Studio .......................................................................... 596 Modele widoku i kolekcje ................................................................................................ 602 Grupowanie elementów .................................................................................................. 620 6 Spis treści Kup książkęPoleć książkę CZĘŚĆ II FUNKCJE SPECJALNE Rozdział 13. Dotyk itd. ............................................................................................. 629 Przegląd zdarzeń Pointer ................................................................................................. 630 Pierwsze podejście do malowania palcami .............................................................. 633 Przechwytywanie wskaźnika .......................................................................................... 636 Edycja z użyciem menu wyskakującego .................................................................... 644 Odczyt siły nacisku ............................................................................................................. 647 Wygładzanie przewężeń .................................................................................................. 651 Jak zapisać swoje rysunki? ............................................................................................... 660 Realistyczne i surrealistyczne rysowanie palcami ................................................... 660 Pianino dotykowe ............................................................................................................... 663 Manipulacje, palce i elementy ....................................................................................... 668 Obsługa inercji ..................................................................................................................... 676 Kontrolka XYSlider .............................................................................................................. 680 Centrowane skalowanie i obroty .................................................................................. 686 Obroty jednym palcem .................................................................................................... 690 Rozdział 14. Mapy bitowe ........................................................................................ 697 Bity pikseli .............................................................................................................................. 698 Przezroczystość i wstępnie pomnożona alfa ............................................................ 704 Pędzel z okrągłym gradientem ...................................................................................... 709 Ładowanie i zapisywanie plików obrazów ................................................................ 716 Zmiana głębi kolorów ....................................................................................................... 727 Zapisywanie rysunku namalowanego palcami ....................................................... 734 Wybór koloru HSL ............................................................................................................... 759 Rysowanie odwrotne ........................................................................................................ 770 Dostęp do biblioteki obrazów ....................................................................................... 775 Użycie kamery ...................................................................................................................... 784 Rozdział 15. Operacje natywne ............................................................................... 791 Wprowadzenie do P/Invoke ........................................................................................... 792 Mała pomoc .......................................................................................................................... 797 Informacja o strefie czasowej ......................................................................................... 798 Komponent Windows Runtime dla DirectX .............................................................. 819 DirectWrite a czcionki ....................................................................................................... 821 Konfiguracje i platformy .................................................................................................. 832 Interpretacja metryki czcionki ....................................................................................... 835 Rysowanie w obiekcie SurfaceImageSource ............................................................ 841 Rozdział 16. Tekst sformatowany ........................................................................... 855 Czcionki prywatne .............................................................................................................. 856 Użycie elementu Glyphs .................................................................................................. 860 Pliki czcionek w magazynie lokalnym ......................................................................... 862 Rozszerzenia typograficzne ............................................................................................ 866 Elementy RichTextBlock oraz Paragraph ................................................................... 867 Zaznaczanie w RichTextBlock ........................................................................................ 871 Spis treści 7 Kup książkęPoleć książkę Obsługa nadmiarowego tekstu w RichTextBlock ................................................... 871 Problemy ze stronicowaniem ........................................................................................ 878 Edycja tekstu sformatowanego w RichEditBox ....................................................... 885 Własne mechanizmy wprowadzania tekstu ............................................................. 895 Rozdział 17. Współdzielenie i drukowanie ............................................................ 901 Ustawienia i okna wyskakujące ..................................................................................... 902 Współdzielenie danych poprzez schowek ................................................................ 906 Panel Udostępnianie ......................................................................................................... 911 Proste drukowanie ............................................................................................................. 912 Marginesy drukowalne i niedrukowalne ................................................................... 918 Proces stronicowania ........................................................................................................ 922 Własne właściwości drukowania ................................................................................... 929 Drukowanie miesięcznego planu pracy ..................................................................... 935 Drukowanie zakresu stron ............................................................................................... 944 Gdzie można wykonywać czasochłonne zadania? ................................................. 955 Drukowanie grafiki z FingerPaint ................................................................................. 956 Rozdział 18. Sensory i GPS ....................................................................................... 959 Orientacja .............................................................................................................................. 959 Przyspieszenie, siła, grawitacja i wektory .................................................................. 964 Podążaj za kulką .................................................................................................................. 974 Dwie północe ....................................................................................................................... 979 Inklinometr = przyspieszeniomierz + kompas ......................................................... 981 OrientationSensor = przyspieszeniomierz + kompas ........................................... 986 Azymut i wysokość ............................................................................................................. 991 Mapy oraz kafelki map Bing ..........................................................................................1004 Rozdział 19. Pióro (nazywane również rysikiem) ................................................ 1019 Kolekcje InkManager .......................................................................................................1020 Atrybuty atramentu .........................................................................................................1023 Usuwanie i inne rozszerzenia .......................................................................................1029 Zaznaczanie pociągnięć .................................................................................................1035 Żółty notatnik .....................................................................................................................1043 Skorowidz .......................................................................................... 1061 O autorze ...........................................................................................(cid:1)10(cid:25)(cid:25) 8 Spis treści Kup książkęPoleć książkę ROZDZIAŁ 18. Sensory i GPS W ostatnim czasie komputery zostały wyposażone w nowe „zmysły”. To nie jest szkic nowego filmu! Wiele komputerów — a w szczególności tabletów i innych urzą- dzeń mobilnych — posiada sensory, które pozwalają maszynie zorientować się w prze- strzeni trójwymiarowej, w położeniu na powierzchni Ziemi, sprawdzić ilość światła, a nawet szybkość, z jaką użytkownik obraca w rękach komputer. Te elementy sprzętowe, nazywane ogólnie sensorami, i interfejsy programowe pozwa- lające na korzystanie z nich znajdują się w większości w przestrzeni nazw Windows. (cid:180)Devices.Sensors, natomiast klasy pomagające programowi w określeniu położenia geograficznego znajdują się w przestrzeni nazw Windows.Devices.Geolocation. Sprzęt realizujący to drugie zadanie jest często nazywany nieformalnie skrótem GPS (ponieważ tego typu system satelitarny nosi nazwę Global Positioning System), ale często komputer może określić położenie geograficzne z użyciem połączenia sieciowego. W tym rozdziale skupimy się na danych dostępnych poprzez klasy SimpleOrienta (cid:180)tionSensor, Accelerometer, Compass, Inclinometer, OrientationSensor oraz Geolocator, ale muszę pominąć rzadziej używane klasy LightSensor i Gyrometer, które pozwalają na pomiar ilości światła oraz szybkości kątowej komputera. Aby w pełni wykorzystać informacje z tego rozdziału, powinieneś wziąć do ręki kompu- ter z uruchomionymi programami i poruszyć nim, a nawet trzymać go nad głową. Jeżeli Twój komputer, na którym tworzysz aplikacje Windows 8, jest przywiązany do biurka tak jak mój, możesz postarać się o tablet, taki jak Microsoft Surface, i zainstalować na nim programy w sposób pokazany przez Tima Heuera na jego blogu, dostępnym pod adre- sem http://timheuer.com/blog/archive/2012/10/26/remote-debugging-windows-store-apps- on-surface-arm-devices.aspx. Część przykładowych programów z tego rozdziału powstało na podstawie artykułów, jakie napisałem na temat sensorów w Windows Phone 7.5, opublikowanych od czerwca do grudnia 2012 r. w „MSDN Magazine”. Orientacja Najprostszą klasą sensorów, jaką się zajmiemy, jest SimpleOrientationSensor, która pozwala w przybliżony sposób zorientować się, jakie jest położenie komputera w prze- strzeni trójwymiarowej, ale bez większych szczegółów. Aby utworzyć obiekt Simple (cid:180)OrientationSensor, korzystamy z metody statycznej: SimpleOrientationSensor simpleOrientationSensor = SimpleOrientationSensor.GetDefault(); 959 Kup książkęPoleć książkę Operację tę wykonujemy w aplikacji tylko raz, więc kod ten powinien pojawić się jako definicja pola, co pozwoli na dostęp do tego obiektu dla całej klasy. Jeżeli metoda SimpleOrientationSensor.GetDefault zwróci null, komputer nie posiada urządzenia pozwalającego na odczyt orientacji. W dowolnym momencie z obiektu SimpleOrientationSensor możemy odczytać war- tość oznaczającą bieżącą orientację: SimpleOrientation simpleOrientation = simpleOrientationSensor.GetCurrentOrientation(); SimpleOrientation to typ wyliczeniowy z sześcioma składowymi: (cid:131) NotRotated, (cid:131) Rotated90DegreesCounterclockwise, (cid:131) Rotated180DegreesCounterclockwise, (cid:131) Rotated270DegreesCounterclockwise, (cid:131) Faceup, (cid:131) Facedown. Ograniczenie ilości danych do tych sześciu wartości tłumaczy, dlaczego w nazwie klasy SimpleOrientationSensor znalazła się fraza simple — prosta. Możemy również być powiadomieni o zmianie orientacji za pomocą zdarzenia. Ustawienie metody obsługi zdarzenia OrientationChanged jest realizowane w następu- jący sposób: simpleOrientationSensor.OrientationChanged += OnSimpleOrientationChanged; Zdarzenie to jest generowane w momencie zmiany orientacji, co nie dzieje się, gdy komputer jest względnie nieruchomy. Jeżeli potrzebujesz wartości początkowej, to oprócz ustawienia metody obsługi zdarzenia wywołaj metodę GetCurrentOrientation. Metoda obsługi zdarzenia działa we własnym wątku, więc interakcja z wątkiem inter- fejsu użytkownika musi zachodzić z użyciem obiektu CoreDispatcher: async void OnSimpleOrientationChanged(SimpleOrientationSensor sender, SimpleOrientationSensorOrientationChangedEventArgs args) { await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () = { ... }); } Argument zdarzenia mający typ o bardzo długiej nazwie posiada właściwość Orien (cid:180)tation typu wyliczeniowego SimpleOrientation oraz właściwość Timestamp typu Date (cid:180)TimeOffset. Możesz tu zadać pytania: „Czy nie korzystałem już z tych danych orientacji? Czy nie są one dostępne w przestrzeni nazw Windows.Graphics.Display? Czy nie korzystałem z klasy DisplayProperties i jej właściwości statycznych NativeOrientation oraz Current (cid:180)Orientation, jak również zdarzenia OrientationChanged do odczytania danych o orien- tacji?”. Na pewno pamiętasz, że te dwie właściwości statyczne zwracają wartości typu wyliczeniowego DisplayOrientations: 960 CZĘŚĆ II Funkcje specjalne Kup książkęPoleć książkę (cid:131) Landscape, (cid:131) Portrait, (cid:131) LandscapeFlipped, (cid:131) PortraitFlipped. Klasy SimpleOrientationSensor i DisplayProperties są oczywiście ze sobą związane, ale trzeba wiedzieć, w jaki sposób. Klasa SimpleOrientationSensor pozwala sprawdzić, jak komputer jest zorientowany w przestrzeni. Właściwość DisplayProperties.Current (cid:180)Orientation pokazuje, jak Windows dostosował się do orientacji komputera przez zmianę orientacji okna programu. Inaczej mówiąc, SimpleOrientationSensor raportuje orientację sprzętu, natomiast DisplayProperties.CurrentOrientation raportuje orien- tację oprogramowania, które zareagowało na zmianę w położeniu sprzętu. Projekt OrientationAndOrientation ma za zadanie pokazać różnice pomiędzy tymi orientacjami. W pliku XAML zdefiniowanych jest kilka elementów TextBlock dla etykiet oraz do wyświetlania informacji: Listing 18.1. Projekt: OrientationAndOrientation | Plik: MainPage.xaml (fragment) Page... FontSize= 18 Grid Background= {StaticResource ApplicationPageBackgroundThemeBrush} Grid HorizontalAlignment= Center VerticalAlignment= Center Grid.RowDefinitions RowDefinition Height= Auto / RowDefinition Height= Auto / /Grid.RowDefinitions Grid.ColumnDefinitions ColumnDefinition Width= Auto / ColumnDefinition Width= Auto / /Grid.ColumnDefinitions TextBlock Text= SimpleOrientationSensor: #x00A0; Grid.Row= 0 Grid.Column= 0 / TextBlock Name= orientationSensorTextBlock Grid.Row= 0 Grid.Column= 1 TextAlignment= Right / TextBlock Text= DisplayProperties.CurrentOrientation: #x00A0; Grid.Row= 1 Grid.Column= 0 / TextBlock Name= displayOrientationTextBlock Grid.Row= 1 Grid.Column= 1 TextAlignment= Right / /Grid /Grid /Page ROZDZIAŁ 18. Sensory i GPS 961 Kup książkęPoleć książkę W pliku kodu ukrytego zdefiniowane są dwie metody mające za zadanie ustawić dwa elementy TextBlock w drugiej kolumnie elementu Grid. Te dwie metody są wywoływane zarówno w konstruktorze, aby ustawić wartości początkowe, jak i z dwóch metod obsługi zdarzeń. Listing 18.2. Projekt: OrientationAndOrientation | Plik: MainPage.xaml.cs (fragment) public sealed partial class MainPage : Page { SimpleOrientationSensor simpleOrientationSensor = (cid:180)SimpleOrientationSensor.GetDefault(); public MainPage() { this.InitializeComponent(); // Inicjalizacja SimpleOrientationSensor if (simpleOrientationSensor != null) { SetOrientationSensorText(simpleOrientationSensor.GetCurrentOrientation()); simpleOrientationSensor.OrientationChanged += OnSimpleOrientationChanged; } // Inicjalizacja DisplayProperties SetDisplayOrientationText(DisplayProperties.CurrentOrientation); DisplayProperties.OrientationChanged += OnDisplayPropertiesOrientationChanged; } // Metoda obs(cid:225)uguj(cid:261)ca SimpleOrientationSensor async void OnSimpleOrientationChanged(SimpleOrientationSensor sender, SimpleOrientationSensorOrientation (cid:180)ChangedEventArgs args) { await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () = { SetOrientationSensorText(args.Orientation); }); } void SetOrientationSensorText(SimpleOrientation simpleOrientation) { orientationSensorTextBlock.Text = simpleOrientation.ToString(); } // Metoda obs(cid:225)uguj(cid:261)ca DisplayProperties void OnDisplayPropertiesOrientationChanged(object sender) { SetDisplayOrientationText(DisplayProperties.CurrentOrientation); } void SetDisplayOrientationText(DisplayOrientations displayOrientation) { displayOrientationTextBlock.Text = displayOrientation.ToString(); } } 962 CZĘŚĆ II Funkcje specjalne Kup książkęPoleć książkę Zwróć uwagę, że obiekt SimpleOrientationSensor jest tworzony jako pole, ale kon- struktor sprawdza przed dostępem do niego, czy zawiera wartość różną od null. Jeżeli uruchomisz ten program na tablecie mającym standardową orientację pozio- mą — czyli właściwość DisplayProperties.NativeOrientation zawiera wartość Display (cid:180)Orientations.Landscape — i jeżeli nie zrobiłeś nic, aby uniemożliwić Windows zmianę orientacji (na przykład umieszczając tablet w stacji dokującej), to w czasie obracania tabletu w kierunku zgodnym z ruchem wskazówek zegara zazwyczaj można zauważyć następującą korelację pomiędzy dwoma wskaźnikami orientacji: SimpleOrientationSensor DisplayProperties.CurrentOrientation NotRotated Landscape Rotated270DegreesCounterClockwise Portrait Rotated180DegreesCounterClockwise LandscapeFlipped Rotated90DegreesCounterClockwise PortraitFlipped Obiekt SimpleOrientationSensor raportuje również wartości Faceup i Facedown, które nie mają odpowiedników w typie DisplayOrientations. Choć powyższa tabela zwykle zgadza się dla tabletów z natywną orientacją poziomą, to jednak urządzenia mające standardowo orientację pionową wykazują następującą korelację: SimpleOrientationSensor DisplayProperties.CurrentOrientation NotRotated Portrait Rotated270DegreesCounterClockwise LandscapeFlipped Rotated180DegreesCounterClockwise PortraitFlipped Rotated90DegreesCounterClockwise Landscape Co więcej, aplikacja może zażądać od Windows, aby nie wykonywał zmian kompen- sujących orientację komputera — czy to za pomocą ustawienia w pliku Package.appx manifest, czy to programowo, przez ustawienie właściwości DisplayProperties.Auto (cid:180)RotationPreferences. W takim przypadku wartość DisplayProperties.CurrentOrien (cid:180)tation nie zmienia się w czasie działania aplikacji. Niektóre tablety mają przełącznik sprzętowy pozwalający zablokować obracanie ekranu przez Windows. W takim przypadku możesz nawet zobaczyć coś takiego: SimpleOrientationSensor DisplayProperties.CurrentOrientation NotRotated PortraitFlipped Rotated270DegreesCounterClockwise PortraitFlipped Rotated180DegreesCounterClockwise PortraitFlipped Rotated90DegreesCounterClockwise PortraitFlipped ROZDZIAŁ 18. Sensory i GPS 963 Kup książkęPoleć książkę Jeżeli chcesz, możesz nawet samodzielnie wykonać kompensację orientacji. Możesz poinstruować Windows, aby nie były wykonywane zmiany orientacji, a następnie użyć SimpleOrientationSensor do sprawdzenia, jak jest zorientowany komputer. Jednak pamiętaj, że ustawienie z pliku Package.appxmanifest oraz DisplayProperties.AutoRo (cid:180)tationPreferences jedynie informuje Windows o Twoich preferencjach, więc gdy Windows postąpi niezgodnie z tymi wskazówkami, mogą być konieczne dalsze korekty. Chyba najbezpieczniejszym podejściem do wyłączenia automatycznego obrotu jest ustawienie właściwości DisplayProperties.AutoRotationPreferences na DisplayPro (cid:180)perties.NativeOrientation, z czego będziemy korzystać w dalszej części rozdziału. Przyspieszenie, si(cid:225)a, grawitacja i wektory Klasa SimpleOrientationSensor bez wątpienia wykorzystuje urządzenie sprzętowe nazy- wane przyspieszeniomierzem albo akcelerometrem. Przyspieszeniomierz jest urządzeniem mierzącym przyspieszenie, na początek może się wydawać, że znajomość przyspieszenia nie jest zbyt przydatna. Jednak wiemy z fizyki — a dokładniej z drugiego prawa dynamiki Newtona — że: F (cid:32) ma Siła jest równa iloczynowi masy i przyspieszenia, a jedną z sił, od której trudno uciec, jest siła grawitacji. Przez większość czasu przyspieszeniomierz komputera mierzy grawitację i odpowiada na proste pytanie, gdzie jest dół. Bardziej bezpośredni dostęp do przyspieszeniomierza mamy poprzez klasę Accele (cid:180)rometer. Aby utworzyć obiekt klasy Accelerometer, należy użyć metody statycznej o tej samej nazwie co w SimpleOrientationSensor: Accelerometer accelerometer = Accelerometer.GetDefault(); Jeżeli metoda Accelerometer.GetDefault zwróci null, komputer nie posiada przyspie- szeniomierza albo Windows 8 nic nie wie na jego temat. Jeżeli Twoja aplikacja nie może działać bez przyspieszeniomierza, powinieneś poinformować użytkownika o jego braku. W dowolnym momencie możesz odczytać bieżącą wartość przyspieszenia: AccelerometerReading accelerometerReading = accelerometer.GetCurrentReading(); Podobna metoda w klasie SimpleOrientationSensor nosi nazwę GetCurrentOrientation. Dobrym pomysłem jest sprawdzanie, czy wartością zwracaną przez GetCurrentReading jest null. W klasie AccelerometerReading są zdefiniowane cztery właściwości: (cid:131) AccelerationX typu double, (cid:131) AccelerationY typu double, (cid:131) AccelerationZ typu double, (cid:131) Timestamp typu DateTimeOffset. Trzy wartości double tworzą wektor trójwymiarowy wskazujący od urządzenia w kierun- ku ziemi. Więcej na jego temat wkrótce. Do obiektu Accelerometer można również dołączyć metodę obsługi zdarzenia: accelerometer.ReadingChanged += OnAccelerometerReadingChanged; 964 CZĘŚĆ II Funkcje specjalne Kup książkęPoleć książkę Podobne zdarzenie w klasie SimpleOrientationSensor nosi nazwę OrientationChanged. Podobnie jak w przypadku OrientationChanged, metoda obsługująca ReadingChanged działa w osobnym wątku, więc powinna być obsługiwana w następujący sposób: async void OnAccelerometerReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args) { await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () = { ... }); } Klasa AccelerometerReadingChangedEventArgs ma zdefiniowaną właściwość o nazwie Reading typu AccelerometerReading, takiego samego jak obiekt zwracany przez GetCur (cid:180)rentReading. Jak często będzie wywoływana metoda obsługi zdarzenia ReadingChanged? Jeżeli komputer jest nieruchomy, być może wcale! Z tego powodu, jeżeli potrzebujesz począt- kowych odczytów przyspieszenia, powinieneś na początek wywołać metodę GetCurrent (cid:180)Reading. Jeżeli komputer jest przenoszony lub zmienia orientację w przestrzeni, metoda Reading (cid:180)Changed jest wywoływana przy zmianie wartości (przy określonych kryteriach), ale pomiędzy kolejnymi wywołaniami następuje przerwa o długości nie mniejszej niż liczba milisekund odczytana z właściwości ReportInterval obiektu Accelerometer. Z właści- wości tej odczytałem wartość 112, czyli metoda ReadingChanged jest wywoływana nie częściej niż dziewięć razy na sekundę. Właściwości ReportInterval można przypisać inną wartość, ale nie niższą od wartości z właściwości MinimumReportInterval, która wynosi 16 milisekund, czyli około 60 razy na sekundę. Ustawienie ReportInterval na MinimumReportInterval pozwala uzyskać mak- symalną ilość danych; ustawienie ReportInterval na zero powoduje powrót do ustawień domyślnych. Pozostałe klasy czujników w przestrzeni nazw Windows.Devices.Sensors mają ten sam interfejs programowy co Accelerometer. Mają one następujące składniki: (cid:131) statyczną metodę GetDefault, (cid:131) metodę instancyjną GetCurrentReading, (cid:131) właściwość ReportInterval, (cid:131) właściwość tylko do odczytu MinimumReportInterval, (cid:131) zdarzenie ReadingChanged. Jedynie klasa SimpleOrientationSensor różni się od pozostałych. Jeżeli komputer jest nieruchomy, właściwości AccelerationX, AccelerationY oraz AccelerationZ klasy AccelerometerReading definiują wektor wskazujący w kierunku środka Ziemi. Wektory są zwykle zapisywane pogrubieniem jako współrzędne (x, y, z), dla odróżnienia od punktów (x, y, z). Punkt jest lokalizacją w przestrzeni, natomiast wektor jest kierunkiem i modułem. Oczywiście zachodzi związek pomiędzy wektorem i punktem. Kierunek wektora (x, y, z) jest kierunkiem z punktu (0, 0, 0) do punktu (x, y, z), a modułem wektora jest długość tego odcinka. Jednak sam wektor nie jest odcinkiem i nie posiada lokalizacji. ROZDZIAŁ 18. Sensory i GPS 965 Kup książkęPoleć książkę Moduł wektora może być wyliczony za pomocą trójwymiarowej wersji twierdzenia Pitagorasa: Moduł (cid:32) 2 x (cid:14) 2 y 2 (cid:14) z Każdy wektor trójwymiarowy musi być usytuowany w określonym układzie współ- rzędnych trójwymiarowych i wektor odczytany z AccelerometerReading nie jest wyjąt- kiem. W przypadku tabletu z natywną orientacją poziomą układ współrzędnych jest następujący: Zwróć uwagę, że wartości Y zwiększają się w górę, czyli odwrotnie niż w przypadku konwencji stosowanych w grafice dwuwymiarowej. Dodatnia oś Z „wystaje” z ekranu. Konwencja taka jest często nazywana układem współrzędnych prawej ręki. Jeżeli palec wskazujący prawej ręki wskazuje w kierunku dodatnich X, duży palec w kierunku dodat- nich Y, to kciuk wskazuje w kierunku dodatnich Z. Jeżeli obrócisz palce prawej ręki w kierunku potrzebnym do obrotu dodatniej osi X w kierunku dodatniej osi Y, kciuk będzie wskazywał w kierunku dodatniej osi Z. Działa to dla dowolnych par osi, w kolejności X, Y, Z. Obróć palce prawej dłoni w taki sposób, aby dodatnia oś Y przesunęła się w kierunku dodatniej osi Z, a kciuk będzie wskazywał w kie- runku dodatniej osi X. Albo obróć palce prawej dłoni w taki sposób, aby dodatnia oś Z przesunęła się w kierunku dodatniej osi X, a kciuk będzie wskazywał w kierunku dodat- niej osi Y. Zasada prawej dłoni może być używana do określenia kierunku obrotu wokół osi. W przypadku obrotów wokół osi X (dla przykładu) wskaż kciukiem prawej dłoni w kierunku dodatniej osi X, a palce będą obracać się w kierunku dodatnich kątów obrotu wokół osi. W przypadku urządzeń z natywną orientacją pionową układ współrzędnych jest taki sam z perspektywy użytkownika (patrz rysunek na następnej stronie). Choć nie byłem w stanie tego potwierdzić, układ współrzędnych dla zwykłych lapto- pów bazuje na powierzchni klawiatury, a nie ekranu. Osią X jest dłuższy bok klawiatury, osią Y krótszy bok klawiatury, a oś Z wskazuje ponad klawiaturę. Ten układ współrzędnych jest stały dla urządzenia i wektor obiektu Accelerometer wskazuje w kierunku środka Ziemi, mając wartości określane względem tego układu współ- rzędnych. Gdy tablet jest na przykład trzymany prosto w swojej natywnej orientacji, 966 CZĘŚĆ II Funkcje specjalne Kup książkęPoleć książkę wektor przyspieszenia wskazuje w kierunku –Y. Moduł wektora wynosi mniej więcej 1, więc wektor ten można zapisać jako (0, –1, 0). Gdy urządzenie leży na płaskiej powierzchni stołu, ekranem w górę, to wektor ma wartość bliską (0, 0, –1). Moduł równy 1 wskazuje, że wektor ten jest mierzony w jednostkach g, czyli przy- spieszeniem powodowanym przez siłę grawitacji na powierzchni Ziemi, tj. 9,81 metra na sekundę do kwadratu. Jeżeli zabierzesz tablet na Księżyc, moduł wektora spadnie do 0,17. Jeżeli tablet będzie spadał swobodnie (o ile się odważysz rzucić go) to moduł wek- tora przyspieszenia zmniejszy się do zera, aż do momentu uderzenia w podłoże. Przedstawię teraz program AccelerometerAndSimpleOrientation, który wyświetla war- tości z obiektów Accelerometer oraz SimpleOrientationSensor. Plik XAML zawiera zestaw elementów TextBlock na etykiety i wartości ustawiane za pomocą kodu ukrytego. Listing 18.3. Projekt: AccelerometerAndSimpleOrientation | Plik: MainPage.xaml (fragment) Page ... Page.Resources Style TargetType= TextBlock Setter Property= FontSize Value= 24 / Setter Property= Margin Value= 24 12 24 12 / /Style /Page.Resources Grid Background= {StaticResource ApplicationPageBackgroundThemeBrush} Grid HorizontalAlignment= Center VerticalAlignment= Center Grid.RowDefinitions RowDefinition Height= Auto / RowDefinition Height= Auto / RowDefinition Height= Auto / ROZDZIAŁ 18. Sensory i GPS 967 Kup książkęPoleć książkę RowDefinition Height= Auto / RowDefinition Height= Auto / /Grid.RowDefinitions Grid.ColumnDefinitions ColumnDefinition Width= Auto / ColumnDefinition Width= Auto / /Grid.ColumnDefinitions TextBlock Grid.Row= 0 Grid.Column= 0 Text= Przyspieszeniomierz X: / TextBlock Grid.Row= 1 Grid.Column= 0 Text= Przyspieszeniomierz Y: / TextBlock Grid.Row= 2 Grid.Column= 0 Text= Przyspieszeniomierz Z: / TextBlock Grid.Row= 3 Grid.Column= 0 Text= Modu(cid:239): Margin= 24 24 / TextBlock Grid.Row= 4 Grid.Column= 0 Text= Orientacja: / TextBlock Grid.Row= 0 Grid.Column= 1 Name= accelerometerX TextAlignment= Right / TextBlock Grid.Row= 1 Grid.Column= 1 Name= accelerometerY TextAlignment= Right / TextBlock Grid.Row= 2 Grid.Column= 1 Name= accelerometerZ TextAlignment= Right / TextBlock Grid.Row= 3 Grid.Column= 1 Name= magnitude TextAlignment= Right VerticalAlignment= Center / TextBlock Grid.Row= 4 Grid.Column= 1 Name= simpleOrientation TextAlignment= Right / /Grid /Grid /Page Plik kodu ukrytego posiada nieco więcej kodu sprawdzającego niż poprzednio. Jeżeli nie można utworzyć obiektu Accelerometer lub SimpleOrientationSensor, informacja o tym jest wyświetlana użytkownikowi. Dodatkowo dobrym pomysłem jest, aby obiekt Accelerometer nie działał w czasie, gdy program z niego nie korzysta, ponieważ powo- duje to szybsze zużywanie baterii. Aby pokazać, że aplikacja szanuje baterię, program ten podłącza metodę obsługi w OnNavigateTo i odłącza ją w OnNavigateFrom. Poza tym jego struktura jest zbliżona do poprzedniego programu. Listing 18.4. Projekt: AccelerometerAndSimpleOrientation | Plik: MainPage.xaml.cs (fragment) public sealed partial class MainPage : Page { Accelerometer accelerometer = Accelerometer.GetDefault(); SimpleOrientationSensor simpleOrientationSensor = (cid:180)SimpleOrientationSensor.GetDefault(); public MainPage() { this.InitializeComponent(); this.Loaded += OnMainPageLoaded; } async void OnMainPageLoaded(object sender, RoutedEventArgs args) { if (accelerometer == null) 968 CZĘŚĆ II Funkcje specjalne Kup książkęPoleć książkę await new MessageDialog( Nie mo(cid:285)na uruchomi(cid:202) (cid:180)przyspieszeniomierza ).ShowAsync(); if (simpleOrientationSensor == null) await new MessageDialog( Nie mo(cid:285)na uruchomi(cid:202) (cid:180)SimpleOrientationSensor ).ShowAsync(); } // Pod(cid:225)(cid:261)czenie metod obs(cid:225)ugi zdarze(cid:276) protected override void OnNavigatedTo(NavigationEventArgs args) { if (accelerometer != null) { SetAccelerometerText(accelerometer.GetCurrentReading()); accelerometer.ReadingChanged += OnAccelerometerReadingChanged; } if (simpleOrientationSensor != null) { SetSimpleOrientationText(simpleOrientationSensor.GetCurrentOrientation()); simpleOrientationSensor.OrientationChanged += OnSimpleOrientationChanged; } base.OnNavigatedTo(args); } // Od(cid:225)(cid:261)czenie metod obs(cid:225)ugi zdarze(cid:276) protected override void OnNavigatedFrom(NavigationEventArgs args) { if (accelerometer != null) accelerometer.ReadingChanged -= OnAccelerometerReadingChanged; if (simpleOrientationSensor != null) simpleOrientationSensor.OrientationChanged -= OnSimpleOrientationChanged; base.OnNavigatedFrom(args); } // Metoda obs(cid:225)ugi przyspieszeniomierza async void OnAccelerometerReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs (cid:180)args) { await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () = { SetAccelerometerText(args.Reading); }); } void SetAccelerometerText(AccelerometerReading accelerometerReading) { if (accelerometerReading == null) return; accelerometerX.Text = accelerometerReading.AccelerationX.ToString( F2 ); accelerometerY.Text = accelerometerReading.AccelerationY.ToString( F2 ); accelerometerZ.Text = accelerometerReading.AccelerationZ.ToString( F2 ); magnitude.Text = ROZDZIAŁ 18. Sensory i GPS 969 Kup książkęPoleć książkę Math.Sqrt(Math.Pow(accelerometerReading.AccelerationX, 2) + Math.Pow(accelerometerReading.AccelerationY, 2) + Math.Pow(accelerometerReading.AccelerationZ, (cid:180)2)).ToString( F2 ); } // Metoda obs(cid:225)ugi SimpleOrientationSensor async void OnSimpleOrientationChanged(SimpleOrientationSensor sender, SimpleOrientationSensorOrientation (cid:180)ChangedEventArgs args) { await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () = { SetSimpleOrientationText(args.Orientation); }); } void SetSimpleOrientationText(SimpleOrientation simpleOrientation) { this.simpleOrientation.Text = simpleOrientation.ToString(); } } Poniżej pokazany jest widok ekranu tabletu używanego przeze mnie przy pisaniu tej książki, gdy został on umieszczony w stacji dokującej. Nie przejmuj się, jeżeli zobaczysz wartość modułu odbiegającą od 1. Oznacza to tylko, że przyspieszeniomierz nie jest tak precyzyjny, jak byśmy chcieli. 970 CZĘŚĆ II Funkcje specjalne Kup książkęPoleć książkę Zarówno składowa X, jak i Y jest ujemna, co wskazuje, że tablet został odchylony w tył. Jak wcześniej wspomniałem, jeżeli tablet jest ustawiony pionowo w górę, teoretycznie wektor ma wartość (0, –1, 0), a jeżeli leży na biurku ekranem w górę, teoretycznie wektor ma wartość (0, 0, –1). Pomiędzy tymi dwoma pozycjami tablet jest obracany wokół osi X. Przekazując wartości Y i Z do metody Math.Atan2, otrzymamy kąt obrotu. Jeżeli uruchomisz ten program na urządzeniu przenośnym, możesz poruszać nim w różnych orientacjach, aby zobaczyć efekty. Generalnie powinieneś zauważyć analogię pomiędzy wartościami z SimpleOrientationSensor a z Accelerometer: SimpleOrientationSensor Wektor Accelerometer NotRotated Rotated90DegreesCounterClockwise Rotated180DegreesCounterClockwise Rotated270DegreesCounterClockwise Faceup Facedown ~ (0, –1, 0) ~ (–1, 0, 0) ~ (0, 1, 0) ~ (1, 0, 0) ~ (0, 0, –1) ~ (0, 0, 1) Użyty tu symbol przybliżenia (~) pokazuje, że powinniśmy traktować te wartości bar- dzo liberalnie. Wektor Accelerometer wykazuje pewne fluktuacje, zanim osiągnie wartości powodujące zmianę w SimpleOrientationSensor. Ten prosty program AccelerometerAndSimpleOrientation nie zakłada żadnej prefero- wanej orientacji, więc gdy będziemy poruszać tabletem, Windows będzie automatycz- nie zmieniał orientację, zakładając, że nie chcesz czytać liczb do góry nogami. Powinie- neś zauważyć korelację pomiędzy wartościami SimpleOrientationSensor a orientacją ekranu, ponieważ Windows zmienia sposób wyświetlania ekranu, bazując na tych warto- ściach! Jeżeli zablokujesz możliwość zmiany orientacji ekranu przez Windows (w dowolny sposób), dane wyświetlane przez program się nie zmienią. W rzeczywistości możesz uznać, że ciągła zmiana orientacji jest irytująca. W czasie takiej zmiany aktualizacja ekranu jest na chwilę przerywana, a zawartość ekranu dopa- sowuje się do zmiany. Jeżeli chwilę o tym pomyślisz, prawdopodobnie dojdziesz do wniosku, że program korzystający z obiektu Accelerometer do zmiany zawartości ekranu powinien mieć zablokowaną automatyczną zmianę orientacji. Z tego powodu wszystkie programy w pozostałej części rozdziału zawierają w kon- struktorze programu wiersz powodujący ustawienie preferowanej orientacji: DisplayProperties.AutoRotationPreferences = DisplayProperties.NativeOrientation; Po uruchomieniu programu AccelerometerAndSimpleOrientation na urządzeniu prze- nośnym możesz zauważyć, że w przypadku wykonania szybkiego ruchu zmienia się kie- runek i moduł wektora przyspieszenia, który przestaje wskazywać 1g. Jeżeli na przykład ruszysz urządzeniem w lewo, wektor przyspieszenia będzie wskazywał w prawo, ale wyłącz- nie w czasie, gdy urządzenie przyspiesza. Jeżeli uda Ci się przesuwać je ze stałą szybko- ścią, wektor przyspieszenia wróci do stałej wartości modułu i będzie wskazywał w kierunku środka Ziemi. Nagłe zatrzymanie urządzenia spowoduje, że wektor przyspieszenia wskaże również zmianę w szybkości. ROZDZIAŁ 18. Sensory i GPS 971 Kup książkęPoleć książkę Klasa Accelerometer definiuje również zdarzenie o nazwie Shaken, które nie niesie ze sobą żadnych informacji. Zdarzenie to jest przydatne, gdy program musi „rzucić” parą kostek, zaproponować inną restaurację, usunąć rysunek lub wycofać przypadkowe usunięcie. Jednym z częstych zastosowań klasy Accelerometer jest oznaczanie poziomu. W pliku XAML tworzone są cztery elementy Ellipse. Trzy z nich są narysowane koncentrycznie, a czwarta reprezentuje bąbelek poziomicy. Listing 18.5. Projekt: BubbleLevel | Plik: MainPage.xaml (fragment) Grid Background= {StaticResource ApplicationPageBackgroundThemeBrush} Grid Name= centeredGrid HorizontalAlignment= Center VerticalAlignment= Center Ellipse Name= outerCircle Stroke= {StaticResource ApplicationForegroundThemeBrush} / Ellipse Name= halfCircle Stroke= {StaticResource ApplicationForegroundThemeBrush} / Ellipse Width= 24 Height= 24 Stroke= {StaticResource ApplicationForegroundThemeBrush} / Ellipse Fill= Red Width= 24 Height= 24 HorizontalAlignment= Center VerticalAlignment= Center Ellipse.RenderTransform TranslateTransform x:Name= bubbleTranslate / /Ellipse.RenderTransform /Ellipse /Grid /Grid W pliku kodu ukrytego właściwości DisplayProperties.AutoRotationPreferences przypisywana jest wartość DisplayProperties.NativeOrientation. Nie ma powodu, aby w tym programie Windows automatycznie zmieniał orientację ekranu. Program posiada również metodę obsługi zdarzenia SizeChanged, w którym ustawiana jest wielkość ele- mentów outerCircle oraz halfCircle. Listing 18.6. Projekt: BubbleLevel | Plik: MainPage.xaml.cs (fragment) public sealed partial class MainPage : Page { Accelerometer accelerometer = Accelerometer.GetDefault(); public MainPage() { this.InitializeComponent(); DisplayProperties.AutoRotationPreferences = (cid:180)DisplayProperties.NativeOrientation; Loaded += OnMainPageLoaded; SizeChanged += OnMainPageSizeChanged; } 972 CZĘŚĆ II Funkcje specjalne Kup książkęPoleć książkę async void OnMainPageLoaded(object sender, RoutedEventArgs args) { if (accelerometer != null) { accelerometer.ReportInterval = accelerometer.MinimumReportInterval; SetBubble(accelerometer.GetCurrentReading()); accelerometer.ReadingChanged += OnAccelerometerReadingChanged; } else { await new MessageDialog( Przyspieszeniomierz nie jest (cid:180)dost(cid:218)pny ).ShowAsync(); } } void OnMainPageSizeChanged(object sender, SizeChangedEventArgs args) { double size = Math.Min(args.NewSize.Width, args.NewSize.Height); outerCircle.Width = size; outerCircle.Height = size; halfCircle.Width = size / 2; halfCircle.Height = size / 2; } async void OnAccelerometerReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs (cid:180)args) { await this.Dispatcher.RunAsync(
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Windows 8. Programowanie aplikacji z wykorzystaniem C# i XAML
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: