टीएल; डीआर: getDrawingCache()
View
के पूर्ण पुनरावृत्ति को ट्रिगर करने के लिए प्रतीत होता है जब हार्डवेयर त्वरण सक्षम होता है, क्या Bitmap
(या उन पंक्तियों के साथ कुछ) प्राप्त करने का एक वैकल्पिक माध्यम है जो शायद इससे बचाता है, शायद डेटा में पॉप्युलेट किए गए डेटा को पढ़कर (हार्डवेयर, सॉफ्टवेयर) परत जब View
अंतिम बार खींचा गया था?एक दृश्य के कुशल "स्क्रीनशॉट"?
कुछ पृष्ठभूमि:
एंड्रॉयड एक संलग्न HDMI प्रदर्शित करने के लिए के रूप में एंड्रॉयड 3.0 के बाद से स्क्रीन दर्पण, इस तरह की क्षमता पड़ा है। इसका प्रस्तुतियों के लिए उपयोग किया जा सकता है, लेकिन इसका मतलब है कि दर्शक प्रस्तुतकर्ता के समान ही चीज़ देखते हैं, जो हमेशा आदर्श नहीं होता है।
एंड्रॉइड 4.2 ने Presentation
जोड़ा, ताकि "दूसरी स्क्रीन" (उदा। एचडीएमआई संलग्न डिस्प्ले) पर मनमाने ढंग से सामान डालने की अनुमति दी जा सके। इस मामले में, कभी-कभी, दूसरी टैबलेट के लिए यह उपयोगी होगा कि मुख्य टैबलेट के प्रदर्शन पर भाग दिखाया जा सके। आप Microsoft PowerPoint, लिब्रे ऑफिस Impress, और तरह तरह प्रस्तुति सॉफ्टवेयर के बारे में सोच रहे हैं, तो ठेठ दोहरी स्क्रीन सेटअप में, दर्शकों वर्तमान प्रस्तुति स्लाइड, देखता है, जबकि प्रस्तोता वर्तमान स्लाइड और एक टाइमर और स्पीकर नोट है और देखता है ...
गैर-सहभागी सामग्री के लिए, एक PNG एक स्लाइड का प्रतिनिधित्व करने की तरह है, यह बस (प्राथमिक स्क्रीन पर अन्य सामान के साथ) दोनों स्क्रीन में एक ही छवि दिखाने का एक मामला है।
हालांकि, इंटरेक्टिव सामग्री के लिए, एक WebView
की तरह, यह कभी कभी मुश्किल मिरर की इस तरह करना है। उदाहरण के लिए, हम के रूप में यह इतना सामान के आधार पर करते हैं सकता है विशुद्ध रूप से WebView
ही (जैसे, AJAX के पूरा होने के कॉल) के भीतर जब एक WebView
की सामग्री को बदल सकता है जानते हुए भी, कुछ नहीं हम अलग से करना का कोई अच्छा तरीका है। और, भले ही हम पता था जब WebView
की सामग्री बदल, हम कुछ अन्य WebView
हो रही है कि एक ही सामग्री रेंडर करने का कोई अच्छा तरीका है।
तो मैं लगा रहा, कि getDrawingCache()
का प्रयोग करेंगे कंटेनर सामग्री का Bitmap
पुनः प्राप्त करने के एक MirroringFrameLayout
स्थापित करने के लिए कोशिश करते हैं और किसी को जो इसे परदे पर प्रस्तुत कर सकते हैं (जैसे, एक ImageView
एक Presentation
में दिखाया गया है कि उद्धार होता)।
हालांकि, हार्डवेयर त्वरण के साथ सक्षम, setDrawingCacheEnabled(true)
is somewhat of a no-op:
ड्राइंग संचय को सक्षम करने एक परत सेट करते समय हार्डवेयर त्वरण बंद कर दिया है के समान है। जब हार्डवेयर त्वरण चालू होता है, तो ड्राइंग कैश को सक्षम करने से प्रतिपादन पर कोई प्रभाव नहीं पड़ता है क्योंकि सिस्टम त्वरण के लिए एक अलग तंत्र का उपयोग करता है जो ध्वज को अनदेखा करता है। एक बिटमैप समर्थित
Canvas
, बजाय वास्तव में एक कैश का उपयोग कर
इन मामलों में getDrawingCache()
कॉलिंग के लिए View
की एक पूरी draw()
बाध्य करती है। चूंकि draw()
महंगा हो सकता है, draw()
अक्सर (कहें, postOnAnimation()
के माध्यम से ट्रिगर किया गया) परिणामस्वरूप जंक में परिणाम।
इसलिए, मुझे लगता है कि हम हार्डवेयर त्वरण सक्षम है, तो यह है कि इस मिरर स्थापित करने के लिए इस्तेमाल किया जा सकता के साथ उपयोग कर सकते हैं, अगर वहाँ कुछ अन्य "ड्राइंग कैश" है निर्धारित करने के लिए, getDrawingCache()
परे कोशिश कर रहा हूँ, और कि और अधिक कुशल है।जो मैं देख सकता हूं, वहां ऐसा कोई कैश नहीं है, क्योंकि परतें प्रभावी रूप से केवल एसडीके ऐप्स के दृष्टिकोण से ही लिखती हैं। हालांकि, मुझे उम्मीद है कि शायद मुझे कुछ समाधान याद आ रहा है।
अग्रिम धन्यवाद!
एफवाईआई, यहां एक गिटहब रेपो है जो मेरे कार्यान्वयन को शामिल करता है: https://github.com/commonsguy/cwac-layouts – CommonsWare