2013-03-21 6 views
17

टीएल; डीआर: 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() परे कोशिश कर रहा हूँ, और कि और अधिक कुशल है।जो मैं देख सकता हूं, वहां ऐसा कोई कैश नहीं है, क्योंकि परतें प्रभावी रूप से केवल एसडीके ऐप्स के दृष्टिकोण से ही लिखती हैं। हालांकि, मुझे उम्मीद है कि शायद मुझे कुछ समाधान याद आ रहा है।

अग्रिम धन्यवाद!

+0

एफवाईआई, यहां एक गिटहब रेपो है जो मेरे कार्यान्वयन को शामिल करता है: https://github.com/commonsguy/cwac-layouts – CommonsWare

उत्तर

13

आप setLayerType(View.LAYER_TYPE_SOFTWARE, null) का उपयोग कर सकते हैं, लेकिन यह उस अद्यतन को धीमा करने के साइड इफेक्ट को हर बार अपडेट करने के लिए धीमा कर देगा। यह एक कस्टम ViewGroup बनाने के लिए और अधिक कुशल होगा जो आपके दृश्य को दो कैनवास (प्रत्येक स्क्रीन के लिए एक) पर खींचता है। आप आसानी से ViewTreeObserver और प्रत्येक ड्रॉ कॉलबैक बल पर दूसरी स्क्रीन पर प्रस्तुत करने के लिए अपने दृश्य को भी उपयोग कर सकते हैं। मैं वास्तव में आपको सलाह देता हूं कि इस तरह के उपयोग के मामले में ड्राइंग कैश/परत प्रकार का दुरुपयोग करने का प्रयास न करें।

+0

क्या मेरे लिए कस्टम में 'ऑनड्रा()' से अलग 'कैनवास' को प्रस्तुत करना सुरक्षित है 'ViewGroup'? – CommonsWare

+0

जब तक यह यूआई थ्रेड से है, हाँ। –

+0

ठीक है, अब तक, यह काम कर रहा प्रतीत होता है। अगला प्रोजेक्ट: स्केलिंग सही हो रहा है, क्योंकि दर्पण का आकार मूल के आकार के समान नहीं हो सकता है। "ज़ूमिंग ए व्यू" प्रशिक्षण पृष्ठ, "यय, गणित" उद्धृत करने के लिए। :-) धन्यवाद! – CommonsWare

संबंधित मुद्दे