2015-10-22 12 views
6

के साथ पहले लोड पर काम नहीं कर रहा है। मैं पिकासो का उपयोग कर किसी URL से ImageView में एक छवि लोड करने का प्रयास कर रहा हूं।साझा तत्व संक्रमण पिकासो

साझा संक्रमण की छवि के अंदर RecyclerView में और दूसरा यह केवल लीनियरलाउट में है। पहली बार अनुरोध किए जाने पर तत्व एनिमेट नहीं होता है क्योंकि पिकासो को छवि को दृश्य में लोड करने की आवश्यकता होती है, लेकिन बाद के अनुरोधों पर यह ठीक है।

मैं कैसे सुनिश्चित कर सकता हूं कि संक्रमण शुरू करने से पहले ImageView सफलतापूर्वक पॉप्युलेट किया गया है?

उत्तर

24

समाधान postponeEnterTransition() और startPostponedEnterTransition() कॉल का उपयोग करने में था ताकि यह सुनिश्चित किया जा सके कि पिकासो ने गतिविधि शुरू होने से पहले छवि को लोड में लोड करना समाप्त कर दिया हो।

This इस बारे में एक महान ब्लॉग प्रविष्टि है।

नीचे आप onCreate

ActivityCompat.postponeEnterTransition(this); 
Picasso.with(this.getApplicationContext()) 
    .load("https://goo.gl/oiyTor") 
    .noFade() 
    .fit() 
    .centerInside() 
    .error(R.drawable.user_placeholder_error) 
    .into(((ImageView) findViewById(R.id.game_view_image)), new Callback() { 
     @Override 
     public void onSuccess() { 
      ActivityCompat.startPostponedEnterTransition(targetActivity); 
     } 

     @Override 
     public void onError() { 
      ActivityCompat.startPostponedEnterTransition(targetActivity); 
     } 
    }); 
+0

इस हालांकि नई गतिविधि के प्रवेश को धीमा कर देती साथ बहुत अच्छी तरह से संबंधित है के साथ पिकासो की जगह ले सकता है, खासकर जब छवि को लोड करने धीमी है। – jiawen

+0

मैंने अभी एक ही चीज़ लागू की है और एक ही मुद्दे पर आ गया है। मुझे नहीं लगता कि साझा तत्व संक्रमण इस तरह इस्तेमाल किया जाना है। संक्रमण ड्रॉबल्स और स्थानीय पाठ के साथ सबसे अच्छा काम करता है। यह त्वरित HTTP कॉल के साथ काम कर सकता है लेकिन अगर वे उच्च गुणवत्ता वाले हैं तो छवियां त्वरित नहीं होती हैं। मुझे वास्तव में इस एनीमेशन के साथ ओओएम त्रुटियां मिल रही हैं इसलिए मैं इसे अलग करने और एक अलग एनीमेशन खोजने जा रहा हूं। ऐसा लगता है कि पहली बार त्वरित संक्रमण प्रदान करने के लिए स्मृति में एक ही गतिविधि के कई उदाहरण हैं। –

+0

पिकासो के fetch जैसे कुछ का उपयोग करके संक्रमण करने से पहले कैश को बीज करना सबसे अच्छा है http://square.github.io/picasso/2.x/picasso/com/squareup/picasso/RequestCreator.html#fetch-com.squareup .picasso.Callback-। –

4

में उपयोग कर सकते हैं कि आप क्या दर्ज संक्रमण की वजह से स्थगित प्रभाव से बचना चाहते हैं का एक उदाहरण है, आप का उपयोग करने के कैश में जो कुछ भी यह पहले से ही है पिकासो के लिए मजबूर कर सकते हैं:

Target target = new Target() { 
     @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     this.imageView.setImageBitmap(bitmap); 
     } 
     @Override public void onBitmapFailed(Drawable errorDrawable) {} 
     @Override public void onPrepareLoad(Drawable placeHolderDrawable) {} 
}; 
Picasso.with(context) 
     .load(url) 
     .networkPolicy(NetworkPolicy.OFFLINE) 
     .into(target); 

अपने ImageView एक, आप के लिए मजबूर हो जाएगा पिकासो के बजाय एक Target उदाहरण गुजर वितरित करने के लिए जो कुछ भी यह उस URL के लिए कैश की गई है के द्वारा। यदि आप इसके बजाय ImageView पास करते हैं, तो आपको तुरंत छवि लोड नहीं होगी।

कृपया ध्यान दें कि आपको अपनी लक्षित वस्तु को सदस्य चर में रखना चाहिए, क्योंकि इसे पिकासो द्वारा कमजोर संदर्भ के रूप में रखा जाता है, इसलिए आप इसे कचरा नहीं लेना चाहते हैं।

0

आपको सार्वभौमिक छवि लोडर जो इस समस्या

DisplayImageOptions options = new DisplayImageOptions.Builder() 
       .showImageOnLoading(drawable) 
       .showImageForEmptyUri(emptyDrawable) 
       .showImageOnFail(errorDrawable) 
       .resetViewBeforeLoading(false) 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) 
       .build(); 
     imageLoader.displayImage(url, iv, options); 
+1

में मदद करता है लेकिन रखरखाव 27 नवंबर 2015 से बंद हो गया। इसलिए, पिकासो से यूआईएल में स्विच करना एक बुरा विचार है। अधिक के लिए [देखें] (https://github.com/nostra13/Android- यूनिवर्सल- छवि- लोडर) – Shashanth

+1

हां यह सच है, लेकिन साझा छवि गतिविधि संक्रमण के साथ अच्छी तरह से काम करने वाली एकमात्र छवि लाइब्रेरी यूआईएल है –

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