2010-06-11 8 views
21

मैं एक गेम बना रहा हूं और मैं उसे एक सरल "स्कोर" प्रदर्शित करना चाहता हूं-खिलाड़ी को श्रेय दिया जाता है जब उसे श्रेय दिया जाता है।एनीमेशन समाप्त होने पर दृश्य को कैसे निकालें?

public class Score extends FrameLayout { 

    public Score(Context context, int score) { 
    super(context); 
    TextView txt = new TextView(context); 
    txt.setText(String.valueOf(score).toUpperCase()); 
    addView(txt); 
    Animation anim = AnimationUtils.loadAnimation(context, R.anim.score); 
    startAnimation(anim); 
    anim.setAnimationListener(animationListener); 
    } 
    private void Remove(){ 

    ViewGroup parent = (ViewGroup)getParent(); 
    parent.removeView(this); 

    } 
    private AnimationListener animationListener = new AnimationListener() { 

    @Override 
    public void onAnimationEnd(Animation animation) { 

     Remove(); 
    } 
    }; 
} 

इस कोड को वास्तव में जब तक किसी भी समय स्क्रीन पर केवल एक स्कोर एनीमेशन है के रूप में बहुत अच्छी तरह से काम करता है: यह दृश्य मैं स्क्रीन पर फेंक है। यदि खिलाड़ी स्कोर को हटा देता है, तो आखिरी स्कोर हटा दिए जाने से पहले, ऐप क्रैश हो जाता है - शायद क्योंकि दूसरा स्कोर एनीमेशन के दौरान खुद को हटाने के लिए ईवेंट प्राप्त करता है .. क्या यह एनीमेशन का उपयोग करने का एक बुरा अभ्यास है? आप लोग इसे कैसे संभालेंगे?

उत्तर

35

मैंने यह भी पाया कि इस दृश्य में एनीमेशन लागू करने के बाद अपने माता-पिता से एक दृश्य को हटाते समय (एनीमेशन एन्ड का उपयोग करके) प्रेषण पर एनपीई के साथ क्रैश होता है।

मुझे मिला एकमात्र समाधान एक पोस्ट कॉल के अंदर हटाने को ट्रिगर करना है। आम तौर पर यूआई थ्रेड पर सभी यूआई संशोधन किया जाना चाहिए, इसलिए मैंने गतिविधि पर एक रनऑनयू थ्रेड कॉल जोड़ा, लेकिन यह बेकार हो सकता है (यह मेरे बिना मेरे लिए काम करता है)।

Animation animation = AnimationUtils.loadAnimation(parentView.getContext(), animationId); 
animation.setAnimationListener(new AnimationListener() { 
    public void onAnimationStart(Animation paramAnimation) { } 
    public void onAnimationRepeat(Animation paramAnimation) { } 
    public void onAnimationEnd(Animation paramAnimation) { 
     // without the post method, the main UI crashes if the view is removed 
     parentView.post(new Runnable() { 
      public void run() { 
       // it works without the runOnUiThread, but all UI updates must 
       // be done on the UI thread 
       activity.runOnUiThread(new Runnable() { 
        public void run() { 
         parentView.removeView(view); 
        } 
       }); 
      } 
     }); 
    } 
}); 

view.setVisibility(visibility()); 
view.startAnimation(animation); 
+13

'runOnUiThread' हल जरूरी नहीं है। एक दृश्य में एक पोस्ट करने से ui धागे में चलने योग्य रन बन जाएगा। – Macarse

+1

धन्यवाद, मैं इस त्रुटि में भाग गया और दृश्य में पोस्ट करने से मुझे विचारों को हटाने की अनुमति मिली। यह _weird_ है कि एक एनीमेशन श्रोता ui धागे में नहीं चल रहा है ... –

+5

मुझे लगता है कि यह पहले से ही ui धागे पर चल रहा है। एक संभावित कारण है कि पोस्ट() काम करता है (यह सिर्फ एक अनुमान है) यह है कि यदि आप सीधे एनीमेशन श्रोता विधियों में दृश्य को हटाते हैं, तो उन्हें ड्रॉ लॉजिक निष्पादन से पहले बुलाया जाएगा और आप एनपीई का सामना करेंगे। उदाहरण के लिए प्रत्येक दृश्य में ड्राइंग से पहले इसका एनिम स्टेट अपडेट हो सकता है, और यदि एनिम समाप्त हो जाता है तो आपके श्रोता विधियों को कॉल किया जाता है। जब आप एक रननेबल पोस्ट करते हैं तो उसे लूपर द्वारा कतारबद्ध किया जाएगा जो इस फ्रेम के लिए दृश्य पदानुक्रम अपडेट/ड्रा लॉजिक समाप्त होने के बाद तक किसी भी संदेश को संसाधित नहीं करेगा। सब ui धागा हो सकता है – Dori

0

का उपयोग करते समय AnimationUtils.loadAnimation view.clearAnimation() मेरी समस्या

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

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