Facebook RSS Feed
 

.NET Micro Framework: WPF Uygulamalarında Multi-Touch Kullanımı

Grafiksel uygulamalarda kullanıcı girişini yakalamanın interaktif yollarından biri de dokunmatik ekran kullanımıdır. Micro Framework'ün sağladığı Touch sınıfı sayesinde parmak yada kalem ile ekrana temas noktalarını yakalayabiliyoruz. Örnek uygulamamızda bu temas noktalarını yakalamayı ele alacağız.

Dokunmatik Panellerin Çalışma Mantığı

Dokunmatik panel uygulamaları hem simulatör hem de fiziksel cihaz üzerinde kapasitif yada resistive paneller üzerinde çalışabiliyor. Temas algılanması donanımın native sürücülerini kullanarak yada managed sürücü ile sağlanabiliyor.

LCD panel üzerine yerleştirilen ince bir film, temas noktalarını algılayarak mikrodenetleyiciye analog değer döndürür. Resistive filmlerde dikey ve yatay olarak ölçüm yapılır. Üstüste iki film birbirine değmeyecek şekilde yerleştirilmiştir. Parmak yada kalemle baskı yapıldığı bölgede bu iki film birbirine değerek kenarlardan uzaklığa göre bir direnç değeri kazanır. Bu değerler ölçülerek yatay ve dikey temas noktaları hesaplanır.

Kapasitif yöntemde ise insan vücüdunun elektriği algılanarak temas noktası bulunur. Bu nedenle kapasitif panellere yazı yazmak için özel bir kalem gereklidir ve eldivenle çalışmazlar. Laptoplarımızın touchpadleri kapasitif yönteme örnektir, yalnızca vücutla temas ederek çalışırlar. Gelişmiş kapasitif paneller multi-touch özelliği de sağlamaktadır.

.NET Micro Framework, tüm bu yöntemleri destekler. Panele temas anında hareket durumunda ve temas sonunda tetiklenen eventler ile temas noktası değerlerine ulaşılır. Örnek uygulamamızda hem simulatör hem de fiziksel cihaz üzerinde çalışabilecek bir uygulama geliştireceğiz. Bu uygulama, temas noktalarını Visual Studio'ya debug mesajı olarak gönderecek.

Uygulama Kodları

Visual Studio üzerinden yeni bir .NET Micro Framework Window Application oluşturalım. Proje referansları arasına "Microsoft.SPOT.Touch.dll" 'i ekleyelim. Ardından Program.cs dosyamızın içeriğini örnekteki gibi modifiye edelim:

Program.cs

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Input;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;
using Microsoft.SPOT.Touch;
 
namespace MF_WPF_Touch
{
    public class Program : Microsoft.SPOT.Application
    {
        public static void Main()
        {
            Program myApplication = new Program();
            Window mainWindow = myApplication.CreateWindow();
 
            // Touch verisinin toplanma metodunu belirleyelim (Native sürücü yada Managed):
            TouchCollectorConfiguration.CollectionMethod = CollectionMethod.Native;
 
            // Touch verisinin toplanma modunu belirleyelim
            // (InkOnly, GestureOnly yada InkAndGesture):
            TouchCollectorConfiguration.CollectionMode = CollectionMode.InkAndGesture;
  
            // Touch özelliğini başlatalım:
            Touch.Initialize(myApplication);
 
            myApplication.Run(mainWindow);
        }
 
        private Window mainWindow;
 
        public Window CreateWindow()
        {
            // Ekran çözünürlüğünde bir Window objesi oluşturalım:
            mainWindow = new Window();
            mainWindow.Height = SystemMetrics.ScreenHeight;
            mainWindow.Width = SystemMetrics.ScreenWidth;
 
            // Dokunmatik panel eventlerini oluşturalım:
            mainWindow.TouchDown += new TouchEventHandler(mainWindow_TouchDown); // Temas
            mainWindow.TouchUp += new TouchEventHandler(mainWindow_TouchUp);     // Serbest
            mainWindow.TouchMove += new TouchEventHandler(mainWindow_TouchMove); // Hareket
 
            // Ekran nesnelerini tutacak bir panel oluşturalım:
            Panel panel1 = new Panel();
 
            // Small yazı tipiyle uygulama başlığını yazdıralım:
            Text yazi1 = new Text(Resources.GetFont(Resources.FontResources.small),
                "MF Dokunmatik Panel Uygulamasi");
 
            // Yazdığımız yazıyı panelin alt elemanı olarak ekleyelim:
            panel1.Children.Add(yazi1);
 
            // Paneli Main Window'un alt elemanı olarak ekleyelim:
            mainWindow.Child = panel1;
 
            // Pencereyi görünür yapalım:
            mainWindow.Visibility = Visibility.Visible;
 
            return mainWindow;
        }
 
        // Panele temas edilmesi halinde fırlayacak event:
        void mainWindow_TouchDown(object sender, TouchEventArgs e)
        {
            // Temas koordinatlarını yazdıralım:
            Debug.Print("Touch down - x: " + e.Touches[0].X + ", y: " + e.Touches[0].Y);
 
            // Touch yakalama modunu belirleyelim:
            TouchCapture.Capture(mainWindow, CaptureMode.Element);
        }
 
        // Panelden temas kesildiğinde fırlayacak event:
        void mainWindow_TouchUp(object sender, TouchEventArgs e)
        {
            // Temas kesilmeden önceki son aktif koordinatları yazdıralım:
            Debug.Print("Touch up - x: " + e.Touches[0].X + ", y: " + e.Touches[0].Y);
 
            // Temas alanının genişlik ve yüksekliğini yazdıralım:
            Debug.Print("Temas alanı - Genislik: " + e.Touches[0].ContactWidth.ToString() + 
                ", Yukseklik: " + e.Touches[0].ContactHeight.ToString());
 
            // Touch yakalama modunu belirleyelim:
            TouchCapture.Capture(mainWindow, CaptureMode.None);
        }
 
        // Panel üzerinde temas sürdükçe ve hareket ettikçe fırlayacak event:
        void mainWindow_TouchMove(object sender, TouchEventArgs e)
        {
            // Temas koordinatlarını yazdıralım:
            Debug.Print("Touch move - x: " + e.Touches[0].X + ", y: " + e.Touches[0].Y);
        }
    }
}

Uygulamayı çalıştırdığınızda, simulatör veya fiziksel cihazın ekranına dokunarak Visual Srudio Output penceresinden pozisyon bilgisine ulaşabilirsiniz.

Visual Studio Output Window

Touch down - x: 53, y: 65
Touch move - x: 53, y: 65
Touch move - x: 64, y: 67
Touch move - x: 176, y: 113
Touch up - x: 269, y: 164
Temas alanı - Genislik: 0, Yukseklik: 0

Notlar

TouchDown ve TouchUp eventlerinde Touches dizisi tek TouchInput döndürecektir. Yani multi-touch özelliği yalnızca TouchMove eventinde Touches dizisi içerisinden erişilebilir. Örnek kullanım:

e.Touches[1].X

Uygulamanızdaki çeşitli UIElementlerine touch özelliği kazandırmak ve hangisinin seçildiğini algılamak için bu elementlerin herbirine Touch eventlerini bağlamalısınız. Bu durumda temas işlemi en üstteke UIElement tarafından yakalanacaktır.

Uygulama kodlarını buradan indirebilirsiniz.




 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi