Android Çizim İşlemleri

Android çizim işlemleri için Canvas isimli bir sınıf kullanılmaktadır. Canvas sınıfı tipik olarak bir Bitmap ile yaratılır ve bu Bitmap içerisinde çizim yapılır. Çizim işlemleri için Canvas sınıfının drawXXX metotları kullanılmaktadır. Bu metotlar temel şekillere ilişkin çizim işlemlerini yaparlar. Çizim işlemlerine ilişkin metotlar şeklin durumua göre çeşitli parametreler almaktadır, örneğin drawRect metotları çizecekleri dikdörtgen bilgisini Rect veya RectF isimli sınıf yardımıyla almaktadırlar.

Draw metotları çizim yapıcakları paint bilgisini de alırlar. Rect ve RectF sınıfları dikdörtgeni sol üst ve sağ alt köşelerinin koordinatlarını sırasıyla (left, top) ve (right, bottom) şeklinde tutarlar.

Rect sınıfı elemanları int türden, RectF sınıfı ise Float türden tutar.

Örn: Bir butona basıldığında kırmızı zemin üzerine mavi kalemle rastgele bir dikdörtgen aşağıdaki gibi yapılır;

109-RandomDrawRect

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ğrı ç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