अन्य ऐप्स (जैसे फेसबुक के चैट हेड्स) को खींचने के लिए क्या एपीआई का उपयोग किया जाता है?


226

फेसबुक Android पर चैट हेड कैसे बनाता है? अन्य सभी दृश्यों के शीर्ष पर अस्थायी दृश्य बनाने के लिए एपीआई क्या है?


6
इस ऐप में "चैट हेड्स" play.google.com/store/apps/details?id=com.ninja.sms
Oli

11
यदि आप एक उदाहरण की तलाश कर रहे हैं, तो github.com/marshallino16/FloatingNotification
marshallino16

5
आप यहां एक डेमो और एक साधारण लाइब्रेरी पा सकते हैं: github.com/ericbhatti/floaties इस लाइब्रेरी का उपयोग करके आप सिर्फ 2 लाइनों का उपयोग करके फ्लोटिंग विंडो बना सकते हैं।
एरिक बी।

जवाबों:


217

यह एक:

किसी एप्लिकेशन को अन्य सभी एप्लिकेशन के शीर्ष पर दिखाए गए प्रकार TYPE_SYSTEM_ALERT का उपयोग करके खिड़कियां खोलने की अनुमति देता है। बहुत कम अनुप्रयोगों को इस अनुमति का उपयोग करना चाहिए; ये विंडो उपयोगकर्ता के साथ सिस्टम-स्तरीय इंटरैक्शन के लिए अभिप्रेत हैं।

लगातार मान: "android.permission.SYSTEM_ALERT_WINDOW"

// संपादित करें: पूर्ण कोड यहाँ :

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);
  }
}

किसी भी तरह सेवा शुरू करने के लिए मत भूलना:

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

.. और इस सेवा को अपने घोषणापत्र में जोड़ें।


4
मुझे लगता है कि अधिक अजीब सामान है। "हेड" के साथ-साथ ड्रैगबिलिटी के बाहर इनपुट को संभालने के बारे में क्या? मुझे लगता है कि आपको कम से कम FLAG_NOT_TOUCH_MODAL की आवश्यकता होगी , साथ ही साथ आप इसे खींचते समय विंडो विशेषताओं (यानी, इसे स्थानांतरित करें) को अपडेट करने के लिए कुछ चतुर तर्क दें।
Delyan

2
इसमें चैट-हेड्स कैसे निकालें?
नीरव मेहता

6
सोचा कि यह एक एसडीके का उल्लेख करने योग्य है जिसे मैंने फ्लोटिंग यूआई बनाने के लिए विकसित किया है: www.tooleap.com
अर्क

@NiravMehta क्या आप चैट प्रमुखों को निकालने में सक्षम हैं?
KK_07k11A0585

चैट हेड के मार्जिन को कैसे हटाएं। ऊपर दिए गए कोड आउटपुट में मान लें कि सर्कल में बॉर्डर से कुछ जगह है। फेसबुक में बुलबुला उस जगह पर नहीं है
डिबगर

51

एक नियम के रूप में, एंड्रॉइड गतिविधियां पूर्ण स्क्रीन हैं, वैचारिक रूप से समर्पित UI हैं जो सभी इंटरैक्शन लेते हैं। इसके कुछ अपवाद हैं। एक शुरुआत के लिए, पॉपअप संवाद हैं जो स्क्रीन को नहीं भरते हैं। एक और एंड्रॉइड टोस्ट है, जो एक गैर-इंटरैक्टिव पॉपअप है - आप इसे छू नहीं सकते हैं, और यदि आप कोशिश करते हैं तो यह जो भी है उसके नीचे जाएगा।

आप अपने स्वयं के विशेष UI भी कर सकते हैं। आप WindowManagerकिसी प्रकार के ध्वज को निर्दिष्ट करते हुए सीधे दृश्य जोड़ सकते हैं । चैट प्रमुख शायद TYPE_PHONE का उपयोग करते हैं । कुछ समान प्रकार हैं, लेकिन उद्देश्य समान है: विशेष उद्देश्य ओवरले जो मूल आवेदन के बिना किसी अन्य चीज़ के शीर्ष पर प्रकट हो सकता है, जाहिरा तौर पर मौजूद नहीं है।

यह केवल आपको अभी तक प्राप्त होता है, हालांकि, बातचीत के साथ समस्याओं के कारण। सबसे पहले, आपका ओवरले सभी इंटरैक्शन को अवशोषित करेगा, इसलिए न केवल सिर को घटनाएँ मिलती हैं, बल्कि आप सब कुछ के लिए बातचीत को अवरुद्ध करते हैं।

आप इस व्यवहार को लेआउटपार्म्स का उपयोग करके कॉन्फ़िगर करते हैं । FLAG_NOT_TOUCH_MODALइसका मतलब है कि आपके प्रदर्शन क्षेत्र के बाहर की घटनाएं अंतर्निहित UI पर जाती हैं। अब आप इसे काम कर पाएंगे, लेकिन अन्य बुरी चीजें अभी भी होती हैं, जैसे कि बैक / मेनू बटन को ऐप्स से निर्देशित नहीं किया जाता है, साथ ही कोई कीबोर्ड नहीं। हल करने के लिए कि आप की आवश्यकता FLAG_NOT_FOCUSABLE

आपको गैर-फ़ोकस करने योग्य बिट से भी साइड इफ़ेक्ट मिलता है, जो आपके ओवरले के साथ कोई भी अच्छा तालमेल नहीं है, जैसे बटन प्रेस। आप कुछ बुनियादी स्पर्श घटनाओं को प्राप्त कर सकते हैं, हालांकि, आप हमेशा गणित कर सकते हैं, और यह संभवत: चैट प्रमुखों के लिए पर्याप्त है। बस इस बात से अवगत रहें कि यह आपको यूआई एनीमेशन जैसे क्षेत्रों में अपने दम पर छोड़ देता है।

विस्तार का एक अच्छा अवलोकन, चयनात्मक बातचीत की खपत के लिए अनुमति सहित, इस StackOverflow धागे में पाया जा सकता है । विशेष रूप से उत्तर लिंक में से एक अंततः आपको यहां ले जाएगा , जो एक अच्छा उदाहरण परियोजना है। ध्यान दें कि आईसीएस बदल गया है कि यह कैसे थोड़ा काम करता है, लेकिन थ्रेड्स बताते हैं कि।

यह सब सार्वजनिक एपीआई सामान है, लेकिन यह वास्तव में एक मुख्यधारा की चीज की तरह प्रतीत नहीं होता है कि किसी को पाठ्यक्रम के रूप में क्या करना चाहिए। दस्तावेज़ीकरण विशेष प्रणाली ऐप व्यवहार के संदर्भ में और अच्छे कारण के साथ अटे पड़े हैं; अगर सबने किया तो क्या होगा?


क्या मैं इन दृश्यों के लिए किसी तरह अभिविन्यास परिवर्तन को रोक सकता हूं? यदि अंतर्निहित गतिविधि अभिविन्यास को स्विच करती है, तो मेरा विचार उनकी अभिविन्यास भी बदलता है।
एमजी

1
नहीं। अभिविन्यास परिवर्तन केवल गतिविधि के लिए नहीं, डिवाइस-वाइड है।
रोब प्रिधम

7

लचीली सिर बॉक्स से बाहर चैट सिर के वसंत आधारित व्यवहार देता है। आपको केवल यह बताना है कि चैट हेड के लिए ड्रॉबल है और चैट हेड पर क्लिक करते ही खुलने वाला टुकड़ा। घसीटते समय चैट हेड्स कम हो जाते हैं और उंगली का अनुसरण करते हैं।

परियोजना में एक डेमो ऐप शामिल है जो सभी अंतर्निहित कार्यक्षमता का प्रदर्शन करता है। इसका उपयोग करने के लिए, आपको इसे अपने ग्रेडेल निर्भरताओं में जोड़ना होगा।

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

अरे @KiranKumar, आपने एक बहुत ही स्पष्ट पुस्तकालय बनाया है .. मैं इसे प्यार करता हूँ .. मैं इस पुस्तकालय से विभिन्न पहलुओं को जानने की कोशिश कर रहा हूँ .. मैं इसे अनुप्रयोग विंडो के बाहर चलाने की कोशिश कर रहा हूं, किसी तरह मैं इसे करने में थोड़ा सफल हूं ऐसा है .. लेकिन, समस्या तब पैदा होती है जब मैं ऐप की विंडो के बाहर चैट हेड पर क्लिक करता हूं .. खंड java.lang.OutOfMemoryError को खोलने और वापस करने में सक्षम नहीं होगा .. अगर यह आपकी तरफ से संभव हो सकता है मुझे इस के माध्यम से कुछ रास्ता दे .. यह ख़ुशी से सम्मानित किया जाएगा ..
arraystack

@ सारिणी अब आप इसे एक सेवा में चला सकते हैं। सूची की जाँच करें यदि GitHub रेपो में शाखाएँ
किरण कुमार

@KiranKumar धन्यवाद, नए परिवाद के साथ समस्या
मार्शमैलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.