0

Ich habe eine Übergangsanimation für gemeinsam genutzte Elementaktivitäten zwischen MainActivity (GridView) und DetailActivity implementiert. Wenn auf das Objekt geklickt wird, wird das Bild im Rasterelement vergrößert, um zum Hintergrundbild in DetailActivity zu werden. Ich habe den Übergang sehr glatt gemacht, indem ich das Bild auf der MainActivity in eine Datei gespeichert habe, dann benutze es als Platzhalterbild in DetailActivity, bevor das Bild mit der höheren Qualität über Picasso heruntergeladen wird. Wenn Picasso seine Aufgabe erledigt hat, wird das Bild mit höherer Qualität den Platzhalter sehr gut ersetzen.Wie verzögert man das Laden von Picasso-Bildern?

-Code von onCreateView() in DetailActivityFragment.java

ImageView iv = (ImageView) mRootview.findViewById(R.id.movie_poster); 
try { 
    // Prepare "InterimPoster" jpeg file to be placeholder image 
    Bitmap bitmap = BitmapFactory.decodeStream(c.openFileInput("InterimPoster")); 
    Picasso.with(c).load("http://image.tmdb.org/t/p/w780" + mMovieInfo[2]) 
      .placeholder(new BitmapDrawable(getResources(), bitmap)) 
      .fit() 
      .centerCrop() 
      .noFade() 
      .into(iv); 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

Wie für Animation, ich habe es wie in dem Link hier Schritt 1-3 https://guides.codepath.com/android/Shared-Element-Activity-Transition

implementieren jedoch manchmal ist es flackert, wenn die höhere Qualität Bild fertig heruntergeladen, bevor die Übergangsanimation abgeschlossen ist. Das einzoomende Bild wird während der Bewegung durch ein neues Bild ersetzt, was eine unangenehme Animation ist.

Also frage ich mich, wie kann ich dieses Flimmern beheben? Eine Sache, an die ich denken kann, ist, den Bild-Download zu verzögern, weil ich bereits ein Bild mit geringerer Qualität als Platzhalter habe. Wie kann ich das machen?

Here the video. Normalerweise ist es auf meinem Testgerät 80% der Zeit flüssig, aber glücklicherweise flackert es in diesem Video die meiste Zeit.

+0

Ich denke, das Flimmern ist wegen noFade(). Versuchen Sie, das zu entfernen. – user3215142

+0

Nein, ich setze absichtlich noFade() ein, denn sonst flackert es immer, auch wenn das Laden nach der Animation beendet ist. –

Antwort

0

Jetzt habe ich einen Weg zu verzögern Picasso Bild Laden (oder irgendeine andere Aufgabe) gefunden. Es ist sehr einfach mit der Verwendung von Handler and Runnable.

Jetzt sieht mein Code so aus. Der Image Replacement ist jetzt auf jeden Fall ziemlich flüssig.

// Set Background Poster in Try-catch in case file cannot be open 
    try { 
     // Get/Prepare "InterimPoster" jpeg file to be placeholder image 
     final ImageView iv = (ImageView) mRootview.findViewById(R.id.movie_poster); 
     final Bitmap bitmap = BitmapFactory.decodeStream(c.openFileInput("InterimPoster")); 
     final Drawable lowResPoster = new BitmapDrawable(getResources(), bitmap); 
     iv.setImageDrawable(lowResPoster); 

     // Download higher resolution image with 0.8 sec delay to avoid load complete before 
     // animation finishes (causing some flicker/overflow image problem). 
     Handler handler = new Handler(); 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       Picasso.with(c).load("http://image.tmdb.org/t/p/w780" + mMovieInfo[2]) 
         // still need placeholder here otherwise will flash of white image 
         .placeholder(lowResPoster) 
         .error(lowResPoster) 
         .fit() 
         .centerCrop() 
         .noFade() // without this image replacement will not be smooth 
         .into(iv); 
      } 
     }; 
     handler.postDelayed(runnable, 800); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
0

Was ist Animation? Last Bild während Animation Ende

TranslateAnimation translateAnimation = new TranslateAnimation(0,1.5f,0,1.5f); 
    translateAnimation.setAnimationListener(new Animation.AnimationListener() { 
     @Override 
     public void onAnimationStart(Animation animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
       //load image when animation end 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 

     } 
    }); 

und

LayoutTransition.TransitionListener transitionListener = new LayoutTransition.TransitionListener() { 
     @Override 
     public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { 

     } 

     @Override 
     public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { 
        //load image when animation end 
     } 
    }; 
+0

Ich benutze die Animation wie in https://guides.codepath.com/android/Shared-Element-Activity-Transition .. Ich weiß nicht, wie man translateAnimation damit verwenden. Können Sie bitte beraten? –

0

Versuchen Sie, den folgenden Code:

Erster Einsatz picasso normalerweise Platzhalter in die Imageview zu laden

iv.setImageBitmap(bitmap); 

Dann nutzen SharedElement Listener wie diese

Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();sharedElementEnterTransition.addListener(new TransitionListenerAdapter() { 
    @Override 
     public void onTransitionEnd(android.support.transition.Transition transition) { 
       super.onTransitionEnd(transition); 
     Picasso.with(c).load("http://image.tmdb.org/t/p/w780" + mMovieInfo[2]) 
     .placeholder(new BitmapDrawable(getResources(), bitmap)) 
     .fit() 
     .centerCrop() 
     .noFade() 
     .into(iv); 
     } 
    }); 
0

Um einen Prozess zu verzögern, können Sie Handler() verwenden.

Beispiel.

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

      // write your codes here.. this will delay 2 seconds... 
      startActivity(new Intent(this,MySecondActivity.class); 


     } 
    },2000);