Archive for Ders

Swipe özellikli Android uygulaması nasıl yazılır?

Swipe, ekranda sağa yada sola doğru parmak vuruşuna verilen isim. Uygulamalarda ekranlar arasındaki geçiş bu hareketle sağlanabiliyor. Bir çok güncel uygulama bu özelliği kullanıyor. Google+ yada Android Market, bu uygulamalara örnek olarak verilebilir. Yeni Android Design sitesinde Swipe görünümlerinin nasıl uygulanması gerektiği konusunda daha çok bilgi edinilebilir.

Aslında bu görünümün nasıl uygulanacağı konusunda geliştirici blogunda bir yazı yayınlanmıştı ama yeni başlayanlar için biraz daha açıklamalı yazılabileceğini düşündüm.

Örnek Uygulamamızda iki ekran olacak. Her ekranın xml dosyasını normal bir layout olarak hazırlıyoruz.

Ekranları normalde activity ile oluştururduk ama swipe görünümünde aslında tek activty çalışır. Ekranlarımızı bu tek activty içinde gösterebilmek için Android 3.0 ile gelen fragment türünde oluşturmamız gerekiyor. Fragment yine activty’ye benzediği için kullanımında bir sorun olmamalı.

Fragment kullanan uygulamamızın daha eski android sürümlerinde çalışabilmesi için android-support-v4.jar kütüphanesini projemize eklememiz gerekiyor.  Bu kütüphane android sdk içinde  extras dizininde bulunur. Yani eğer sdk dizini /home/w3blog/android-sdks ise kütüphane /home/w3blog/android-sdks/extras içinde olacaktır.  Project->Properties menüsüne tıklıyoruz.

Gelen pencerede Java Build Path->Libraries->Add External Jars butonuna tıklıyoruz ve dosyamızı seçiyoruz.

Artık fragment oluşturulabilir proje içerisinde. Fragment sınıfından kendi ekranlarımızın yer alacağı sınıfları türetmemiz gerekiyor. Fragment görünümü ilk defa onCreateView(LayoutInflater l, ViewGroup v, Bundle b) methodu içersinde oluşturulur. XML dosyası bu method içerisinde kullanılarak bir ekran haline getiriliyor. Bunun için LayoutInflater türünde bir nesne gerekiyor. Inflate’in kelime anlamı şişirmektir. XML dosyası şişirilerek bir ekran haline getiriliyor gibi düşünülebilir.

Ekranlar ayrı ayrı oluşturduktan sonra artık bunların içerisinde çalışacağı activity oluşturulabilir. Bu ekranda sadece fragmentları gösterecek bir ViewPager elemanı bulunacak. Bu eleman ile ekranlarımız arasındaki ilişkiyi FragmentPagerAdapter sınıfından türettiğimiz özel bir adapter ile sağlayacağız. İlk önce activity’i oluşturalım.

Şimdi adapter sınıfımızı oluşturalım. Burada sadece mantığının anlaşılması için uygulamadaki tüm ekranları bir arraylist içerisinde tutan, gerektiğinde ekranları bu arraylist içerisinden alarak kullanan bir adapter kullanıldı ama performans açısından pek sağlıklı bir yöntem değil. Eğer performansın önemli olduğu bir uygulamada kullanılacaksa alternatif uygulamalar araştırmak daha iyi olacaktır.

Bu sınıf her swipe haraketinde gereken ekranı ViewPager elemanına gönderecektir. Adapter sınıfımızı oluşturduktan sonra activty içerisindeki ViewPager ile artık bunu ilişkilendirmek gerekiyor. Bunun için sınıfımız aşağıdaki gibi değiştirilmeli.

Bu son değişiklikle birlikte swipe kullanan basit bir uygulama tamamlanmış oldu. Uygulamanın kaynak kodlarını buradan indirebilirsiniz.

Android uygulamalarında 9 Patch PNG kullanımı

Android cihazların ekran boyutları modelden modele değiştiği için tasarımda belli bir kaliteyi yakalamak için bazı çözümlere başvurmamız gerekir. Örneğin uzunluk birimi olarak px yerine dip yada dp kullanmak bunlardan biridir. Bunlardan bir diğeri ise kullanılacak arkaplan resimlerinin içinde bulunduğu elemana yada ekrana göre boyut değiştirebilecek şekilde ayarlanmasını sağlayan 9 patch png formatının kullanılmasıdır.

9 patch png oluşturmak için gerekli aracı aslında Android geliştirme araçlarıyla birlikte yüklemiştik. draw9patch adındaki araç android-sdks/tools dizini altından bulunabilir.

Eğer bir gnu/linux dağıtımı kullanılıyorsa dosyayı açmak istediğinizde aşağıdaki pencere ile karşılaşacaksınız. Run yada Çalıştır butonuna tıklayın.

Araç açıldıktan sonra arkaplan olarak kullanmak istediniz resmi File->Open 9-patch menüsünden açın. Resminiz açıldığında arkaplanın hem yatayda hemde düşeyde uzatılacak kısımlarını seçmeniz gerekiyor. Seçimi resmin üstünde yada solunda hemen dışında alan seçerek yapabilirsiniz. Seçimi yaparken resmin dışında 1px genişliğinde bir alanı boyayacaktır. İstenirse alttaki Show Patches seçeneği ile seçilen alanlar daha rahat görülebilir. Alan seçildikçe sağ tarafta değişik boyutlandırmalarda resminizin nasıl görüntüleneceği gösterilecektir. Eğer yanlış bir alan seçerseniz shift tuşuna basarak yanlış alanı silebilirsiniz.

Daha sonra resminizi File->Save 9-patch menüsünden kaydedebilirsiniz. Artık resminizi kullanabilirsiniz. Resmin kullanımı normal bir resmin kullanımından farklı olmayacaktır. UNIwifi (eski BUwifi) kaynak kodlarından örnek verirsem /res/drawable/back.9.png resminin arkaplan olarak kullanımı aşağıdaki gibidir.

Burada @drawable/back ile direk resmin referansı verildi ve çerçevedeki siyah kısımlara içerik gelmesinin önlenmesi için 15dp boyutunda bir padding eklendi.

Java ile obeb algoritması

Bu yazıyı birinci sınıfta iken kulüp sitesinde yazmıştım. Site şu an aktif olmadığı için burada yayınlamaya karar verdim.

Genelde herhangi bir programlama diline başlanırken en basit algoritmalar gösterilir ve ödev olarak verilir. Bu örnekte farklı olarak Ayrık Matematik(Discrete Maths) dersinde gösterilen bir algoritma uygulanmıştır.

Verilen iki sayının obebini bulurken, sayıların asal çarpanlarını bulmak yada tek tek başka sayılara bölmek yavaş olabilir. Bu nedenle özel bir algoritma kullanılır. Java kod örneği aşağıda verilmiştir.


import java.util.Scanner;
public class obeb{
        static Scanner sc=new Scanner(System.in);
        public static int sayial(){
                /*kodları tekrar tekrar yazmak yerine fonksiyonumuzu oluşturalım*/
                System.out.println("Lütfen bir sayı girin");
                int a =sc.nextInt();
                return a;
        }
        public static int obeb(int b,int k){
                int d;
                if(k==0){
                        /* küçük sayımız sıfırsa artık obebimizi bulduk demektir*/
                        d=b;
                        return d;
                }
                else{
                        int c=b%k;
                        /*fonksiyonumuz kendini çağıracak
                         * işlemden elde ettiği sayıları
                         * tekrar aynı işlemlerden geçirecek böylece
                         */
                        d=obeb(k,c);
                        return d;
                }
        }
        public static void main(String[] args) {
                int a,b,bsayi,ksayi,obeb;
                a=sayial();
                b=sayial();
                obeb=0;
                bsayi=0;
                ksayi=0;

                /*sayılardan büyük olanı bulalım*/
                if(0<a-b){
                        bsayi=a;
                        ksayi=b;
                }
                else if(0>a-b){
                        bsayi=b;
                        ksayi=a;
                }
                else
                        obeb=a;
                /*obebimizi hesaplayacak fonksiyonu çağıralım*/
                if(obeb!=a){
                        obeb=obeb(bsayi,ksayi);
                }
                System.out.println("girdiğinizi sayıların en büyük ortak böleni = "+obeb);
        }
}

Switch to our mobile site