Android Gesture Kullanımı

Aşağıdaki yazı kitabın 2. baskısına ait bir alıntıdır. Devamı ve detayı kitapta yer almaktadır.

Kullanıcının dokunmatik ekranda gerçekleştirdiği ve uygulama tarafından anlamlandırılabilen özel el işaretlerine veya hareketlerine gesture ismi verilir. API-4 ya da Android 1.6 versiyonundan beridir programcıların kullanımına sunulmuş olan bir dizi özellik sayesinde uygulamalarda gesture kullanımı mümkün hale getirilmiştir. Bu konuyla ilgili sıkça kullanılan sınıflar şunlardır :

  • Gesture, GestureStroke, GesturePoint
  • GestureOverlayView
  • GestureLibrary, GestureLibraries
  • Prediction
  • GestureOverlayView.OnGestureListener
  • GestureOverlayView.OnGesturePerformedListener

Bir Gesture nesnesi n tane GestureStroke nesnesinden oluşurken, bir GestureStroke nesnesi de n tane GesturePoint nesnesinden oluşur. GesturePoint sınıfının x, y isimli veri elemanları koordinat bilgilerini temsil etmekte ayrıca timestamp isimli long türdeki elemanı ise zaman bilgisini içermektedir.

Gesture’lar bir binary dosya içerisine kaydedilirler. Bu dosyayı daha doğrusu içerisindeki verileri GestureLibrary sınıfı temsil etmektedir. Bu sınıf türünde bir nesne yaratmak için GestureLibraries sınıfının statik fromXxx() factory metotları kullanılır. Bu metotlar (fonksiyonlar) çeşitli ortamlardaki gesture dosyalarındaki verileri elde etmek için kullanılabilir. Örnekte fromRawResource() kullanılarak bir raw resource haline getirilmiş olan dosyadan gesture’lar alınmaktadır. load() fonksiyonu ise gesture’ların dosyadan yüklenmesini sağlar.

lib = GestureLibraries.fromRawResource(this, R.raw.gestures);

lib.load();

GestureOverlayView sınıfı ise programatik ya da deklaratif olarak kullanılabilen bir tür ui nesnesidir. FrameLayout türevi olan bu sınıfın sıkça kullanılan özellikleri ve anlamları aşağıdaki gibidir:

setOrientation(GestureOverlayView.ORIENTATION_VERTICAL | HORIZONTAL) : Yönelim düşey iken yatay, yatay iken düşey dokunuşların otomatik bir gesture tanımlayıp tanımlamayacağını belirler.

setGestureStrokeWidth(int) : Gesture çizgi kalınlığı.

setBackgroundColor(renk) : Arka plan rengi.

setGestureColor(renk) : Gesture çizgi rengi.

gov.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE | SINGLE) : Tek ya da iki parmakla dokunma davranışını ifade eder.

setEventsInterceptionEnabled(true | false) : Gesture tanımlama (recognition) işlemi sırasında event’lerin engellenip engellenmeyeceğini belirler.

Bu özelliklerin yanı sıra minimal açı, uzunluk gibi eşik değerleri tanımlaya yarayan özellikler de önemlidir.

GestureOverlayView sınıfının içerisinde nested yazılmış olan ve event yakalama amacıyla kullanılan interface’ler de söz konusudur. Örnekte de kullanılmış olan OnGesturePerformedListener interface’i; onGesturePerformed() isimli bir callback fonksiyona sahiptir. Bu fonksiyonun ikinci parametresinde elde edilen Gesture sınıfı türündeki referans, GestureLibrary sınıfının recognize() fonksiyonuna parametre olarak geçilip kullanıcının yaptığı hareketin dosyada mevcut olan hareketlerle karşılaştırılıp tanımlanması sağlanabilir.

Örnek : Aşağıdaki örnek uygulama da bir ham resource haline getirilmiş gesture dosyası içerisinde tanımlanmış gesture’lar ile kullanıcının gerçekleştirdiği hareketler karşılaştırılmakta ve bir eşleşme sağlanırsa gesture ismi ekranda bir Toast ile gösterilmektedir.

public class MainActivity extends AppCompatActivity

{

private LinearLayout root;

private GestureOverlayView gov;

private GestureLibrary lib;

private void init()

{

root = new LinearLayout(this);

root.setOrientation(LinearLayout.VERTICAL);

// Yapılandır

gov = new GestureOverlayView(this);

gov.setOrientation(
GestureOverlayView.ORIENTATION_VERTICAL);

gov.setGestureStrokeWidth(6);

gov.setBackgroundColor(Color.YELLOW);

gov.setGestureColor(Color.GREEN);

gov.setGestureStrokeType(
GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);

gov.setEventsInterceptionEnabled(true);

gov.setLayoutParams(new LinearLayout.LayoutParams(

600,600));

root.addView(gov);

// Kütüphaneyi oluştur ve yükle

lib = GestureLibraries.fromRawResource(
this, R.raw.gestures);

lib.load();

}

private void registerListener()

{

gov.addOnGesturePerformedListener(

new GestureOverlayView.OnGesturePerformedListener()

{

@Override

public void onGesturePerformed(
GestureOverlayView v, Gesture gesture)

{

ArrayList<Prediction> eslesmeler =
lib.recognize(gesture);

for (int i=0; i<=eslesmeler.size()-1; ++i)

{

if (eslesmeler.get(i).score > 1.0)

{

Toast.makeText(MainActivity.this,
eslesmeler.get(i).name,

Toast.LENGTH_LONG).show();

}

}

}

}

);

}

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

init();

registerListener();

setContentView(root);

}

}

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s