कैनवास और भूतल अवधारणाओं को समझना


114

मैं ड्राइंग की प्रक्रिया को समझने के लिए संघर्ष कर रहा हूं SurfaceViewऔर इसलिए पूरे Surface/ Canvas/ Bitmapसिस्टम का उपयोग करता हूं , जो एंड्रॉइड में उपयोग किया जाता है।

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

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

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

एक अतिरिक्त प्रश्न यह भी है:

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

2
ग्राफिक्स आर्किटेक्चर doc: source.android.com/devices/graphics/ RGBecture.html
fadden

जवाबों:


223

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

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

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

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

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

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

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


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

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

6
#hackbod'sउत्तर के अलावा , SurfaceViewमाध्यमिक धागे से भी प्रदान किया जा सकता है जो Viewवस्तुओं के लिए संभव नहीं है
मोहनराज बालसुब्रमण्यम

47

विंडो, सरफेस, कैनवस और बिटमैप का एक वैचारिक अवलोकन

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


4
दृश्यमान छवियां पाठ से बेहतर हैं: D
M Mツ '

18

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

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

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

आपके सवाल।

1. कैनवस के पास अपना खुद का बिटमैप है। भूतल का अपना कैनवस है।

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

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

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

3.SurfaceView, व्यू का उप-वर्ग है, जो अन्य व्यू के उप-वर्ग और व्यू के विपरीत है, जिसमें खींचने के लिए अपना स्वयं का भूतल है।

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


1
तो, Bitmapऔर Surfaceपिक्सेल स्टोर की बस अलग-अलग प्रजातियां हैं और Canvasउनमें से कोई भी लपेट सकता है?
फ्योदोरानानिएव

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

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

1
याद रखें कि सतह पिक्सेल का एक संग्रह है। इसलिए प्रत्येक सतह दृश्य की अपनी सतह होती है और प्रत्येक को स्क्रीन के एक अलग हिस्से पर प्रस्तुत किया जा सकता है। वे स्क्रीन को भरने के लिए आवश्यक नहीं हैं (हालांकि यह सामान्य उपयोग है, पूर्ण स्क्रीन गेम पर ग्राफिक्स को प्रस्तुत करने के लिए)।
स्कैमुएल

1
मैं वास्तव में बिटमैप और सरफेस के बराबर नहीं सोचूंगा। सरफेस एक ऐसी वस्तु है जिसकी सतह कंपन्न करती है, जो विंडो कंपोज़िटर के बारे में जानती है। यानी, यह सीधे स्क्रीन पर दिखाई देने वाली एक चीज़ है, स्क्रीन पर एक Z- ऑर्डर है, आदि
Hackbod
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.