Android Yüzen Nesne (Floating Object)




Android ortamında birçok geliştirme mümkün, Baktığımızda belirli başlı dikkat edilmesi gereken hususlar mevcut. Detay 1-2 noktaya temas edeceği için Yüzen (Floating) nesnelere ilişkin bir örnek vermek oldukça açıklayıcı ve faydalı olur diye düşündüm.
Öncelikle “AndroidManifest” dosyasında MainActivity tanımının hemen altına oluşturacağımız yeni class’ı “service” olarak aşağıdaki şekilde eklememiz gerekir. Aksi takdirde sistem bu class’ı görmezden gelecektir. “FloatingDice” olarak Class’ımızı oluşturduğumuzu düşünürsek aşağıdaki şekilde “</manifest>” hemen üstüne eklenebilir.

<service android:name="com.test.app.FloatingDice" android:exported="true" />

Class’ın içeriğine gelirsek dediğimiz gibi “service” tipinden extend etmemiz gerekecek. İlgili “FloatingDice” kodunu uzunluğu nedeni ile en altta bulabilirsiniz. Ayrıca kodun açıklaması için commentleri referans olarak alabilirsiniz.

Sonrasında gelelim “ManActivity” class’ına “onCreate” method’u içinde aşağıdaki kod ile çalıştırabilirsiniz, bu noktada uygulamanın “onResume”, “onStop” gibi methodlarını kontrol ederek, pencereyi aksiyon bazında görünür kılabilir ya da yok edebilirsiniz.

startService(new Intent(MainActivity.this, FloatingDice.class));
Bu noktada nerde hangi aksiyonu alabileceğinize dair fikriniz olması amacıyla “Application’s life Cycle” şemasına göz atmanızda fayda var. “onResume” benzeri bir method ile uygulama durumunu sorgulayarak aksiyon alabilmek adına aşağıdakine benzer bir kod yazılabilir.

@Override
protected void onResume() {
Bundle bundle = getIntent().getExtras();
if(bundle != null && bundle.getString("LAUNCH").equals("YES")) {
startService(new Intent(MainActivity.this, FloatingDice.class));
}
super.onResume();
}



NOT : Bu kısımda kullandığım şema ve kodun bir kısmı alıntı olmakla birlikte ilaveler mevcuttur.

Yukarıda bahsi geçen "FloatingDice" classına ait kodun tamamına aşağıdan ulaşabilirsiniz.

public class FloatingDice extends Service {

private WindowManager windowManager;
private ImageView chatHead;
private long now;
private long sure;

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

//ImageView objesi ve parametreleri olusturuluyor.
dice = new ImageView(this);
dice.setImageResource(R.drawable.floating);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);

params.gravity = Gravity.TOP | Gravity.LEFT;

//Ekrana basilacak gorselin boyutu aliniyor.
BitmapDrawable bd=(BitmapDrawable) this.getResources().getDrawable(R.drawable.z1);
int iheight=bd.getBitmap().getHeight();
int iwidth=bd.getBitmap().getWidth();

//Ekrana genisligi aliniyor
Display display = windowManager.getDefaultDisplay();
Point size = new Point();
display.getSize(size);

//Mevcut bilgilerle resmin ortalanmasi icin initial konum olusturuluyor.
params.x = size.x / 2 - iwidth;
params.y = size.y / 2 - iheight;

   //Ekrana basilacak obje addView ile görüntülenmesi sağlaniyor.
windowManager.addView(chatHead, params);

try {
dice.setOnTouchListener(new View.OnTouchListener() {
private WindowManager.LayoutParams paramsF = params;
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;

@Override public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
now = System.currentTimeMillis();
// Ekrana Dokunuldugunda objenin ilk konumu aliniyor.
initialX = paramsF.x;
initialY = paramsF.y;
// Ekrana Dokunulan konumu aliniyor.
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
  //Ekran birakildiginda aksiyon alinmamis.
break;
case MotionEvent.ACTION_MOVE:
  //El Hareketi ile birlikte es zamanli olarak dokunma aninda
  //Alinan referans degerlere göre konum bilgisi güncelleniyor.
paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(dice, paramsF);
break;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onDestroy()
{
// Uygulama ile Kapanmasi saglaniyor ancaksadece Destroy durumunda.
super.onDestroy();
if(dice!= null)
windowManager.removeView(dice);
}
}

Yorumlar

Yazılar

Kotlin - 1 - Giriş

Genesys Nuance-ASR Entegrasyonu Port Kullanımı

Kotlin - 5 - Dönüşler ve Atlamalar (Returns and Jumps)