29 Aralık 2015 Salı

Android GifView

Öncelikli github linkini vereyim sonra biraz açıklamaya çalışayım. 
https://github.com/Cutta/GifView

Android için gif oynatmanın bir kaç yolu mevcut ancak en sağlıklı bulduğum bu yöntemi biraz sadeleştirerek sunmak istedim. Bu yöntemde gif lerimizi androidin bize sağladığı Movie class ının yardımıyla oynatacağız.
GifView.java classından biraz bahsetmem gerekirse. Asıl işin burada döndüğünü kodlara bakınca da anlayacaksınız. Gif oynatma, durdurma, kaynağını belirleme, boyutlandırma gibi işlemlerin hepsi bu sınıfta meydana geliyor.Bu sınıf ise View classından extend ediliyor.
 Gifleri frame frame gösterebilmek için çalıştığımız class ise yine androidin bize sunduğu  Canvas classı. Aslında yaptığımız şey Movie classına gifin her sahnesini canvas vasıtası ile iletmek ve oluşan görüntüyü View classından extend ettiğimiz için override edebildiğimiz onDraw metodunda  "al bunu göster" diyebilek olarak özetlenebilir.
Umarım işinize yarar.




17 Aralık 2015 Perşembe

Android EventBus Nedir?


       EventBus proje içerisinde olayları(event) rahatlıkla yakalayabilmemiz için geliştirilmiş bir kütüphane.
        Fragment, Activity, Thread, Service vb sınıflar arasında kolayca parametre akışı sağlamamıza yardımcı olur. Eski usül yöntem ile, Java' nın bize sağladığı interface ile bunu yapmak mümkün evet. Yani bir fragmentte tetiklenen bir olay başka bi event ya da activityde interface'ı implement ettiğimiz taktirde yakalanabilir. Ancak bunun olumsuz yanı kodu okunabilirlikten çok uzak kılıyor ve yeni bir şeyler yapmak istediğinizde iş gerçekten karışıyor. Böyle düşünen yalnızca ben değilmişim ki 7 bin üzerinde star alan GreenRobot EventBus  kütüphanesi ve tabi ki olmazsa olmaz Square şirketinin Otto kütüphanesi epey popüler.
        Kullanım açısından ikisi neredeyse aynı diyebiliriz ancak aşağıdaki karşılaştırma tablosunun bize söyleyecekleri var :)
                       

        Kullanımından da biraz bahsedecek olursam.
        Her olaya özgü Event classları oluşturuyoruz. Bu classları özel kılan bi durum yok. Normal değişkenler ve setter getter methodları olan bir class düşünebiliriz.
        Olayın meydana geldiği fragment ya da activity de olayın meydana geldiğini tek satırda söylüyoruz.

   EventBus.getDefault().post(new ActivityEvent("Event sent by MainActivity"));

        Bu satırda anlatılmak istenen gelinen satırda ActivityEvent olayının meydana geldiği.
        Bu olayı başka bi sınıfta yakalamak istiyorsak öncelikle olayları yakalamak istediğimizi söylüyoruz. Yani register işlemi. Bu işlemi fragment, activity ya da service sınıflarında onCreate methodlarında yerine getiriyoruz. Bu işlem de yalnızca tek satır.

  EventBus.getDefault().register(this);

        Aynı şekilde işimizin bittiğini ve artık olaylardan haberdar olmak istemediğimizi de söylememiz gerekiyor. Bunu da onDestroy methodunda yerine getiriyoruz.
@Overrideprotected void onDestroy() {
    EventBus.getDefault().unregister(this);    super.onDestroy();}
        Şimdi gelelim olayı yakaladığımız yere. Bunun için olayı yakalamak istediğimiz yerde onEvent adlı methodlar oluşturmamız gerekiyor ve bu methodlara hangi olaylarla ilgileniyorsak onu parametre olarak vermemiz gerekiyor. Yani birden fazla olaylı yakalayabiliriz.
public void onEvent(ActivityEvent event) {

    ...
}
        Kullanımı gerçekten çok çok kolay.
        Buradaki anlatım eksik ya da karışık gelmiş olabilir. Örnek proje Github' da mevcut. Oradan clonelayıp inceleyebilirsiniz.
        https://github.com/Cutta/EventBusSample
        Kolay gelsin.

27 Eylül 2015 Pazar

Adroid TagView





Öncelikle github linkini vereyim sonra hemen konuya başlayalım.

Android için tag görünümü gereken bir uygulama üzerinde çalışırken  bazı benzer kütüphaneleri harmanlayarak yeni bir repo oluşturdum. Harmanlama ihtiyacım şu yüzden oldu.
Taglerin silinebilmeleri gerekiyordu ve benim ilk kullandığım kütüphanede bu özellik mevcut değildi. Bu özelliğin mevcut olduğu kütüphanede de onaylama mekanızması yoktu yani silmeye yanlışlıkla basınca geri dönüşü olmuyordu.
Biraz araştırınca işime yarar görünüme ve işleve kavuşturabildim. Umarım sizlerin de işine yarar.


25 Haziran 2015 Perşembe

Android Double Tap To Like (Çift Dokunma-Beğnme)


Öncelikle github linkine buradan ulaşabilirsiniz: https://github.com/Cutta/Double-Tap-To-Like
Türkçe olarak tam karşılığını bulamasam da "beğenmek için çift dokuma" demek istiyorum.
Instagram'dan sonra ondan etkilenen uygulamalarda da görebileceğimiz üzere iki kere artarda tıklama ve beğeni aksiyonunun android için uyarlanmış basit bir örnek kodunu yazdım.


Üzerinde çalıştığımız bir projede gereken bu durum için önce iki defa tıklama durumunu tespit ettik.
Bu durumu Android' in bize sağladığı GestureDetector sınıfı ile çözdük. Bundan sonraki aşama da Instagram' daki gibi kalp animasyonu ile kullanıcıya beğendiğini anlatabilmekti.
Bunu da yine Androidin bize sağladığı  Animation  sınıfı  ile çözüme kavuşturduk.
Senaryoya göre kullanıcı resime iki defa tıklayacak ve animasyonumuz ekranda oynayarak kullanıcıya beğendiğini anlatacak. Instagram kullananlar zaten yakından bilir, kullanmayanlar da aşinadır eminim, zira ben kullanmıyorum ama biliyorum =)

Bu özellik diğer uygulamlarda da karşımıza çıkıyor ve standartlaşmak üzere bir yolda ilerliyor. Eskiden iki tıkla resim yaklaştırılırdı ama artık insanlar diğer uygulamalar da dahi temkinli oluyorlar "iki defa tıklarsam beğenir mi acaba?" diye kafalarında soru oluşabiliyor.

Bu durumu özetleyen, içinde basit bir resim galerisi barındıran bir yardımcı proje oluşturdum.
Projeye aşağıdaki linkten ulaşabilirsiniz. İndirdikten sonra import ederek çalıştırabilirsiniz
https://github.com/Cutta/Double-Tap-To-Like

13 Mayıs 2015 Çarşamba

Android Blur Resim Oluşturma (blur - image)

Şimdiye kadar üzerinde çalıştığım projeler arasında bir kaç kere blur görüntülerle uğraşmak zorunda kaldım. Bir çok metodunu buldum aslında ama kulağı ters taraftan tutmak vardır ya öyle yapmışlar gibi geldi bana =) Özellikle ilk defa blurlama işlemi ile uğraştığımda android geliştirmede yeniydim ve epey zorlanmıştım açıkçası. İkinci sefer karşılaştığımda o kadar zorlanmadım ama yine de uzun bir metoddu, Kod düzenime uymuyordu ve hakim olamıyordum kodlara tam manasıyla. Uğraşırken farklı örneklerde aslında özde aynı şeylerin yapıldığını gördüm bunları biraz derledim açıkçası ben de.
Androidde var olan şu kütüphaneleri kullanarak işlemlerimi gerçekleştiriyorum.

android.renderscript.RenderScript ,
 android.renderscript.ScriptIntrinsicBlur.
Kullandığım iki metodda blurluğun seviyesini  blur.setRadius(20.0f); satırında belirliyorum. Bu float değer 0 ile 25 değeri arasında kabul ediliyor sadece buna dikkat etmek lazım. Kodları indirmek istemeyen olursa kısaca burda örnek kodu yazayım.
İndirmek isteyenelr için link: https://github.com/Cutta/Simple-Image-Blur

imageview = (ImageView) itemView.findViewById(R.id.imageView); BitmapDrawable drawable = (BitmapDrawable) imageview.getDrawable();// var olan resmimizi bitmape ceviriyoruz Bitmap bitmap = drawable.getBitmap(); Bitmap blurred = blurRenderScript(bitmap, 20);//blurlanacak resmi ve, blur miktarini yolluyoruz imageview.setImageBitmap(blurred);// donen blur resmi ekranda gosteriyoruzz
@SuppressLint("NewApi")
private Bitmap blurRenderScript(Bitmap smallBitmap, int radius) {
try {
smallBitmap = RGB565toARGB888(smallBitmap);
} catch (Exception e) {
e.printStackTrace();
}
Bitmap bitmap = Bitmap.createBitmap(
smallBitmap.getWidth(), smallBitmap.getHeight(),
Bitmap.Config.ARGB_8888);
RenderScript renderScript = RenderScript.create(context);
Allocation blurInput = Allocation.createFromBitmap(renderScript, smallBitmap);
Allocation blurOutput = Allocation.createFromBitmap(renderScript, bitmap);
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(renderScript,
Element.U8_4(renderScript));
blur.setInput(blurInput);
blur.setRadius(radius); // radius must be 0 < r <= 25
blur.forEach(blurOutput);
blurOutput.copyTo(bitmap);
renderScript.destroy();
return bitmap;
}
private Bitmap RGB565toARGB888(Bitmap img) throws Exception { int numPixels = img.getWidth() * img.getHeight(); int[] pixels = new int[numPixels];
//Get JPEG pixels. Each int is the color values for one pixel. img.getPixels(pixels, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight()); //Create a Bitmap of the appropriate format. Bitmap result = Bitmap.createBitmap(img.getWidth(), img.getHeight(), Bitmap.Config.ARGB_8888); //Set RGB pixels. result.setPixels(pixels, 0, result.getWidth(), 0, 0, result.getWidth(), result.getHeight()); return result; }






19 Şubat 2015 Perşembe

Android Çoklu Resim Seçme


Bu sıralar üzerinde çalıştığım projede çoklu resim seçme gibi bir özelliğin olması gündeme geldi. Android' de galeriden ya da kameradan seçenekleriyle kullanıcıya resim seçtirebiliyoruz evet ama bu işlemin sonucu bize tek bir resim dönüyor. Galeriden tek seferde bir çok resim seçebilmek için şu şekilde bir çözüm düşündüm:
 Telefon hafızasındaki tüm resimleri çekip kendi oluşturduğum gridview gömerek kullanıcıya bu resimleri gösterebilmeliydim.
GridView' in her elemanına bir checkBox koyarak kullanıcının seçeceği resimleri işaretlemesini sağlamalıydım.
Seçtiğim resimlerden dönen yolları (paths) Universal Image Loader kütüphanesi sayesinde imageviewlere verip ekranda seçilen resimleri göstermeliydim.

Tüm resimleri hafızadan alabilmek için READ_EXTERNAL_STORAGE iznine gerek duyuyoruz.
Manifestte isteklerimize cevap alabilmek için oluşturduğumuz özel Activity' i intent filter özelliği ile filtreden geçiriyoruz.


           <intent-filter>
               <!-- For recognation our request type-->
              <action android:name="cunoraz.ACTION_PICK" />
              <action android:name="cunoraz.ACTION_MULTIPLE_PICK" />

               <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

Activity' mizi tek resim seçmek üzere çağırırken

Intent i = new Intent(Action.ACTION_PICK);
startActivityForResult(i, 100);

çoklu resim seçmek için çağırırken
Intent i = new Intent(Action.ACTION_MULTIPLE_PICK);
startActivityForResult(i, 200);

şeklinde kullanmamız yeterli olacaktır. Dönen resimlerin üzerlerine tıklayarak dosya dizinlerini de görebilirsiniz.
Projenin detaylarına buradan ulaşabilirsiniz.
https://github.com/Cutta/MultipleImagePicker
Herkese kolay gelsin.

14 Şubat 2015 Cumartesi

Android FusedLocationApi Kullanımı

    Google' ın cihaz kordinatlarını daha keskin belirleyebilmek üzere sunduğu yeni servisi:  FusedLocationApi. Bu servis GoogleApiClient ile bağlanarak mümkün olan en iyi lokasyon bilgisini veriyor. Örneğe geçecek olursak.

1. Google Play Services indirme ve import etme

FusedLocationApi çalışabilmek için Google Play Services hizmetlerine ihtiyaç duyuyor. Eğer daha önce indirmediysek:

1. SDK Manager sekmesini açın ve  Extras kısmından Google Play services' i indirin.
2. Eclipse' te   File => Import => Android => Existing Android Code Into Workspace 
olunu izleyerek 
android-sdk-windows\extras\google\google_play_services\libproject\google-play-services_lib  dizinindeki projeyi Eclipse' e dahil ediyoruz.
3. Projemizin play services hizmetlerinden faydalanabilmesi için Google Play services' i projemize göstermemiz gerekiyor. Projeye sağ tıklayıp proporties  ardından Android sekmesinde Add.. butonuna tıkladığımızda google-play-services_lib  projesine tıklayıp onaylayarak projemize Google Play hizmetlerini dahil ediyoruz.

Projenin kodlarına bu adresten ulaşabilirsiniz.
https://github.com/Cutta/FusedLocationApi_Example



11 Ocak 2015 Pazar

Ruby PDF Oluşturma

Ruby de dosya işlemleri ile txt oluşturmak, yazmak, okumak oldukça kolay. Pdf oluşturabilmenin bir yolu var mı diyerek bir soruyla yola çıktım ve prawn kütüphanesini keşfettim. Bu kütüphane bu işi layıkıyla yerine getiriyor. Dökümanı incelediğimizde pdf ortamında olması gereken bir çok özellik bize sunuluyor. Örneğin pdf' te resim gösterme, tablolar oluşturma, şekiller çizme (kare,üçgen, yıldız gibi), grafikler çizme işlemleri prawn sayesinde mümkün.
 Ben bir kaç özelliği harmanlayıp basit bir Cv oluşturan Ruby kodu yazdım.
Kodlara ve açıklamalara bu linkten ulaşabilirsiniz.

https://github.com/Cutta/RubyPdfCv

Bu da ekran görüntüsüdür. Kolay gelsin herkese.