Android Dokunma İşlemleri

Viewlar dokunmayı algılayacak şekilde tasarlanmıştır. Bir View'ın dokunmayı algılaması için onTouchListener arayüzünü implemente eden bir metot yazması gerekmektedir. onTouchListener arayüzünün onTouch() isimli metodu bize dokunmaya ilişkin çeşitli bilgiler vermektedir. Örneğin hangi koordinatlara basıldı, hangi event geldi. Buna göre bir View'a dokunulduğunda dokunulduğu anda ismine ACTION_DOWN denen bir sabitle belirlenmiş bir event tetiklenmektedir. Buna göre kullanıcı dokunmayı bıraktığında ACTION_UP isimli bir sabit ile event tetiklenmektedir, dokunma devam ederken View üzerindeki devamlı dokunma hareketinde ACTION_MOVE isminde bir event tetiklenmektedir.

110-TouchEvents

  • onTouchListener arayüzünün geri dönüş değeri bir event oluştuktan sonra peşpeşe başka eventlerde oluşturulucaksa true geçilmelidir. Örneğin DOWN isimli sabitle gönderilen EVENT'ten sonra MOVE takip edilecekse bu durumda onTouch() true döndürülmelidir, aksi durumda ACTION_DOWN alınacak fakat MOVE takip edilemeyecektir.

  • onTouch() metodunun MotionEvent parametresi event'e ilişkin çeşitli bilgileri döndüren sınıf referansıdır.

  • MotionEvent sınıfının getAction() metodu ile hangi işleme ilişkin Action elde edildiği bilgisi alınabilir.

  • MotionEvent sınıfının getX() ve getY() metotları dokunmanın hangi koordinatta olduğunu döndürmektedir. getX ve getY metotlarının parametresiz olanları tek dokunuş için, pointerIndex parametreli versiyonları ise çoklu dokunma(multi-touch)

  • match_parent özelliğine sahip GUI elemanları boyutlarını çalışma zamanı sırasında alırlar. Dolayısıyla biz bir GUI elemanının boyutunu almak istiyorsak bu işlemin tamamlanmasını beklememiz gerekmektedir. Bu işlem View elemanının gösterilmesi sırasında(boyutlandırılması-inflate) çalışan Thread'e Runnable referansı gönderilerek aşağıdaki biçimde yapılabilir.

m_imageViewView.post(new Runnable() {
            @Override
            public void run()
            {
                m_bitmap = Bitmap.createBitmap(m_imageViewView.getWidth(), m_imageViewView.getHeight(), Bitmap.Config.ARGB_8888);
                m_canvas = new Canvas(m_bitmap);
                m_paint = new Paint();

                m_paint.setColor(Color.BLUE);
                m_paint.setStrokeWidth(10);
                m_imageViewView.setImageBitmap(m_bitmap);
            }
        });

Basit Bir ScrathPath Uygulaması

Bu uygulama şu şekilde yapılmalıdır. ACTION_DOWN içerisinde o anki noktanın koordinatları alınır ve her move içerisinde alınan yeni koordinatlar ile aralarına doğru çizdirilir.

111-ScratchPadBunldeList

Anahtar Not: Bitmap sınıfı Parcelable arayüzünü desteklediği için Bundle sınıfı ile saklanabilir. Fakat bu durumda dikkat edilmesi gereken Yeni boyutlara göre eski Bitmap match_parent yapıldığında sınırlı olacaktır yani yeni boyutlarda görünmesine rağmen çizilemeyen alanlar oluşabilir. Bu duruma dikkat edilmesi gerekir.

112-ScratchPadBundleBitmap