2012-03-03 20 views
6

में समस्या पर क्लिक करें मैंने स्क्रीन पर गेंद को प्रदर्शित करने के लिए एंड्रॉइड में एक कस्टम दृश्य बनाया है। अब मैं चाहता हूं कि जब मैं उस गेंद को छूता हूं तो उसे चार भागों में विस्फोट करना चाहिए और प्रत्येक भाग को चार अलग-अलग दिशाओं को ऊपर, नीचे, बाएं, दाएं स्थानांतरित करना चाहिए। मुझे पता है कि मुझे गेंद पर स्पर्श का पता लगाने के लिए टच श्रोता सेट करना है, लेकिन फिर विस्फोट प्रभाव कैसे बनाया जाए? यह समस्या अब हल हो गई है। मैं स्क्रीन पर कई गेंदों को प्रदर्शित कर रहा हूं ताकि उपयोगकर्ता उस पर क्लिक कर उन्हें विस्फोट कर सके। एक को छोड़कर समान गुणों के साथकस्टम ऑब्जेक्ट एंड्रॉइड

public class BallView extends View { 
    private float x; 
    private float y; 
    private final int r; 
    public BallView(Context context, float x1, float y1, int r) { 
     super(context); 
     this.x = x1; 
     this.y = y1; 
     this.r = r; 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawCircle(x, y, r, mPaint); 
    } 

} 

SmallBall दिशा है और एक में दिशा और एनीमेशन झंडा ले जाने के लिए यह आगे बढ़ रोकने के लिए विधि विस्फोट कि:

यहाँ मेरी कस्टम दृश्य है।

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout android:id="@+id/main_view" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#FF66FF33" /> 

मैं गतिविधि वर्ग के लिए BallView और SmallBall जोड़ रहा इस प्रकार है::

final FrameLayout mainFrameLayout = (FrameLayout) findViewById(R.id.main_frame_layout); 

SmallBall[] smallBalls = new SmallBall[4]; 
smallBalls[0] = new SmallBall(getApplicationContext(), 105, 100, 10, 1, false); 
smallBalls[0].setVisibility(View.GONE); 
mainFrameLayout .addView(smallBalls[0]); 
// create and add other 3 balls with different directions. 

BallView ball = new BallView(getApplicationContext(), 100, 100, 25, smallBalls); 
listener = new MyListener(ball); 
ball.setOnClickListener(listener); 

mainFrameLayout.addView(ball); 

मैं कई BallView और उनके रिश्तेदार जोड़ रहा

private final int direction; 
private boolean anim; 

public void explode() { 
    // plus or minus x/y based on direction and stop animation if anim flag is false 
    invalidate(); 
} 

मेरे लेआउट एक्सएमएल इस प्रकार है विभिन्न पदों पर SmallBall सरणी। अब क्या होता है इससे कोई फर्क नहीं पड़ता कि मैं आखिरी बार स्क्रीन पर क्लिक करता हूं, बॉलव्यू विस्फोट शुरू होता है। उस दूसरे अंतिम के बाद, और इसी तरह। तो यहां 2 मुद्दे हैं:

  1. यह ऑनक्लिक/ऑन टच इवेंट पर क्यों कॉल करता है इससे कोई फर्क नहीं पड़ता कि मैं स्क्रीन पर क्लिक करता हूं? जब मैं विशेष BallView पर क्लिक करता हूं तो इसे केवल श्रोता ईवेंट को कॉल करना चाहिए।
  2. और दूसरी बात यह है कि BallView लेआउट में जोड़े जाने के तरीके के विपरीत तरीके से विस्फोट शुरू कर देता है?

मेरे श्रोता वर्ग:

public void onClick(View v) { 
     BallView ballView = (BallView) v; 
     ballView.setVisibility(View.GONE); 
     //get small balls associated with this ball. 
     //loop through small ball and call their explode method. 
    } 

मैं प्रश्न में चरित्र सीमा के कारण कोड छंटनी की है।

+0

विस्फोट प्रभाव के लिए कोडिंग में आपको क्या समस्या है? क्या आप भागों या विस्फोट ग्राफिक्स के आंदोलन की एनीमेशन चाहते हैं? यह बेहतर होगा अगर आप एक तस्वीर या कुछ जो आप प्राप्त करना चाहते हैं प्रदान कर सकते हैं। – noob

+0

@ निर्माता: मैं क्या चाहता हूं जब कोई किसी भी गेंद पर क्लिक करता है तो उसे चार छोटी गेंदों में विस्फोट करना चाहिए और प्रत्येक दीवार को चार दिशाओं में से एक में स्थानांतरित करना चाहिए। मुझे यकीन नहीं है कि इसके लिए क्या उपयोग करना है क्योंकि मैं एंड्रॉइड के लिए नया हूं। विस्फोटित हिस्सों की एनीमेशन हो सकती है अच्छा विकल्प होगा। –

+0

मेरा उत्तर देखें – noob

उत्तर

1

मुझे नहीं लगता कि आपको इसे कैनवास में हार्डकोड करने की आवश्यकता है। आप टच श्रोता में ball.setVisibility(View.GONE) पर कॉल कर सकते हैं और प्रत्येक छोटी गेंद के लिए smallBall.setVisibility(View.Visible) का उपयोग करके 4 अतिरिक्त गेंदों को दिखा सकते हैं। इस तरह आप बड़ी गेंद को छिपाने में सक्षम होंगे और छोटी गेंदें दिखा सकते हैं। अब आंदोलन प्रभाव के लिए, प्रत्येक छोटी गेंद में एक विधि हो सकती है जहां दिशा पारित करने की आवश्यकता होती है और आप इसे इस छोटे Ball.explode (दिशा) की तरह कॉल कर सकते हैं। विधि कार्यान्वयन हो सकता है

explode(int direction){//can be String 
    if(direction=NORTH) 
    y--; 
    //other condition checks 
} 

विस्फोट विधि उनके एक्स बदल रहा शुरू कर देंगे और y समन्वय, दिशा पारित कर दिया पर आधारित है। मुझे उम्मीद है कि यह आपको इसे कार्यान्वित करने के बारे में संकेत देगा।

+0

धन्यवाद .मैं यह कोशिश करूंगा और आपको बता दूंगा। –

+0

स्मॉलबॉल को स्थानांतरित करने के लिए बार-बार विस्फोट कैसे कॉल करें? एक बात यह है कि मैं फ्रेमलेआउट में गेंद जोड़ रहा हूं, अब मैं कॉल बॉल के बाद उस लेआउट में छोटी गेंद कैसे जोड़ सकता हूं .सेट दृश्यता (देखें। GONE); –

+0

इसे छोटेबाल की ऑनड्रा() विधि में रखें और यदि इसमें अमान्य() कॉल है, तो यह स्वचालित रूप से इसे हर बार कॉल करेगा। बस एक बूलियन ध्वज या हालत याद रखें जो विस्फोट() को ट्रिगर करता है और जब आप इसे चाहते हैं तो इसे रोक देता है। – noob

0

यह सब कुछ हो रहा है क्योंकि आप बॉल ऑब्जेक्ट के लेआउट पैरामीटर निर्दिष्ट नहीं कर रहे हैं। यहां क्या होता है जब आप लेआउट पर बॉल ऑब्जेक्ट जोड़ते हैं तो यह पूरे लेआउट की जगह लेता है और यही कारण है कि यह स्क्रीन पर कहीं भी क्लिक करने के लिए प्रतिक्रिया करता है।

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

तो गेंद ऑब्जेक्ट्स में उचित लेआउट पैरामीटर सेट करने के बाद आपके दोनों मुद्दे हल हो जाएंगे।

+0

मुझे आपका अंक नहीं मिल रहा है। क्या आप कुछ उदाहरण कोड दिखा सकते हैं? –

+0

@mark किस भाग? –

1

ठीक है, समस्या BallView और SmalBall के निर्माण के दौरान View वस्तुओं के निर्माण के दौरान है। मुझे लगता है कि मैं इसे पूरी तरह से समझा सकता हूं, इसलिए मेरे साथ सहन करें:

शुरू करने के लिए एक अच्छी जगह एक स्तरित केक के साथ है। रसोई में खड़े होने और इस तरह के केक बनाने के बारे में सोचें: एक समय में एक परत जोड़ना। सबसे पहले चॉकलेट परत, और फिर वेनिला परत और फिर एक और चॉकलेट परत। अच्छा प्रतीत होता है? ठीक है।

इसलिए, हलकों का एक बहुत एक Canvas और अलग से, Ball वस्तुओं View रों के रूप में जुड़ जाते हैं पर तैयार किया जा रहा है। ध्यान दें कि कैनवास बस उस आयत का प्रतिनिधित्व करता है जिसके साथ उपयोगकर्ता बातचीत कर सकता है, और View - FrameLayout से आपके कोड में जुड़ा हुआ है। सभी उद्देश्यों और उद्देश्यों के लिए, Canvas पूरी तरह से FrameLayout भर रहा है। आपके ऐप में, Canvas केक की निचली परत है - ContentView (या पैन) की चौड़ाई और ऊंचाई दोनों को भरना।

m.addView(View v) के लिए हर कॉल अनिवार्य रूप से हालांकि कई View वस्तुओं के शीर्ष पर एक नया View v दे रहा है पहले से ही m में शामिल हैं। केक के मामले में, addView पर प्रत्येक कॉल हमारे परत केक में एक और परत जोड़ रही है।

अपनी प्रोजेक्ट में, आप केक में एक परत जोड़ना चाहते हैं लेकिन पूरे पैन को भरना नहीं है। आप शीर्ष पर कुछ स्ट्रॉबेरी डालना चाहते हैं, आप स्ट्रॉबेरी की पूरी परत नहीं चाहते हैं।

तो, डिफ़ॉल्ट रूप से, आपकी BallView ऑब्जेक्ट्स पूरी स्क्रीन ले रही हैं। प्रत्येक कैनवास भरने के बाद, अगले के शीर्ष पर पिलिंग कर रहा है। जब आप क्लिक करते हैं, तो यह अंतिम को हटा देता है - क्योंकि आखिरी वाला शीर्ष पर है, और पूरे कैनवास की चौड़ाई और ऊंचाई ले रहा है - और वास्तव में केवल गेंद है जिसे उपयोगकर्ता संभवतः क्लिक कर सकता है।

तो आपको अपने BallViewView ऑब्जेक्ट्स को उसी आकार के रूप में बताना होगा जैसा आप Canvas ऑब्जेक्ट पर खींच रहे हैं।

आप केवल एक RelativeLayout साथ पूर्ण स्थिति कर सकते हैं:

तो, क्या यहां एक जोड़े मुद्दे हैं। यदि आप BallView चाहते हैं तो उपयोगकर्ता कैनवास पर खींचे जाने वाले सर्कल के शीर्ष पर होने के लिए क्लिक कर सकते हैं, आपको BallView कहां स्थित है, और उस स्थिति को गतिशील रूप से बदलने का तरीका चाहिए। वर्तमान में आप FrameLayout का उपयोग कर रहे हैं, जो Canvas के लिए आवश्यक है - इसलिए अपने एक्सएमएल में, एक पूर्ण स्क्रीन <RelativeLayout> जोड़ें। और फिर, अपने कोड में, BallView ऑब्जेक्ट्स को इसके बजाय RelativeLayout पर जोड़ें।

और फिर, अंत में यहाँ

जाओ:

Set the absolute position of a view

गुड लक!

+0

थ्नक्स। लेआउट पैराम सेट करना मदद करता है। अच्छे खर्च। –

संबंधित मुद्दे