2010-04-13 9 views
7

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

मेरी समस्या को स्पष्ट करने में सहायता के लिए कुछ कोड प्रस्तुत करने से पहले इस पर विचार करें: मैं अपना पहला "असली" एंड्रॉइड प्रोग्राम बनाने के लिए एंड्रॉइड के चंद्र लैंडर उदाहरण का उपयोग कर रहा हूं। उस उदाहरण में, ज़ाहिर है, वहां एक कक्षा लुनर व्यू मौजूद है, और उसमें लंदन थ्रेड में घिरा हुआ वर्ग है। मेरे कोड में क्रमशः इन वर्गों के समकक्ष ग्राफिक्स और ग्राफिक्स थ्रेड हैं।

इसके अलावा मैं एंड्रॉइड पर 2 डी में बस स्प्राइट एनिमेशन बना सकता हूं। मेरे पास एक प्लेयर क्लास है, और मान लें कि ग्राफिक्स थ्रेड में प्लेयर प्लेयर है जिसे "प्लेयर" कहा जाता है। इस वर्ग में चार निर्देशांक हैं - x1, y1, x2, और y2 - और वे एक आयत को परिभाषित करते हैं जिसमें स्प्राइट खींचा जाना है। मैंने इसे काम किया है ताकि मैं इसे पूरी तरह से संभाल सकूं। जब भी डूड्रा (कैनवास कैनवास) विधि लागू की जाती है, तो यह केवल उन निर्देशांक के मानों को देखेगी और तदनुसार स्प्राइट खींचेगी।

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

यह भी ध्यान रखें कि ग्राफिक्स में ग्राफिक्स थ्रेड सदस्य को "थ्रेड" कहा जाता है, और ग्राफिक्स थ्रेड में SurfaceHolder सदस्य को "mSurfaceHolder" कहा जाता है।

तो वर्ग ग्राफिक्स में इस विधि पर विचार करें:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent msg) { 
    return thread.keyDownHandler(keyCode, msg); 
} 

इसके अलावा वर्ग GraphicsThread में इस विधि पर विचार करें:

boolean keyDownHandler(int keyCode, KeyEvent msg) { 
    synchronized (mSurfaceHolder) { 
     if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { 
      player.x1 = 100; 
      player.y1 = 100; 
      player.x2 = 120; 
      player.y2 = 150; 
     } 
    } 
    return true; 
} 

अब तो यह सोचते हैं कि खिलाड़ी के निर्देशांकों के रूप में (200, 200, 220 से शुरू , 250), जब मैं डीपैड दबाता हूं तो वह कुछ अलग क्यों नहीं करेगा: बाएं?

धन्यवाद!

+2

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

+1

क्या आप वाकई कैनवास को उचित रूप से पुनर्भुगतान कर रहे हैं? एक दृश्य को तैयार करने के लिए अमान्य() को कॉल करें – YGL

उत्तर

1

इससे पहले कि मैं वास्तविक आंदोलन और जैसे मैं प्रवेश करने पर विचार करेंगे के बारे में चिंता है ...

कुछ की तरह:

Log.d("lunar", "keyCode = ["+String.valueOf(keyCode)+"] // msg = ["+String.valueOf(msg)+"]"); 

में ऐसा करने से मुझे लगता है कि मैं पंजीकृत डेटा के साथ क्या करता हूं, इसके बारे में चिंता करने से पहले सिस्टम क्या पंजीकरण कर रहा है, इसके बारे में मुझे महसूस हो सकता है ... उसके बाद आप यह तय कर सकते हैं कि आप इसे सही सामान भी भेज रहे हैं और फिर थ्रेड काम आदि के बारे में चिंता कर सकते हैं।

उम्मीद है कि निदान करने आदि में मदद कर सकते (यह सब मुक्तहस्त लिखा गया था, त्रुटियां हो सकती हैं)