Touch Screen - czyli dotykowy ekran w Javie

WeeR

W tym artykule zajmiemy się obsługą dotykowych ekranów w telefonach komórkowych. Obsługa tych zdarzeń jest już zaimplementowana w dokumentacji MIDP 1.0 w klasie Canvas, tak więc tworzona aplikacja musi dziedziczyć z tejże klasy :

class TestowyDotyk extends Canvas 
{
}

Aby cała aplikacja działała, nie należy deklarować zbyt wiele bilbiotek, wystarczą standardowe:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*; 

Klasa canvas dostarcza także kilka zdarzeń, dzięki którym będziemy mogli obsłużyć wszelkiego rodzaju akcji, wykonywanych palcem czy rysikiem:

protected void pointerPressed(int x, int y)

To zdarzenie będzie miało miejsce w momencie "przyciśnięcia" rysika do ekranu.

protected void pointerReleased(int x, int y)

Zdarzenie to wystąpi w momencie, gdy "odciśniemy" rysik od ekranu.

protected void pointerDragged(int x, int y)

Powyższe zdarzenie jest generowane w momencie, gdy mamy "przyciśnięty" ekran i poruszyliśmy rysikiem po nim, nie "odciskając" go.

Wszystkie powyższe zdarzenia zwracają współrzędne x oraz y, których wartości odpowiadają aktualnemu położeniu rysika na ekranie.
Jeżeli chcemy zrobić aplikację, zarówno dla telefonów obsługujących dotyk oraz jednocześnie tych nieczułych, przyda nam się również znajomość znajomość dwóch funkcji :

public boolean hasPointerEvents()

Funkcja zwraca wartość true, jeżeli urządzenie obsługuje zdarzenia przyciśnięcia oraz odciśnięcia rysika od ekranu, oraz

public boolean hasPointerMotionEvents()

Funkcja ta zwraca wartość true, jeżeli urządzenie obsługuje zdarzenie przesunięcia rysika po ekranie. Przykładowe użycie dwóch ostatnich funkcji może być następujące :

   if (hasPointerEvents() == true) {
      AplikacjaDotykowa = true;
   } else {
      AplikacjaDotykowa = false;
   }

Lub po prostu:

AplikacjaDotykowa = hasPointerEvents ();

Ostatnią, dosyć ważną kwestią jest to, iż standardowo emulatory Javy nie obsługują ekranów dotykowych. Aby to umożliwić, musimy zmienić pewną wartość. Należy wejść do katalogu, w których mamy zainstalowany emulator telefonu. Ja używam Wireless Toolkit 2.5.2_01 for CLDC, tak więc domyślnie plik konfiguracyjny znajduje się w lokalizacji :

C:\WTK2.5.2_01\wtklib\devices\DefaultColorPhone\DefaultColorPhone.properties

Należy odnaleźć wartość

touch_screen=false;

i zamienić false na true. Aby zmiany odniosły skutek, należy wyłączyć wszystkie włączone emulatory oraz Wireless Toolkit. Po ponownym uruchomieniu, po przejechaniu kursorem myszki nad ekran emulatora powinien pojawić się krzyżyk. To znaczy, że zadziałało.

To cała filozofia. Reszta pozostaje w rękach programisty. Poniżej prezentuje przykładową klasę, która w zasadzie nic nie robi, ale pokazuje działanie zdarzeń:

import javax.microedition.lcdui.*;

class TestowyDotyk extends Canvas {

  String eventType = "Przycisnij ekran!";
  int x;
  int y;

  public void pointerPressed (int x, int y) {
    eventType = "Ekran przycisniety!";
    this.x = x;
    this.y = y;
    repaint ();
  }

  public void pointerReleased (int x, int y) {
    eventType = "Ekran odcisniety!";
    this.x = x;
    this.y = y;
    repaint ();
  }

  public void pointerDragged (int x, int y) {
    eventType = "Rysik przesuniety!";
    this.x = x;
    this.y = y;
    repaint ();
  }

  public void paint (Graphics g) {
    g.setGrayScale (255);
    g.fillRect (0, 0, getWidth (), getHeight ());
    g.setGrayScale (0);
    g.drawString (eventType + " " +x +"/"+y, 0, 0, Graphics.TOP|Graphics.LEFT);
    g.drawLine (x-4, y, x+4, y);
    g.drawLine (x, y-4, x, y+4);
  }
}

1 komentarz

Nie jestem znawcą Javy, ale ten warunek na pewno można uprościć...