2012-08-11 25 views
21

मैं अपने विस्तारित दृश्य के एक Log.d() OnDraw में फोन() शब्दों में कहें, तो मैं कितनी बार देख सकते हैं और जब यह कहा जाता हो रही है। इसे दृश्य के तत्काल पर बुलाया जाता है, जो आश्चर्यजनक नहीं है। लेकिन फिर मैंने देखा, यह टचवेन्ट() द्वारा संचालित हर टैप पर बुलाया जाता है, भले ही मेरा कोड ग्राफिक्स से दूरस्थ रूप से कुछ भी नहीं कर रहा हो। हालांकि, documentation में दृश्यों के लिए, मुझे लगता है कि ऑनड्रा() को वास्तव में कब कहा जाता है, इसके बारे में कुछ भी नहीं मिल रहा है। मैं यहां अपने विशेष प्रोजेक्ट के बारे में वास्तव में चिंतित नहीं हूं (इससे मेरे लिए कोई समस्या नहीं आती है), मैं सिर्फ यह जानना चाहूंगा कि कोई सूची है या कुछ ऐसा है जो किसी व्यू के लिए संचालन के क्रम को दिखाता है, विशेष रूप से क्या कारण कॉल करने के लिए ऑन ड्रा()। जबView.onDraw() --- इसे कब कहा जाता है?

उत्तर

45

AFAIK, एक दृश्य के OnDraw() कहा जाता है:

  1. दृश्य शुरू में तैयार की है
  2. जब भी invalidate() दृश्य पर कहा जाता है

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

मैं मानता हूँ कि यह एक दस्तावेज है कि दृश्य के काम में विस्तृत करने के लिए अच्छा होगा, और यदि कोई मौजूद है और किसी को जहां यह पता लगाने के लिए जानता है, तो कृपया हमें बताएं।

+0

यह 'व्यू ग्रुप' के मामले में नहीं है। मेरा उत्तर http देखें : //stackoverflow.com/a/34367199/1642079 –

7
  • आप एक दृश्य के लिए एक पृष्ठभूमि drawable सेट करते हैं तो देखें यह आप के लिए अपने विधि OnDraw() वापस करने के लिए कॉल करने से पहले आकर्षित करेगा। जब दृश्य एक खिड़की से जुड़ा हुआ है

  • onAttachedToWindow() कहा जाता है। इस बिंदु पर इसकी सतह है और ड्राइंग शुरू हो जाएगी। ध्यान दें कि फ़ंक्शन को पर ड्रा (एंड्रॉइड.graphics.Canvas) से पहले बुलाया जाने की गारंटी है, हालांकि इसे पहले ड्रॉ से पहले कहा जा सकता है - जिसमें पहले या बाद में मेजर (int, int) शामिल है।

  • रद्द() क्षेत्र तैयार किया जा करने की जरूरत के रूप में गंदा द्वारा परिभाषित निशान। यदि दृश्य दिखाई देता है, OnDraw (android.graphics.Canvas) भविष्य में किसी समय पर बुलाया जाएगा। ध्यान में रखने की

+0

एक तरीका है जिसे हम वापस ड्रॉ() पर कॉल करने से पहले रोक सकते हैं, क्या आप मेरा प्रश्न http://stackoverflow.com/questions/19052952/bitmap-change-will देखना चाहते हैं बनाओ-दृश्य-स्वत: रीफ्रेश पहले OnDraw और परवाह किए बिना-अमान्य – VinceStyling

1

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

8

onDraw() जब invalidate() कहा जाता है कहा जाता है।

लेकिन आपको व्यू ग्रुप के लिए पता होना चाहिए: onDraw() आपको नहीं कहा जाएगा जैसा कि आप उम्मीद करते हैं। इसके बजाय, onDispatchDraw()

हालांकि, एक ViewGroup में आप setWillNotDraw(false) निर्माता में onDraw()invalidate() पर कहा जा करने के लिए कह सकते हैं।

उपरोक्त के अतिरिक्त this answer

0

पर एक नज़र डालें: मुलायम कुंजीपटल एक View.invalidate (कारण बनता है) -> View.onDraw() विंडो का आकार बदलने के बाद अनुक्रम समझदारी से 'कुंजीपटल' समायोजित करने के लिए । एक कस्टम View.onDraw() खुद को ऐसे राज्य में छोड़ देना चाहिए जो इस संभावना की अपेक्षा करता है।
इस तरह की घटना बताती है कि ब्लूटूथ कीबोर्ड के साथ एक टैबलेट पर आपने जिस ऐप को विकसित और परीक्षण किया था, वह असली दुनिया तक पहुंचने के बाद कुत्तों के पास गया था (-