2011-01-02 10 views
98

मैं SurfaceView को ड्राइंग और इसलिए पूरे Surface/Canvas/Bitmap प्रणाली है, जो एंड्रॉयड में प्रयोग किया जाता है की प्रक्रिया को समझने के लिए संघर्ष कर रहा हूँ।समझौता कैनवास और भूतल अवधारणाओं

मैंने सभी लेख और एपीआई दस्तावेज पेज पढ़े हैं, जिन्हें मैं एंड्रॉइड डेवलपर्स साइट, एंड्रॉइड ग्राफिक्स, लुनरलैंडर स्रोत कोड और this question के कुछ ट्यूटोरियल पर ढूंढने में सक्षम था।

कृपया मुझे बताएं, इनमें से कौन सा कथन सत्य है, जो नहीं हैं, और क्यों।

  1. Canvas अपनी ही Bitmap इसे से जुड़ी है। Surface के पास इसके Canvas से जुड़ा हुआ है।
  2. सभी View विंडो का एक ही Surface साझा करता है और इस प्रकार Canvas साझा करता है।
  3. SurfaceViewView के उपवर्ग है, जो, अन्य View के उपवर्गों के विपरीत और View ही है, में आकर्षित करने के लिए अपने स्वयं के Surface है

भी एक अतिरिक्त सवाल ही नहीं है:।

  • क्यों है बिटमैप के साथ उच्च स्तरीय संचालन के लिए Canvas पहले से Surface कक्षा की आवश्यकता है। ऐसी स्थिति का उदाहरण दें जहां Canvas काम करने के लिए उपयुक्त नहीं है जो Surface कर सकता है।
+1

ग्राफिक्स वास्तुकला दस्तावेज़: https://source.android.com/devices/graphics/architecture.html – fadden

उत्तर

193

यहाँ कुछ परिभाषाएं दी गई हैं:

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

  • एक विंडो मूल रूप से डेस्कटॉप पर एक खिड़की के बारे में सोचने की तरह है। इसमें एक ही सतह है जिसमें खिड़की की सामग्री प्रदान की जाती है। खिड़कियां बनाने के लिए एक विंडो विंडो प्रबंधक के साथ एक इंटरैक्ट करता है; विंडो प्रबंधक प्रत्येक विंडो के लिए एक सतह बनाता है और इसे ड्राइंग के लिए आवेदन देता है। आवेदन सतह में जो कुछ भी चाहता है उसे आकर्षित कर सकता है; विंडो प्रबंधक के लिए यह सिर्फ एक अपारदर्शी आयताकार है।

  • ए व्यू एक विंडो के अंदर एक इंटरैक्टिव यूआई तत्व है। एक खिड़की में एक दृश्य दृश्य पदानुक्रम है, जो खिड़की के सभी व्यवहार प्रदान करता है। जब भी खिड़की को फिर से खींचा जाना चाहिए (जैसे कि दृश्य स्वयं को अमान्य कर दिया गया है), यह खिड़की की सतह में किया जाता है। सतह लॉक है, जो एक कैनवास लौटाती है जिसका उपयोग इसे आकर्षित करने के लिए किया जा सकता है। एक ड्रॉ ट्रैवर्सल पदानुक्रम के नीचे किया जाता है, जिससे यूआई के हिस्से को आकर्षित करने के लिए प्रत्येक दृश्य के लिए कैनवास को नीचे सौंप दिया जाता है। एक बार पूरा होने पर, सतह को अनलॉक किया जाता है और पोस्ट किया जाता है ताकि बस खींचे गए बफर को अग्रभूमि में बदल दिया जाए ताकि फिर सतह फ़्लिंगर द्वारा स्क्रीन पर मिश्रित किया जा सके।

  • एक सतह दृश्य दृश्य का एक विशेष कार्यान्वयन है जो एप्लिकेशन के लिए अपनी समर्पित सतह भी बनाता है (सामान्य दृश्य पदानुक्रम के बाहर, जो अन्यथा खिड़की के लिए एकल सतह साझा करना चाहिए)। जिस तरह से यह काम करता है उससे अपेक्षाकृत सरल है - सभी SurfaceView विंडो प्रबंधक को एक नई विंडो बनाने के लिए कहता है, इसे ज़ेड-ऑर्डर करने के लिए कहता है कि खिड़की या तो तुरंत पीछे या SurfaceView की खिड़की के सामने, और इसे मिलान करने के लिए स्थिति जहां सतह दृश्य दृश्य विंडो में प्रकट होता है। यदि सतह मुख्य खिड़की (जेड ऑर्डर में) के पीछे रखी जा रही है, तो सतह दृश्य भी मुख्य खिड़की के पारदर्शीता के साथ अपना हिस्सा भरता है ताकि सतह देखी जा सके।

  • ए बिटमैप कुछ पिक्सेल डेटा के लिए सिर्फ एक इंटरफ़ेस है। जब आप सीधे एक बना रहे होते हैं तो पिक्सल को बिटमैप द्वारा आवंटित किया जा सकता है, या यह पिक्सल को इंगित कर सकता है, जो कि कैनवास को ड्राइंग के लिए सतह पर हुक करने के लिए आंतरिक रूप से ऐसा नहीं होता है। (एक बिटमैप बनाई गई है और सतह की वर्तमान ड्राइंग बफर ओर इशारा किया।)

यह भी ध्यान है कि, के रूप में यह संकेत मिलता है, एक SurfaceView एक बहुत भारी वजन वस्तु है रखें। यदि आपके पास किसी विशेष UI में एकाधिक SurfaceViews हैं, तो इस बारे में सोचें और सोचें कि वास्तव में इसकी आवश्यकता है या नहीं। यदि आपके पास दो से अधिक हैं, तो आप लगभग निश्चित रूप से बहुत अधिक हैं।

+0

बहुत बहुत धन्यवाद! जवाब चीजों को स्पष्ट बना दिया। सतह पर कैनवास को हुक करने के बारे में हिस्सा अस्पष्ट है, हालांकि। कल्पना नहीं कर सकता कि इस तरह के ऑपरेशन की आवश्यकता है। अगला उस ऑपरेशन का उदाहरण हो सकता है: एक कैनवास पर बिटमैप ड्राइंग, SurfaceHolder से लॉक कैनवास() विधि के साथ अधिग्रहित? – fyodorananiev

+0

इस तरह ड्राइंग होता है कैनवास 2 डी ड्राइंग एपीआई है। यदि आप सतह पर ओ आकर्षित करने जा रहे हैं, तो आपको कैनवास बनाना होगा जो इसके बफर को इंगित करने के लिए कैनवास 2 डी ड्राइंग एपीआई का उपयोग करने के लिए इंगित करता है। – hackbod

+4

'हैकबोड के उत्तर के अलावा, 'सतह दृश्य' को माध्यमिक धागे से भी प्रस्तुत किया जा सकता है जो 'व्यू' ऑब्जेक्ट्स – dheeran

15

ए बिटमैप पिक्सेल के संग्रह के लिए बस एक रैपर है। इसके बारे में कुछ अन्य सुविधाजनक कार्यों के साथ पिक्सल की एक सरणी के रूप में सोचें।

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

SurfaceView एक दृश्य है जिसमें एक सतह है। एक सतह बिटमैप के समान है (इसमें एक पिक्सेल स्टोर है)। मुझे नहीं पता कि यह कैसे कार्यान्वित किया जाता है लेकिन मुझे लगता है कि यह किसी प्रकार का बिटमैप रैपर है जो स्क्रीन डिस्प्ले से सीधे संबंधित चीजों के लिए अतिरिक्त विधियों के साथ है (यही कारण है कि एक सतह के लिए, बिटमैप बहुत सामान्य है)। आप अपने सतह से कैनवास प्राप्त कर सकते हैं जो वास्तव में अंतर्निहित बिटमैप से जुड़े कैनवास प्राप्त कर रहा है।

आपके प्रश्न।

1. कनवस का अपना स्वयं का बिटमैप जुड़ा हुआ है। सतह के पास इसके स्वयं के कैनवास संलग्न हैं।

हां, एक कैनवास बिटमैप (या एक खुला जीएल पैनल) पर चल रहा है। सतह आपको एक कैनवास देता है जो कि बिटमैप शैली पिक्सेल स्टोर के लिए जो कुछ भी सतह का उपयोग कर रहा है, उस पर चल रहा है।

2. खिड़की के सभी दृश्य समान सतह साझा करते हैं और इस प्रकार समान कैनवास साझा करते हैं।

नहीं। आप जितना चाहें उतने सतह दृश्य देख सकते हैं।

3.SurfaceView देखें, जो, अन्य दृश्य के उपवर्गों के विपरीत और खुद को देखें, में आकर्षित करने के लिए अपने स्वयं के भूतल है के उपवर्ग है।

हां। जैसे ListView व्यू का एक उप-वर्ग है जिसकी अपनी सूची डेटा संरचना है। व्यू का प्रत्येक उप-वर्ग कुछ अलग करता है।

+0

तो, 'Bitmap' और' Surface' पिक्सेल की दुकान के बस विभिन्न प्रजातियां हैं और 'Canvas' उनमें से या तो लपेट कर सकते हैं ? – fyodorananiev

+2

असल में हाँ। कैनवास को सतह पर नहीं लिख सकता है, यह जो भी सतह अपने स्वयं के पिक्सेल स्टोर के रूप में उपयोग कर रहा है (एंड्रॉइड स्रोत को देखे बिना मैं निश्चित रूप से यह नहीं कह सकता कि यह क्या है)। यह शायद किसी प्रकार का बिटमैप एक्सटेंशन है क्योंकि कैनवास केवल बिटमैप और जीएल के लिए रचनाकार प्रदान करता है। – monkjack

+0

महान सहायता, धन्यवाद! उत्तर के बारे में 2. मेरे प्रश्न में मेरा मानक विचार है, न कि SurfaceViews। मान लीजिए कि मेरे पास बहुत सारे फ़ील्ड और बटन के साथ सापेक्ष लयआउट है। इस मामले में, सतह पूरी खिड़की से जुड़ा हुआ है और सभी दृश्यों द्वारा पदानुक्रम देखने में साझा किया गया है? – fyodorananiev

25

A conceptual overview of Window, Surface, Canvas, and Bitmap

यहाँ कैसे बातचीत विंडो, भूतल, कैनवस, और बिटमैप के बीच होता है की एक बहुत ही बुनियादी और सरल वैचारिक अवलोकन है।
कभी-कभी, एक दृश्य प्रतिनिधित्व मोड़ की अवधारणाओं को समझने में बहुत मदद करता है।
मुझे आशा है कि यह ग्राफिक किसी की मदद कर सकता है।

+2

विज़ुअल ** छवियों ** टेक्स्ट से बेहतर है: डी – Gattsu

+0

@Sabeesh: अच्छा काम किया गया! !! –

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