2013-02-13 43 views
19

मेरा प्रोजेक्ट सतही दृश्य पर आधारित है और अब तक मेरे पास मेरे सभी प्रतिपादन हैं जो मैं ओवरराइड कर रहा हूं। सब ठीक लग रहा था।ऑन ड्रा() या ड्रा() ओवरराइड करें?

हालांकि, मैं बस अपना एसडीके को नवीनीकृत किया है और अब यह मुझे मुझे बता एक त्रुटि देता है:

संदेहास्पद विधि कॉल; शायद "ऑनड्रा"

के बजाय "ड्रॉ" को कॉल करना चाहिए, क्या कोई इन दोनों के बीच अंतर को समझा सकता है?

मैंने नेट के आसपास कुछ समान प्रश्न पढ़े हैं लेकिन मुझे एक स्पष्टीकरण नहीं मिला है जिसे मैं समझता हूं।

धन्यवाद

उत्तर

10

SurfaceView.draw() मूल रूप से View.draw(); पर कॉल करता है यदि आप अपने ड्राइंग को कार्यान्वित करना चाहते हैं, तो आपको इसे View.onDraw() में करना चाहिए जो आपके लिए लागू करने के लिए है जो स्रोत कोड टिप्पणियों में भी कहता है।

यह विधि ViewGroup.drawChild() द्वारा इस विधि को ड्रा करने के लिए बुलाया जाता है। यह ड्रॉ() विधि एक कार्यान्वयन विवरण है और को ओवरग्राइड करने के लिए या ViewGroup.drawChild() से कहीं और से कहीं भी कॉल करने का इरादा नहीं है।

उनके बीच के अंतर के रूप में:
ड्रा():

13416  /* 
13417   * Draw traversal performs several drawing steps which must be executed 
13418   * in the appropriate order: 
13419   * 
13420   *  1. Draw the background 
13421   *  2. If necessary, save the canvas' layers to prepare for fading 
13422   *  3. Draw view's content 
13423   *  4. Draw children 
13424   *  5. If necessary, draw the fading edges and restore layers 
13425   *  6. Draw decorations (scrollbars for instance) 
13426   */ 

OnDraw() खाली है। यह आपके लिए लागू करने के लिए है।

+0

क्या यह एसडीके द्वारा गलत गलती है तो यह मुझे बता रहा है कि मुझे 'शायद' ड्रॉ() कहा जाना चाहिए? – Zippy

+0

दस्तावेजों के आधार पर, आपको 'शायद' ड्रॉ नहीं करना चाहिए() लेकिन यह वास्तव में आपके वास्तविक कोड पर निर्भर हो सकता है। – wtsang02

-3

onDraw आप स्क्रीन को आकर्षित करने के लिए एक कैनवास देता है।

draw() आपको स्क्रीन पर मैन्युअल रूप से कैनवास खींचने की अनुमति देता है (आपको स्वयं कैनवास बनाना होगा)।

+0

दोनों एक कैनवास है। – pablisco

21

मैंने अपनी परियोजना की सफाई करने की कोशिश की और इसने समस्या को हल किया। कोशिश करो।

+7

यह इसे "हल" नहीं करता है, यह बस इसे साफ़ करता है। यह एक लिंट त्रुटि है और डिफ़ॉल्ट रूप से लिंट संशोधित फ़ाइलों पर चलाया जाता है। जब लिंट फिर से चलाया जाता है, वही लिंट त्रुटि फिर से दिखाई देगी। – laalto

+0

ओह, धन्यवाद @laalto। :) – KarenAnne

+1

इसे सही उत्तर के रूप में सेट किया जाना चाहिए। ऐसा लगता है कि एक ग्रहण बग है। – HAL9000

7

मुझे पहले से ही समस्या है।

मैं इस तरह इसे संभाल:

1) निम्नलिखित की तरह एक प्रणाली की घोषणा।

@SuppressLint("WrongCall") 
public void drawTheView() { 
    theCanvas = null; 

    try{ 
     theCanvas = getHolder().lockCanvas(); 
     if(theCanvas != null) { 
      onDraw(theCanvas); 
     } 
    } finally { 
     getHolder().unlockCanvasAndPost(theCanvas); 
    } 
} 

2) अब आप संशोधित कर सकते हैं OnDraw() विधि:

@Override 
public void onDraw(Canvas canvas) { 
    //Do some drawing 


} 

आप drawTheView() विधि हर जगह से आप चाहते हैं कॉल और प्राप्त किए बिना OnDraw() विधि इस तरह से कॉल कर सकते हैं त्रुटि ...

मुझे लगता है कि यह एक व्यावहारिक तरीका है।

2

ध्यान दें कि ड्राइंग के मामले में, अधिभावी ड्रा() और बुला super.draw अक्सर प्रयोग किया जाता है जब एक ViewGroup अपने बच्चे विचारों से अधिक सामग्री आकर्षित करने के लिए चाहता है में।पर खींची गई सामग्री बच्चों के नीचे दिखाई देगी।

2

जैसा कि friiky ने कहा, @SuppressLint("WrongCall") मेरी समस्या तय की गई। हालांकि यह उपरोक्त नहीं, विधि नाम के सामने होना चाहिए।

मैं क्या त्रुटि कोड पर माउस डाल दिया जाता है, ठीक क्लिक करें और चुनें Add @SuppressLint("WrongCall")

+0

यह काम और सबकुछ लगता है, लेकिन मैं 'दबाने वाली त्रुटि' जोड़ने के बारे में बहुत खुश नहीं हूं। सिर्फ दिन की प्रतीक्षा कर रहा है .. – eigil