2010-09-29 7 views
9

का कारण नहीं है I एंड्रॉइड एसडीके के साथ एक काफी मानक ऐप कार्यान्वित कर रहा है जिसमें SurfaceView, SurfaceHolder, Callback सेटअप का उपयोग करके ड्राइंग शामिल है।एंड्रॉइड SurfaceHolder.unlockCanvasAndPost() redraw

मेरे मुख्य धागे (यूआई थ्रेड) में मेरे पास SurfaceHolder (या कैनवास जिसे आप पुनर्प्राप्त करते हैं) का कोई चित्र या हैंडलिंग नहीं है।

एक अलग थ्रेड में मैं निम्नलिखित है:

Log.i("GAME.DrawThread", "run()"); 
     Log.i("GAME.DrawThread", Thread.currentThread().getName()); 
     Canvas canvas = null; 
     try { 
      canvas = holder.lockCanvas(); 
      synchronized(holder) { 
       Log.i("GAME", "draw():synchronized"); 
       Paint paint = new Paint(); 
       paint.setColor(R.color.draw_color); 
       canvas.drawColor(R.color.draw_color); 
       canvas.drawLine(0, 0, 500, 500, paint); 
      } 
     } catch (SurfaceHolder.BadSurfaceTypeException e) { 
      Log.e("GAME", "onDraw(): BadSurfaceTypeException"); 
     } finally { 
      if (canvas != null) { 
       holder.unlockCanvasAndPost(canvas); 
      } 
     } 

इस कोड को निष्पादित किया जा रहा है, कोई अपवाद नहीं फेंकता है, और कोई नकारात्मक पक्ष प्रभाव है कि मैं पा सकते हैं नहीं है; हालांकि, अनलॉक कैनवास एंडपोस्ट() कॉल कभी भी ड्रा() को कॉल करने का कारण नहीं बनता है।

दूसरे शब्दों में, unlockCanvasAndPost() SurfaceView का एक रेड्रो नहीं बनाता है।

कोई विचार जो इस लक्षण का कारण बन सकता है? मेरे पास बहुत सारे जावा अनुभव हैं, एंड्रॉइड अनुभव की एक उचित मात्रा है, और बहुत सारे डिबगिंग अनुभव हैं और इसे ट्रैक नहीं कर सकते हैं।

अग्रिम धन्यवाद।

+0

यह कोड अब एंड्रॉइड 4.3 –

उत्तर

0

ऐसा नहीं है कि SurfaceView कैसे काम करता है। कॉलिंग अनलॉक कैनवास एंडपोस्ट() ड्रॉ() पर नहीं आती है, यह SurfaceView का उपयोग करने का पूरा बिंदु है। एक SurfaceView की सतह एक अलग खिड़की में रहता है।

+1

में दुर्घटनाग्रस्त है, लेकिन यह समस्या का समाधान नहीं करता है। स्क्रीन पर लिखने वाले कैनवास को पोस्ट करने के लिए जो भी तंत्र उपयोग किया जाता है, उसे लागू नहीं किया जा रहा है। – cblades

+2

आप समझ में नहीं आता कि समस्या क्या है। यह कैसे काम नहीं कर रहा है? –

+0

हाँ रोमेन गाय कृपया इस conundrum को हल करने में हमारी मदद करें: पी –

10

तो यह पता चला है कि SurfaceView का उपयोग करते समय आप एक सतह के नीचे एक सतह पर आते हैं। मैं एक्सएमएल में व्यू का पृष्ठभूमि रंग सेट कर रहा था; यह पता चला है कि खिड़की के पृष्ठभूमि रंग सेट करता है, सतह नहीं। असल में, मैंने विंडो अपारदर्शी बना दिया ताकि आप नीचे की सतह को नहीं देख सकें।

सबक सीख लिया गया।

+0

वाह, निम्नलिखित के लिए धन्यवाद! मुझे एक ही समस्या थी और यह नहीं पता था कि इसे खोजने में कितना समय लगेगा। यहां समाधान मिलने से पहले मैंने कुछ घंटों बिताए। ओह। – spartygw

+0

मुझे जवाब देने के लिए घंटों के लिए खुदाई हुई है कि 'अनलॉक कैनवास एंडपोस्ट()' स्क्रीन रीफ्रेश नहीं करेगा, हालांकि सभी ड्राइंग विधियों को निष्पादित किया गया था ... आखिर में आपके उत्तर में आया और मुझे एहसास हुआ कि यह मेरा बराबर मुद्दा था, मैं एक काला पृष्ठभूमि स्थापित कर रहा था दृश्य के लिए और सतहदृश्य इसके नीचे चित्रित कर रहा था .. मैं लगभग पहले ही पागल हो गया: पी – JorgeGRC

0

यह पुराना है, लेकिन मुझे कोई एहसास है कि कोई सतह धारक कॉलबैक नहीं है। वह सतह बनाने से पहले सतह पर आकर्षित करने की कोशिश कर रहा था