2012-11-30 31 views
13

मैं एंड्रॉइड विकास के लिए नया हूं, मैं View की खोज कर रहा हूं। मैं दो विधियों onDraw(Canvas c) और draw(Canvas c) ज्ञात हूं।एंड्रॉइड में ड्रॉ (कैनवास सी) बनाम ड्रॉ (कैनवास सी) पर देखें?

क्या कृपया मुझे इन दो तरीकों का अंतर और उपयोग समझा सकता है? छवियों के साथ कैनवास अद्यतन करते समय कौन सी विधि बेहतर प्रदर्शन (एफपीएस) देगी?

उत्तर

22

उनके

  1. onDraw(Canvas c) के बीच अंतर है एक ओवरराइड विधि है और जब दृश्य गाया जा रहा है स्वचालित रूप से कहा जाता है। यहां आप अपनी अतिरिक्त ड्राइंग कर सकते हैं जैसे मंडल, रेखाएं या जो कुछ भी आप चाहते हैं।

  2. draw(Canvas c) मैन्युअल रूप से (अपने बच्चों के सभी और) दिया कैनवास को यह दृश्य प्रस्तुत करने के लिए प्रयोग किया जाता है। इस फ़ंक्शन को कॉल करने से पहले दृश्य को पहले से ही एक पूर्ण लेआउट करना होगा। एक दृश्य को लागू करते समय, इस विधि को ओवरराइड करने के बजाय onDraw(android.graphics.Canvas) लागू करें। यदि आपको इस विधि को ओवरराइड करने की आवश्यकता है, तो सुपरक्लास संस्करण को कॉल करें।

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

+0

कृपया मुझे इन 2 तरीकों – mini

+9

के बीच प्रदर्शन (एफपीएस) मैं नहीं दिख रहा है कि यह कैसे सवाल का जवाब बता सकते हैं। ऐसा लगता है कि आपने इनलाइन प्रलेखन – Migisha

+0

से चिपकाया है, मेरे परीक्षण से, दृश्य को प्रस्तुत किए जाने पर दोनों को बुलाया जाएगा। ड्रा (कैनवास सी) को पहले कहा जाएगा, और उसके बाद ड्रॉ (कैनवास सी) को अंदर ड्रॉ (कैनवास सी) कहा जाता है। तो मुझे नहीं लगता कि यहां "स्वचालित रूप से नहीं कहा गया शब्द" मान्य है क्योंकि दोनों दृश्यों को स्वचालित रूप से "स्वचालित रूप से बुलाया जाता है"। – HendraWD

8

बस अगर कोई अभी भी मेरे जैसा उत्तर ढूंढ रहा था और उसे नहीं मिला।

ड्रॉ() विधि को ढांचे द्वारा बुलाया जाता है जब दृश्य को फिर से खींचा जाने की आवश्यकता होती है और ड्रॉ() विधि तब दृश्य की सामग्री को आकर्षित करने के लिए ऑन ड्रा() को कॉल करती है।

void draw(Canvas canvas) 
{ 
    ..... do default stuff (background, layers) 
    onDraw(canvas) 
    ..... do other stuff (scroll bars, fading edges, children) 

} 
+1

कृपया एक दस्तावेज़ीकरण संदर्भ पोस्ट करें। अच्छा उत्तर। – milosmns

+1

मैंने वास्तव में इसके लिए स्रोत कोड की जांच की, लेकिन आप देख सकते हैं कि प्रतिपादन करते समय, व्यू ग्रुप प्रत्येक अपने बच्चों की ड्रा() 'विधि को कॉल करता है, आप इसे यहां देख सकते हैं http://developer.android.com/guide/topics/ ui/how-android-draws.html –

+1

धन्यवाद, यह बहुत अच्छी तरह से बताता है। – milosmns

1

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

  • draw(Canvas) पर हावी नहीं है।
  • यदि आपका कस्टम व्यू पूर्ण स्क्रीन गेम के रूप में उपयोग करने का इरादा है, तो draw() ओवरराइड करने से आपको प्रत्येक चक्र पर कुछ अनियंत्रित कॉल बचाए जाएंगे।

लंबे समय तक उत्तर

  • ढांचे इसके ड्रा चक्र में draw(Canvas) उपयोग करता है।, यदि आवश्यक हो तो
  • चरण 2 पृष्ठभूमि आकर्षित: बचाने के कैनवास 'परतों
  • चरण 3: सामग्री आकर्षित --- onDraw() आता
    • चरण 1: यह है कि मैं क्या देखें कोड में मिल सकता है है यहाँ
    • चरण 4: बच्चों आकर्षित
    • चरण 5: फीका प्रभाव आकर्षित और परतों
    • चरण 6 बहाल: आकर्षित स्क्रॉलबार

उपयोगी टिप

  • आप एक गुप्त बिटमैप आपके द्वारा बनाए गए किसी भी दृश्य प्रदान कर सकते हैं, और बाद में कहीं भी इस बिटमैप का उपयोग करें:

    Canvas c = new Canvas(); 
    c.setBitmap(myOffscreenBitmap); 
    myView.draw(c); 
    
      साधारण मामलों के लिए
    • (जब यह नहीं है एक व्यू ग्रुप और कोई स्क्रॉलबार की आवश्यकता नहीं है), सरल onDraw(Canvas) भी चाल कर सकता है।
+0

यह उत्तर बहुत सटीक है, लेकिन Draw (c) की बजाय ओवर-राइड ड्रॉ का कारण है, और super.draw (c) को कॉल नहीं करें। प्रदर्शन यदि आपको ढांचे की विशेषताओं की परवाह नहीं है और जितनी जल्दी हो सके आकर्षित करना चाहते हैं, उदा। एक दृश्य में स्थिति की तरह एक खेल, आप उस सामान को छोड़ना चाह सकते हैं। – HaMMeReD

+0

@HaMMeReD सहमत हैं, गेम लूप में फ्रेमवर्क कोड को छोड़ना समझ में आता है। लेकिन यदि दृश्य पदानुक्रम के अंदर एक कस्टम दृश्य को लागू करना है, तो फ्रेमवर्क कोड आवश्यक है। – auval