Diğer uygulamaların (Facebook'un Sohbet Kafaları gibi) üzerine çizim yapmak için hangi API'lar kullanılır?


226

Facebook Android'de Sohbet Kafalarını nasıl oluşturur? Diğer tüm görünümlerin üstünde kayan görünümler oluşturmak için API nedir?


6
Bu uygulama aynı zamanda "Sohbet Başkanları" play.google.com/store/apps/details?id=com.ninja.sms
Oli


5
Burada bir demo ve basit bir kütüphane bulabilirsiniz: github.com/ericbhatti/floaties Bu kütüphaneyi kullanarak sadece 2 satır kullanarak kayan pencereler oluşturabilirsiniz.
Eric B.

Yanıtlar:


217

Bu :

Uygulamaya, diğer tüm uygulamaların üstünde gösterilen TYPE_SYSTEM_ALERT türünü kullanarak pencere açma izni verir. Çok az uygulama bu izni kullanmalıdır; bu pencereler kullanıcıyla sistem düzeyinde etkileşim için tasarlanmıştır.

Sabit Değer: "android.permission.SYSTEM_ALERT_WINDOW"

// DÜZENLEME: Burada tam kod :

public class ChatHeadService extends Service {

  private WindowManager windowManager;
  private ImageView chatHead;

  @Override public IBinder onBind(Intent intent) {
    // Not used
    return null;
  }

  @Override public void onCreate() {
    super.onCreate();

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

    chatHead = new ImageView(this);
    chatHead.setImageResource(R.drawable.android_head);

    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;
    params.x = 0;
    params.y = 100;

    windowManager.addView(chatHead, params);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    if (chatHead != null) windowManager.removeView(chatHead);
  }
}

Hizmeti bir şekilde başlatmayı unutmayın:

startService(new Intent(context, ChatHeadService.class));

.. Ve bu hizmeti Manifestinize ekleyin.


4
Sanırım daha garip şeyler var. Sürüklenebilirliğin yanı sıra girişi "kafa" dışında tutmaya ne dersiniz? Ben en azından FLAG_NOT_TOUCH_MODAL yanı sıra sürüklerken Pencere özniteliklerini (yani, taşımak) güncellemek için bazı akıllı mantık ihtiyacınız olacağını düşünüyorum .
Delyan

2
nasıl sohbet başlıkları kaldırmak için?
Nirav Mehta

6
Yüzen kullanıcı arayüzü oluşturmak için geliştirdiğim bir SDK'dan bahsetmeye değer olduğunu düşündüm: www.tooleap.com
Arik

@NiravMehta Sohbet kafalarını kaldırabiliyor musunuz?
KK_07k11A0585

Yukarıdaki kod çıktısında dairenin sınırdan biraz boşluğu olduğu için Facebook'ta balonun o boşluğu yok
Hata ayıklayıcı

51

Kural olarak, Android etkinlikleri tam ekran, tüm etkileşimi alan kavramsal olarak ayrılmış kullanıcı arayüzleridir. Bunun birkaç istisnası var. Başlangıç ​​olarak, ekranı doldurmayan açılır iletişim kutuları vardır. Bir diğeri, etkileşimli olmayan bir pop-up olan Android tostudur - ona dokunamazsınız ve denerseniz, altındaki her şeye gider.

Kendi özel kullanıcı arayüzlerinizi de yapabilirsiniz. Görünümleri doğrudan WindowManagerbir tür bayrağı belirterek ekleyebilirsiniz . Chat Heads muhtemelen TYPE_PHONE kullanıyor . Birkaç benzer tür vardır, ancak amaç aynıdır: görünüşe göre ana uygulama olmadan başka herhangi bir şeyin üstünde görünebilen özel amaçlı bindirmeler.

Ancak bu, etkileşimle ilgili sorunlar nedeniyle sizi şimdiye kadar götürüyor. İlk başta, yer paylaşımınız tüm etkileşimi emer, böylece sadece kafa olayları almakla kalmaz, aynı zamanda altındaki her şeyle etkileşimi de engellersiniz.

Bu davranışı LayoutParams kullanarak yapılandırın . FLAG_NOT_TOUCH_MODALgörüntüleme alanınızın dışındaki etkinliklerin temeldeki kullanıcı arayüzlerine gittiği anlamına gelir. Artık işe yaradığını göreceksiniz, ancak geri / menü düğmeleri uygulamalara yönlendirilmiyor, ayrıca klavye yok gibi diğer kötü şeyler hala oluyor. İhtiyacınız olanı çözmek için FLAG_NOT_FOCUSABLE.

Odaklanamayan bitten de bir yan etki elde edersiniz, bu da artık bindirmenizle hoş bir etkileşim olmaz, örneğin düğmeye basma. Yine de, her zaman matematik yapabileceğiniz bazı temel dokunma olayları alabilirsiniz ve bu muhtemelen Sohbet Kafaları için yeterlidir. Sizi UI animasyonu gibi birçok alanda kendi başınıza bıraktığını unutmayın.

Bu StackOverflow iş parçacığında , seçici etkileşim tüketimine izin verme de dahil olmak üzere ayrıntılara iyi bir genel bakış bulabilirsiniz . Özellikle cevap bağlantılarından biri sonunda sizi buraya götürecektir , bu da iyi bir örnek projedir. ICS'nin bunun çalışma şeklini biraz değiştirdiğini, ancak iş parçacıklarının bunu açıkladığını unutmayın.

Bu, herkese açık API şeyleridir, ancak elbette yapılması gereken genel bir şey gibi görünmemektedir. Dokümantasyon, özel sistem uygulama davranışlarına referanslarla ve iyi bir sebeple doludur; ya herkes yaptıysa?


Bu görünüm için bir şekilde yönelim değişikliklerini engelleyebilir miyim? Temel faaliyet yönlendirmeyi değiştirirse, benim görüşüm de yönünü değiştirir.
MG

1
Hayır. Oryantasyon değişikliği sadece etkinlik için değil, cihaz çapındadır.
Rob Pridham

7

Yaylı kafalar , sohbet kafalarının yaylı davranışını kutudan çıkarır. Tek yapmanız gereken, sohbet başlığı tıklatıldığında sohbet başlığının ve parçanın açılması için çekilebilir. Sohbet kafaları simge durumuna küçültüldüğünde çöker ve sürüklendiğinde parmağınızı takip eder.

Proje, tüm yerleşik işlevselliği gösteren bir demo uygulaması içerir. Bunu kullanmak için bunu sınıf bağımlılıklarınıza eklemeniz gerekir.

compile 'com.flipkart.springyheads:library:0.9.6'

HeyKurakumar, çok açık bir kütüphane oluşturdun .. Sadece seviyorum .. Bu kütüphaneden çeşitli yönleri öğrenmeye çalışıyorum .. Uygulama penceresinin dışında çalıştırmaya çalışıyorum, her nasılsa biraz başarılı oldum Bu yüzden .. Ama, uygulama penceresinin dışında sohbet kafasına tıkladığınızda sorun ortaya çıkıyor .. parçası açmak ve dönen java.lang.OutOfMemoryError .. mümkün değilse bana bununla bir yol ver .. Memnuniyetle onurlandırılacak ..
arraystack

@arraystack şimdi bir serviste çalıştırabilirsiniz. GitHub deposundaki şubelerin olup olmadığını kontrol edin
Kiran Kumar

@KiranKumar Teşekkür ederim, Yeni lib ile ilgili sorun Marshmallow Sürümü'nde Draw over uygulamasının
iznidir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.