2013-04-26 10 views
22

तक शुरू नहीं हो रहा है मुझे AlphaAnimation के साथ एक अजीब समस्या है। यह AsyncTask हैंडलर कहलाता है जब बार-बार चलना माना जाता है।एनीमेशन यूआई अपडेट या टच इवेंट

हालांकि, पहली बार हैंडलर को Activity में बुलाया जाता है, तब तक एनीमेशन तब तक शुरू नहीं होगा जब तक कि मैं स्क्रीन को स्पर्श नहीं करता या यूआई अपडेट नहीं होता (उदाहरण के लिए फोन के मेनू बटन दबाकर)।

अजीब बात यह है कि एक बार एनीमेशन कम से कम एक बार चलाए जाने पर, बिना किसी समस्या के शुरू होने पर यह समस्या के बिना शुरू हो जाएगा।

यहाँ कोड लग रहा है की तरह है:

// AsyncTask handler 
public void onNetworkEvent() 
{ 
    this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() 
    { 
     flashScreen(Animation.INFINITE); 
    } 
    }); 
} 

// Called method 
private void flashScreen(int repeatCount) 
{ 
    final View flashView = this.findViewById(R.id.mainMenuFlashView); 

    AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); 
    alphaAnimation.setRepeatCount(repeatCount); 
    alphaAnimation.setRepeatMode(Animation.RESTART); 
    alphaAnimation.setDuration(300); 
    alphaAnimation.setInterpolator(new DecelerateInterpolator()); 
    alphaAnimation.setAnimationListener(new Animation.AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) 
    { 
     flashView.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void onAnimationEnd(Animation animation) 
    { 
     flashView.setVisibility(View.GONE); 
    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { } 
    }); 

    flashView.startAnimation(alphaAnimation); 
} 

मैं देखा है कि runOnUIThread आवश्यक नहीं है (एक ही परिणाम होते हैं अगर मैं इसे का उपयोग नहीं करते), लेकिन मैं इसे रखने पसंद करते हैं के रूप में मैं नहीं कर रहा हूँ यूआई थ्रेड पर।

इस पर कोई विचार क्या हो सकता है?

+0

आपके कॉल अनुक्रम को समझने के लिए बहुत कम कोड। क्या आप Asynctask के निष्पादन के आसपास के हिस्से को पोस्ट कर सकते हैं? साथ ही, क्या आपने क्या चल रहा है यह देखने के लिए प्रासंगिक तरीकों से प्रवेश लॉग करने का प्रयास किया है? – ilomambo

+0

एनीमेशन को पहली बार कुछ सेकंड तक देरी करने का प्रयास करें। यह दृश्य हो सकता है जब दृश्य तैयार होने से पहले एनीमेशन चलाने की कोशिश कर रहे हों। –

उत्तर

39

एक छोटे से अधिक शोध से पता चला है कि मेरी समस्या एक ही एक इस सवाल था: Layout animation not working on first run

flashView की दृश्यता डिफ़ॉल्ट रूप से GONE स्थापित किया गया था (Animation तुरंत शुरू करने के लिए नहीं के कारण के रूप View कभी नहीं किया गया था प्रदान की गई), तो मैं बस INVISIBLE करने के लिए इसे flashView.startAnimation()

+0

धन्यवाद, अविश्वसनीय बनाने में मेरी मदद की। – Vasanth

0

यह आसान नहीं है। जब तक आपको कोई वास्तविक उत्तर नहीं मिल जाता: एनीमेशन स्टार्ट ऑननेटवर्क द्वारा ट्रिगर किया जाता है। चूंकि हम शेष कोड को नहीं जानते हैं, आपको वहां देखना चाहिए, किसी अन्य ईवेंट द्वारा नेटवर्कवर्क को बदलने की कोशिश करें जिसे आप आसानी से पहचान सकते हैं, बस शेष कोड ठीक है या यदि यह केवल ट्रिगर है तो डीबग करने के लिए इसके लिए ज़िम्मेदार

+1

मैं भी आसानी से ट्रिगर कर सकता हूं, और यह काम कर रहा है। डिबगिंग से पता चलता है कि 'एनीमेशन लिस्टर' की 'ऑनमिशन स्टार्ट' पर तब तक कॉल नहीं किया जाता है जब तक कि मैं पहली बार यूआई के साथ बातचीत नहीं करता। – Jukurrpa

+0

@ जुकरुरपा क्या यह समस्या सभी एंड्रॉइड संस्करणों या कुछ विशिष्ट संस्करणों पर लागू होती है? – Kai

+0

@ काई मेरे पास केवल 4.1 और 4.2 डिवाइस हैं, इसे करने के लिए, और यह दोनों पर करता है। – Jukurrpa

21

बुला तो स्थापित करने ViewVISIBLE लिए काम नहीं करेगा, के रूप में मेरे मामले में था, यह मदद की मुझे वें शुरू करने से पहले requestLayout() कॉल करने के लिए पहले निर्धारित करने की आवश्यकता ई Animation, इसलिए जैसे:

Animation an = new Animation() { 
... 
view.requestLayout(); 
view.startAnimation(an); 

मेरे मामले में, मेरा View0dip उच्च जो बुलाया जा रहा से onAnimationStart रोका, इस मुझे उस समस्या को हल करने में मदद की।

+2

एंड्रॉइड के कुछ संस्करणों पर भी यह काम नहीं करता है अगर ऊंचाई या चौड़ाई के मूल्य की शुरूआत 0 डीआईपी है। मेरे मामलों में से मुझे 1 डीप का प्रारंभिक मूल्य बनाना था और मार्जिन के कारण दृश्य दिखाई नहीं दे रहा था। और इससे मदद मिली, एनीमेशन सभी संस्करणों पर काम किया। – Oknesif

1

यह मेरे लिए काम किया:

view.setVisibility(View.VISIBLE); 
view.startAnimation(animation); 

मैं, viewVISIBLE को (INVISIBLE नहीं, न तो GONE) स्थापित करने के लिए यह चेतन करने के लिए आवश्यक दृश्य renderization पैदा कर रहा था।

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