How To Change The Screen Brightness


Bu yazı Android cihazlarda ekran parlaklığını programlanabilir bir biçimde değiştirme üzerine olacak. Kullanacağımız tek bileşen ise SeekBar olacak. Öncelikle şunu belirtmek istiyorum, buradaki kod parçası gerçek cihaz üzerinde çalışıyor, yani emülatörde çalışmıyor.  Muhakkak bir yöntemi vardır fakat onu araştırmadım, eğer öğrenirsem mutlaka bir düzenleme yaparım.

Öncelikle ilk bilmemiz gereken şey Android sistem parlaklık değeri sadece sistem arkaplan ışığı açıkken uygulanır. Yani cihazınız uyku durumundayken her hangi bir işlem gerçekleşmez. Bu değer SCREEN_BRIGHTNESS olarak adlandırılır. Dolayısıyla sadece bu değişkene ulaşıp onun değerini değiştirmemiz yeterli olmayacaktır. Bu nedenle geçerli pencere parlaklığına ulaşmamız gereklidir.

Koda geçmeden önce birkaç şeyden bahsedeyim. Bazı bileşenler var LayoutParams gibi. Ve bildiğiniz üzere Android’ te View yapısı şu şekildedir. Burada belirtmek istediğim şey ise LayoutParams birden fazla gruba bağlıdır, yani hem WindowManager’ da vardır, hem de ViewGroup’ da vardır. Benim karşılaştığım problem ise şu oldu: Kodları yazarken gerekli kütüphane dosyası yoksa Eclipse bize import etme seçeneği sunar, tıklarız ve bizim yerimize en üste kendisi ekler. Eğer LayoutParams yazarken import edilmesi gereken kütüphane dosyasını ViewGroup seçerseniz kodunuz hata verecektir. Bu örnekte WindowManager ile işlem yapacağız, dolayısıyla onu seçmelisiniz. Eğer hata alırsanız import edilenleri kopyalayıp yapıştırmanız problemi ortadan kaldıracaktır.

Daha fazla uzatmadan koda geçelim artık 🙂

package com.arifsami.brightness;

import android.app.Activity;
import android.content.ContentResolver;
import android.os.Bundle;
import android.provider.Settings.SettingNotFoundException;
import android.provider.Settings.System;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class Brightness extends Activity {

    // UI objeleri//
    // Seek bar değişkenimiz.
    private SeekBar brightbar;

    // Sistem parlaklığını tutacak olan değişkenimiz.
    private int brightness;

    // Sistem ayarlarını tutmak için content resolver tanımlıyoruz.
    private ContentResolver cResolver;

    // Geçerli ekranla işlem yapmak için window objesi tanımlıyoruz.
    private Window window;

    /** Activity ilk oluşturulduğunda çağırılan yer. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // main.xml dosyasından seek bar' a ulaştık.
        brightbar = (SeekBar) findViewById(R.id.songProgressBar);

        // content resolver' a ulaştık.
        cResolver = getContentResolver();

        // Geçerli ekrana ulaştık.
        window = getWindow();

        // - seek bar ayarları - //
        // 0 ile 255 arasında bir değer verdik, en fazla 225 olabilir!
        brightbar.setMax(255);
        // seek bar değerini 1'er 1'er artırıyoruz.
        brightbar.setKeyProgressIncrement(1);

        try
        {
            // Şu anda geçerli olan ekran parlaklık değerini alıyoruz.
            brightness = android.provider.Settings.System.getInt(
            getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS);
        }
        catch (SettingNotFoundException e)
        {
            // Bizim dışımızda bir hata olması halinde hata kontrolü yapıyoruz.
            Log.e("Error", "Cannot access system brightness");
            e.printStackTrace();
        }

        // seek bar' ın değerini sistem ekran parlaklığından aldığımız değere eşitle.
        // yani ekran parlaklığı neyse o anda seek bar' da görülen değer de odur. %50 ise tam ortada olur gibi.
        brightbar.setProgress(brightness);

        // seek bar' ın her değişimini kontrol ettiğimiz yer.
        brightbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
        {
            @Override
            public void onStopTrackingTouch(SeekBar seekBar)
            {
                // Sistem parlaklığını seek bar' dan gelen parlaklık değeri ile ayarla.
                System.putInt(cResolver, System.SCREEN_BRIGHTNESS, brightness);

                // Parlaklık değişimini ekranda gösteriyoruz.
                // Geçerli window ayarlarını alıyoruz.
                LayoutParams layoutpars = window.getAttributes();
                // Parlaklık değerini ayarlıyoruz.
                layoutpars.screenBrightness = brightness / (float)255;
                // Parlaklık değerini geçerli window' a uyguluyoruz.
                window.setAttributes((android.view.WindowManager.LayoutParams) layoutpars);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar)
            {
            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
            {
                // en küçük parlaklık değerini veriyoruz, değiştirebilirsiniz tabi ki.
                // seek bar değeri 20 veya 20' den düşükse..
                if(progress<=20)
                {
                    brightness=20;
                }
                else // parlaklık 20' den büyükse..
                {
                    brightness = progress;
                }
            }
        });
    }
}

Yukarıda gördüğünüz ekran görüntüsünde seek bar için farklı tasarım mevcut. O şekilde yapmak istiyorsanız custom seek bar yapmamız gerek, şu şekilde:

Bu eklentileri drawable klasörünüzün içine kaydedin.

Daha sonra seekbar_progress.xml adında xml dosyası oluşturun ve içeriği:

<!--?xml version="1.0" encoding="utf-8"?-->
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background"
android:drawable="@drawable/img_seekbar_bg"
android:dither="true">
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<gradient
android:startColor="#80028ac8"
android:centerColor="#80127fb1"
android:centerY="0.75"
android:endColor="#a004638f"
android:angle="270"
/>
</shape>
</clip>
</item>
<item
android:id="@android:id/progress"
android:drawable="@drawable/seekbar_progress_bg"
/>
</layer-list>

Daha sonra da seekbar_progress_bg.xml adında bir xml dosyası oluşturun ve içeriği:

<!--?xml version="1.0" encoding="utf-8"?-->
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<clip>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/img_seekbar_progress_blue"
android:tileMode="repeat"
android:antialias="true"
android:dither="false"
android:filter="false"
android:gravity="left"
/>
</clip>
</item>
</layer-list>

şeklinde olsun.

Tabi unutmadan seek bar özelliklerini de verelim:

<SeekBar
android:id="@+id/songProgressBar"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:layout_marginRight="10dp"
	    android:layout_marginLeft="10dp"
	    android:layout_marginBottom="10dp"
	    android:thumb="@drawable/seek_handler"
	    android:progressDrawable="@drawable/seekbar_progress"
	    android:paddingLeft="10dp"
	    android:paddingRight="10dp" />

Hepsi bu kadar, kolay gelsin 🙂

Reklamlar

24 Eyl 2012 tarihinde Android içinde yayınlandı ve , , olarak etiketlendi. Kalıcı bağlantıyı yer imlerinize ekleyin. Yorum yapın.

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 )

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 )

Google+ fotoğrafı

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

Connecting to %s

%d blogcu bunu beğendi: