2013-03-26 8 views
6

के विचारों को जोड़ने/हटाने के दौरान NullPointerException हाय मैं नीचे से ऊपर तक एक छवि और एनिमेट बनाना चाहता हूं और 1.0 से 0.0 तक अल्फा बदलना चाहता हूं।रिलेवेटलाइट (एनिमेशन)

/** 
* Starts to make fog 
*/ 
private void startFogGenerator() { 

    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 

      final ImageView img = new ImageView(Activity.this); 

      boolean showN1 = r.nextBoolean(); 
      if (showN1) { 
       img.setImageResource(R.drawable.nube_01); 
      } else { 
       img.setImageResource(R.drawable.nube_02); 
      } 

      Animation animation = AnimationUtils.loadAnimation(Activity.this, R.anim.translate_and_alpha); 
      animation.setAnimationListener(new Animation.AnimationListener() { 
       @Override 
       public void onAnimationStart(Animation animation) { 
       } 

       @Override 
       public void onAnimationEnd(Animation animation) { 

        fogLayout.removeView(img); 
        fogLayout.invalidate(); 
        // always true? Maybe but just check for for concurrency safe. 
        if (setFogN(false) < MAX_CLOUDS_ON_SCREEN) { 
         startFogGenerator(); 
        } 

       } 

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


      int pxWidth = Tools.toPx(140, getResources()); // Width of layout container 
      int paddingWidth = Tools.toPx(20, getResources()); 
      int x = r.nextInt(pxWidth - paddingWidth - paddingWidth) + paddingWidth; 

      int range = Tools.toPx(50, getResources()); 

      int width; 
      int height; 
      if (showN1) { // nube01: 167x226 
       width = r.nextInt(Tools.toPx(167, getResources()) - range) + range; 
       height= r.nextInt(Tools.toPx(226, getResources()) - range) + range; 
      } else { // nube01: 144x177 
       width = r.nextInt(Tools.toPx(144, getResources()) - range) + range; 
       height= r.nextInt(Tools.toPx(177, getResources()) - range) + range; 
      } 

      Log.d("Animation", "X: " + x + ", Width: " + width + ", Height: " + height); 

      //img.setPadding(x, 0, 0, 0); 
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height); 
      params.leftMargin = x; 
      fogLayout.addView(img, params); 
      img.setBackgroundColor(Color.argb(255, r.nextInt(255),r.nextInt(255),r.nextInt(255))); // just for debug 
      img.startAnimation(animation); 
      setFogN(true); 

     } 
    }, r.nextInt(2500 - 200) + 200); 

} 
private final static int MAX_CLOUDS_ON_SCREEN = 3; 
private AtomicInteger currentFogs = new AtomicInteger(0); 
private synchronized int setFogN(boolean increment) { 

    int toReturn = increment ? currentFogs.incrementAndGet() : currentFogs.decrementAndGet(); 

    Log.d("TeaAnim", "ToReturn: "+ toReturn); 

    return toReturn; 

} 

ठीक काम करता है, लेकिन जब 3th दृश्य दूर करता है और किसी अन्य समय शुरू होता है, यह NullPointerException साथ दुर्घटनाओं, हो सकता है संगामिति की समस्या है: मैं इस कोड (मैं onCreate विधि में 3 बार 3 एनिमेटेड छवियों बनाने के लिए कहते हैं) है? मैं इसे कैसे ठीक कर सकता हूं?

अपवाद:

ERROR/AndroidRuntime(10736): FATAL EXCEPTION: main 
    java.lang.NullPointerException 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2796) 
    at android.view.View.getDisplayList(View.java:12648) 
    at android.view.View.getDisplayList(View.java:12694) 
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
    at android.view.View.getDisplayList(View.java:12588) 
    at android.view.View.getDisplayList(View.java:12694) 
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
    at android.view.View.getDisplayList(View.java:12588) 
    at android.view.View.getDisplayList(View.java:12694) 
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
    at android.view.View.getDisplayList(View.java:12588) 
    at android.view.View.getDisplayList(View.java:12694) 
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
    at android.view.View.getDisplayList(View.java:12588) 
    at android.view.View.getDisplayList(View.java:12694) 
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
    at android.view.View.getDisplayList(View.java:12588) 
    at android.view.View.getDisplayList(View.java:12694) 
    at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1198) 
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:2173) 
    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2045) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1854) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
    at android.view.Choreographer.doFrame(Choreographer.java:532) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
    at android.os.Handler.handleCallback(Handler.java:725) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5204) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 
    at dalvik.system.NativeStart.main(Native Method) 

नोट्स: fogLayout एक निश्चित चौड़ाई और ऊंचाई के साथ एक RelativeLayout है (डी पी में) Tools.toPx एक विधि है कि पिक्सल के

उत्तर

9

हल डीपी से coverts है, बस को सूचित करें कि हैंडलर मैं के साथ दृश्य निकाल रहा हूँ:

handler.post(new Runnable() { 
    public void run() { 
     fogLayout.removeView(img); 
    } 
}); 
+0

यह मेरे माता पिता से Viee दूर करने के लिए मदद, लेकिन अगर एक बार एनीमेशन अंत देखने के संसाधन (बीजी) बदलना चाहते हैं ... एक ही resource..any विचार बदलने के लिए काम नहीं कर रहा है? – CoDe

0

सी nce मैं नहीं कर सकते कि कैसे एक टिप्पणी पोस्ट करने लगता है, यहाँ मेरा उत्तर

  1. है अगर आप

    RelativeLayout fogLayout बनाया आप हमें नहीं दिखा था,

    ऑनक्रेट (बंडल सहेजा गया इंस्टेंस) { fogLayout = (RelativeLayout) findViewById (R.id.idOfFogLayout); }

  2. यह स्पष्ट नहीं है कि आपका हैंडलर शून्य नहीं है;

  3. आप कुछ चर कई बार पुन: उपयोग कर रहे हैं, उन्हें क्यों एक बार पूरी तरह से उन्हें हर बार फिर से परिभाषित करने

  4. के बजाय जोड़ने और दृश्य हटाने की निर्धारित करें और उन्हें पुन: उपयोग नहीं बजाय, आप क्यों नहीं हैं सिर्फ उन्हें अदृश्य जब की स्थापना उन पर एनीमेशन लागू करने

+0

1 - मुझे लगता है कि यह प्रासंगिक नहीं है, मैं आपको नोट्स में कहता हूं जो एक सापेक्ष लयआउट है। 2- हैंडलर शून्य नहीं है, स्टैकट्रैक दिखाता है कि नलपॉइंटर एंड्रॉइड कोड से है और मेरा नहीं। 3- समझ में नहीं आता कि मैं क्या कर रहा हूं। 4- मैंने सोचा कि इस तरह से नहीं पता कि बेहतर क्या है। – PaNaVTEC

+0

आपके द्वारा लिखे गए अधिकांश कोड का पुन: उपयोग किया जा रहा है उदाहरण के लिए रननेबल कार्य, और एनीमेशन एनिम = एनीमेशनउटिल। लोडएनीमेशन (आर.एनिम ...); आपको हर बार एनीमेशन पुनः लोड करने की आवश्यकता क्यों है? फाइल रन के बीच में बदलती है? इसके लिए एनीमेशन श्रोता प्रत्येक बार जब आप हैंडलर.postDelayed (thesametaskfrombefore, somedelay) को कॉल कर रहे हैं; एक बार कार्य को परिभाषित क्यों नहीं करें? और इसे खत्म करो? –

+0

एनीमेशन श्रोता में माता-पिता में बनाई गई छविदृश्य के नए उदाहरण का संदर्भ शामिल है। विधि भी पुनरावर्ती है। लोडएनीमेशन को निश्चित रूप से बाहर घोषित किया जा सकता है। लेकिन यह समस्या हल नहीं करता है। समस्या हैडलर के बिना हटाए गए व्यू व्यू। – PaNaVTEC

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