Windows Phone 7 is erg gevoelig

Microsoft heeft het hardware fabrikanten erg eenvoudig gemaakt. Ze hebben namelijk vrijwel geen keuze meer over de hardware. Zo zal bij de lancering bijna iedere Windows Phone 7 dezelfde specificatie hebben. Ze zitten in ieder geval vol met sensoren.

Touchscreen

Multi-touch is een sleutelwoord voor bijna iedere recente smartphone. Vanzelfsprekend ondersteunt Windows Phone 7 ook multi-touch.
Het ontwikkelen op sensoren met een Windows Phone emulator is niet altijd even eenvoudig. Voor gestures met één touchpunt kun je gewoon de muis gebruiken, maar Pinch en Stretch gestures zijn lastig te simuleren. Om te beginnen is het goed te testen op een echte telefoon. Ondanks dat dit ook aan te raden is, werkt het soms prettiger om in de emulator te werken tijdens het development proces. Met een multi-touch laptop of scherm werkt het out-of-the-box, maar ook door meer dan één muis aan te sluiten kan multi-touch worden gesimuleerd (#2).

Erg interessant wordt het touch screen in combinatie met ‘gebaren’ ofwel gestures. Met behulp van de Silverlight Toolkit voor Windows Phone (#1) is dit een relatief eenvoudige opdracht. Waarbij het niet meevalt een algoritme uit te programmeren voor de verschillende gestures, heeft de Toolkit standaard ondersteuning voor de meest gebruikte gestures.

Na de installatie van de Silverlight Toolkit kun je de Microsoft.Phone.Controls.Toolkit.dll assembly toevoegen aan je Windows Phone 7 project. Deze assembly kan gevonden worden onder C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.0\Toolkit\Sep10\Bin.

De volgende stap is het in gebruik nemen van de zogenaamde GestureService. Deze dient te worden geplaatst op de control waar de gestures  worden uitgevoerd. Dit kan natuurlijk ergens in een user control zijn. Het is hierbij wel belangrijk om alert te zijn op het feit dat de gestures die zelf worden afgevangen, niet in de weg gaan zitten met de gestures die al aanwezig zijn in de Pivot en Panaroma controls. Het advies is eigenlijk om de Pan en Flick gestures niet te gebruiken binnen de Pivot en Panaroma.

In onderstaand voorbeeld wordt de GestureService gekoppeld aan een border. Alle events die beschikbaar zijn worden gekoppeld, zodat deze in code kunnen worden afgevangen. Natuurlijk worden normaal gesproken niet alle events gekoppeld, maar slechts de events die van toepassing zijn op dat moment.

<Border>
    <toolkit:GestureService.GestureListener>
        <toolkit:GestureListener
            Tap="GestureListenerTap"
            DoubleTap="GestureListenerDoubleTap"
            Hold="GestureListenerHold"
            Flick="GestureListenerFlick"
            DragStarted="GestureListenerDragStarted"
            DragDelta="GestureListenerDragDelta"
            DragCompleted="GestureListenerDragCompleted"
            PinchStarted="GestureListenerPinchStarted"
            PinchDelta="GestureListenerPinchDelta"
            PinchCompleted="GestureListenerPinchCompleted" />
    </toolkit:GestureService.GestureListener>
    <TextBlock x:Name="GestureTextBlock"
                Text="Perform any gesture here"
                HorizontalAlignment="Center"
                TextWrapping="Wrap" />
</Border>

In dit voorbeeld worden de event-gegevens in de GestureTextBlock geplaatst.

private void GestureListenerTap(object sender, GestureEventArgs e)
{
    GestureTextBlock.Text = string.Format("Tap");
}

private void GestureListenerDoubleTap(object sender, GestureEventArgs e)
{
    GestureTextBlock.Text = string.Format("DoubleTap");
}

private void GestureListenerHold(object sender, GestureEventArgs e)
{
    GestureTextBlock.Text = string.Format("Hold");
}

private void GestureListenerFlick(object sender, FlickGestureEventArgs e)
{
    GestureTextBlock.Text =
        string.Format("Flick: Direction={0}, Angle={1}, HorizontalVelocity={2}, VerticalVelocity={3}",
                        e.Direction,
                        e.Angle,
                        e.HorizontalVelocity,
                        e.VerticalVelocity);
}

GPS

GPS, hoewel, eigenlijk gaat het om de Location Service. De Location Service API ondersteunt naast GPS ook via Wi-Fi en cell-data voor locatiegegevens. Afhankelijk van de gewenste precisie kiest de Location Service voor GPS bij hoge precisie en cell-data bij lage precisie. Dit is van belang wegens het stroomverbruik, welke zo optimaal mogelijk dient te zijn. Maar daarnaast zal in een gebouw geen GPS signaal ontvangen kunnen worden, terwijl de cell-data wel beschikbaar is. Wanneer het alleen van belang is om te weten in welke stad de telefoon zich bevindt, zal het GPS signaal niet nodig zijn.

Aan het project dient een referentie naar de System.Device assembly te worden toegevoegd. De precisie wordt opgegeven in de constructor van GeoCoordinateWatcher class, GeoPositionAccuracy.Default of GeoPositionAccuracy.High. Daarnaast zijn er twee events die van belang zijn, natuurlijk de PositionChanged voor het ontvangen van nieuwe coordinaten, maar ook de StatusChanged welke bij verandering in status wordt aangeroepen. Bij het gebruik van de GPS kan het soms even duren voordat er een zogenaamde fix is.

private void StartGeoLocationService()
{
    _geoCoordinateWatcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default);
    _geoCoordinateWatcher.PositionChanged += OnPositionChanged;
    _geoCoordinateWatcher.StatusChanged += OnStatusChanged;
    _geoCoordinateWatcher.Start();
}

private void OnStatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
{
    string status = e.Status.ToString();
}

private void OnPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
    string values = string.Format("Timestamp {0}:Lat={1},Lon={2}",
                                    e.Position.Timestamp,
                                    e.Position.Location.Latitude,
                                    e.Position.Location.Longitude);
}

Het is niet ideaal om tijdens het debuggen buiten een afstand te moeten afleggen om GPS data binnen te krijgen. Daarom zijn er verschillende initiatieven om hierbij te helpen, zoals een Mock (#3) waarbij een statische lijst van coördinaten wordt gebruikt. Maar de echt ideale Simulatie/Mock (#4) laat een kaart zien waarop je de locatie kunt aangeven welke dan wordt doorgegeven aan de telefoon.

Proximity sensor

Wat zou het mooi zijn, je legt de telefoon neer, en automatisch pauzeert het spel. Of je legt de telefoon tijdens een gesprek op tafel en hij gaat automatisch op de speaker. Okay, dat is een droom, voorlopig althans. Tijdens een gesprek zal het beeldscherm wel uitgaan, maar zodra je de telefoon van je oor haalt verschijnt het scherm zodat je het telefoongesprek kunt beëindigen. Erg handig want zo druk je niet per ongeluk het gesprek weg met je oor. Nu moeten we nog wel wachten tot dat hier een API voor beschikbaar wordt gesteld.

Kompas

Naast een GPS zal de telefoon een kompas bevatten. De eerste versie van de software zal geen API beschikbaar hebben om het kompas uit te lezen. Echter, met het uitlezen van de GPS en vorige GPS resultaten kun je ongeveer de richting bepalen. Dit benadert misschien de benodigde precisie van het kompas.

Lichtsensor

De lichtsensor die in de telefoon zit wordt gebruikt om de helderheid van het scherm in te stellen. Er zijn erg leuke toepassingen te bedenken zoals een spel waarin bepaalde delen van een level alleen zichtbaar worden in het donker. Helaas is er geen API beschikbaar gesteld om de licht intensiteit uit te lezen

Accelerometer

De mogelijkheid om beweging te detecteren is al een aantal jaren standaard aanwezig op smart phones. Iedereen heeft wel eens een applicatie gezien voor een smart phone waar met de telefoon geschud moet worden. Maar ook serieuze toepassingen, waarbij de applicatie in een andere modus wordt getoond zodra de telefoon in “landschaps” modus wordt geplaatst als deze gedraaid wordt.Dit concept wordt in veel plaatsen toegepast in de Windows Phone 7 software. Bijvoorbeeld in de e-mail applicatie en internet browser.

Deze functionaliteit ondersteunen in een eigen applicatie is erg eenvoudig. Althans, het is natuurlijk wel van belang om na te denken over de layout van de applicatie in landschapsmodus, niet iedere portretlayout is ook geschikt voor de landschapsmodus. Ondersteuning van de verschillende orientaties kan aangezet worden op een PhoneApplicationPage in xaml. Zet hiervoor de SupportedOrientation property op PortraitOrLandscape. Daarnaast heeft de PhoneApplicationPage een event OrientationChanged welke afgaat bij verandering van oriëntatie.

<phone:PhoneApplicationPage SupportedOrientations="PortraitOrLandscape"
                            Orientation="Portrait"
                            OrientationChanged="OnOrientationChanged">

Voor zaken als schud-detectie is de ruwe Accelerometer data nodig. Het is hierbij zaak om het ReadingChanged event van de Accelerometer af te vangen en de sensor te starten. Het ReadingChanged event wordt niet in de User Interface thread uitgevoerd.

private void StartAcceleroMeter()
{
    _accelerometer = new Accelerometer();
    _accelerometer.ReadingChanged += OnReadingChanged;
    _accelerometer.Start();
}

void OnReadingChanged(object sender, AccelerometerReadingEventArgs e)
{
    if(!Dispatcher.CheckAccess())
        Dispatcher.BeginInvoke(()=>OnReadingChanged(sender,e));
    else
    {
        string values = string.Format("Timestamp {0}:X={1},Y={2},Z={3}",
            e.Timestamp,
            e.X,
            e.Y,
            e.Z);
    }
}

In de emulator komen geen nuttige gegevens terug. Testen op een telefoon is dus een vereiste. De Windows Phone 7 community (#5) heeft daarnaast een oplossing gebouwd, waardoor met behulp van een WiiMote nuttige Accelerometer data gegenereerd kan worden.

Referenties

# 1 Silverlight Toolkit for Windows Phone - http://silverlight.codeplex.com/releases/view/52297
# 2 Simulating multitouch on the Windows Phone 7 emulator - http://jonas.follesoe.no/SimulatingMultitouchOnTheWindowsPhone7Emulator.aspx
# 3 Mock Location APIs - http://blogs.msdn.com/b/ptorr/archive/2010/03/25/mock-location-apis-from-my-mix10-talk.aspx
# 4 Simulating and Mocking Location Data in the Windows Phone 7 Emulator - http://blogs.msdn.com/b/mikeormond/archive/2010/08/18/simulating-and-mocking-location-data-in-the-windows-phone-7-emulator.aspx
# 5 Simulating accelerometer data in the Windows Phone 7 emulator - http://blogs.silverarcade.com/silverlight-games-101/27/silverlight-simulating-accelerometer-data-in-the-windows-phone-7-emulator/

Geef feedback:

CAPTCHA image
Vul de bovenstaande code hieronder in
Verzend Commentaar