0

Ich versuche, ein "einfaches" Bild gemeinsamen Element Übergang zwischen einem Recycler-View-Element (Aktivität A) & eine Ansicht Pager (Aktivität B) zu erstellen. Ich habe es geschafft, alles zu glätten, aber es scheint, dass, egal wie ich meine Exit/Reenter/Enter/Return-Übergänge den Übergang zurück von B nach A, wenn das gemeinsame Element zurückgelegt wird, flackert. Und durch Flackern meine ich den ganzen Bildschirm.Android Shared Element Übergang gesamten Bildschirm flackert bei Wiedereintritt

Ich verwende AppCompat Themes & ActivityCompat-Methoden mit Kombinationen von PreDrawListeners in A (Wiedereinsteiger) und B (wenn Bild mit Glide festgelegt wird).

Heres Aktivität Ein verwandtes Code:

private Bundle mReenterState; 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override protected void initActivityTransitions() { 
    super.initActivityTransitions(); 
    getWindow().setSharedElementsUseOverlay(false); 
    setExitSharedElementCallback(mCallback); 
} 

private final SharedElementCallback mCallback = new SharedElementCallback() { 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { 
     if (mReenterState != null) { 
      int startingSelection = mReenterState.getInt(DefinesGlobal.KEY_STARTING_INDEX); 
      int currentSelection = mReenterState.getInt(DefinesGlobal.KEY_CURRENT_INDEX); 
      if (startingSelection != currentSelection) { 
       String newTransitionName = mHotel.getDetail().getHotelImagesGallery().get(currentSelection); 
       View newSharedElement = mContentView.getGalleryView().getRecyclerViewPager() 
         .getLayoutManager().findViewByPosition(currentSelection); 
       if (newSharedElement != null) { 
        names.clear(); 
        names.add(newTransitionName); 
        sharedElements.clear(); 
        sharedElements.put(newTransitionName, newSharedElement); 
       } 
      } 
      mReenterState = null; 
     } else { 
      // If mReenterState is null, then the activity is exiting. 
      View navigationBar = findViewById(android.R.id.navigationBarBackground); 
      View statusBar = findViewById(android.R.id.statusBarBackground); 
      if (navigationBar != null) { 
       names.add(navigationBar.getTransitionName()); 
       sharedElements.put(navigationBar.getTransitionName(), navigationBar); 
      } 
      if (statusBar != null) { 
       names.add(statusBar.getTransitionName()); 
       sharedElements.put(statusBar.getTransitionName(), statusBar); 
      } 
     } 
    } 
}; 

@Override public void onActivityReenter(int resultCode, Intent data) { 
    super.onActivityReenter(resultCode, data); 
    mReenterState = new Bundle(data.getExtras()); 
    int startingSelection = mReenterState.getInt(DefinesGlobal.KEY_STARTING_INDEX); 
    int currentSelection = mReenterState.getInt(DefinesGlobal.KEY_CURRENT_INDEX); 
    if (startingSelection != currentSelection) { 
     mContentView.getGalleryView().getRecyclerViewPager().scrollToPosition(currentSelection); 

    } 
    ActivityCompat.postponeEnterTransition(this); 
    mContentView.getGalleryView().getRecyclerViewPager().getViewTreeObserver() 
      .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      mContentView.getGalleryView().getRecyclerViewPager().getViewTreeObserver().removeOnPreDrawListener(this); 
      mContentView.getGalleryView().getRecyclerViewPager().requestLayout(); 
      ActivityCompat.startPostponedEnterTransition(ViewModelHotelDetailsActivity.this); 

      return true; 
     } 
    }); 
} 

Heres Aktivität B bezogenen Code.

private boolean mIsReturning;

@Override public void finishAfterTransition() { 
    mIsReturning = true; 
    Intent data = new Intent(); 
    data.putExtra(DefinesGlobal.KEY_CURRENT_INDEX, mCurrentSelection); 
    data.putExtra(DefinesGlobal.KEY_STARTING_INDEX, mStartingSelection); 
    setResult(RESULT_OK, data); 
    super.finishAfterTransition(); 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override protected void initActivityTransitions() { 
    super.initActivityTransitions(); 
    ActivityCompat.postponeEnterTransition(this); 
    setEnterSharedElementCallback(mCallback); 
} 

private final SharedElementCallback mCallback = new SharedElementCallback() { 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { 
     if (mIsReturning) { 
      ViewModelFullSizeGalleryFragment fragment = 
        ((FullSizeGalleryPagerAdapter) mPager.getAdapter()).getCurrent(); 
      ImageView sharedElement = fragment.getImageView(); 
      if (sharedElement == null) { 
       names.clear(); 
       sharedElements.clear(); 
      } else if (mStartingSelection != mCurrentSelection) { 
       names.clear(); 
       names.add(sharedElement.getTransitionName()); 
       sharedElements.clear(); 
       sharedElements.put(sharedElement.getTransitionName(), sharedElement); 
      } 
     } 
    } 
}; 

Aktivität B Ansicht Pager-Fragment:

eschallungssysteme Klasse ViewModelFullSizeGalleryFragment erweitert ViewModelBaseFragment {

@Override protected int getLayoutId() { 
    return R.layout.view_model_fragment_full_size_gallery; 
} 

@Bind(R.id.full_size_image_view) ImageView mImageView; 

public static ViewModelFullSizeGalleryFragment newInstance(String url, int position, int 
     target) { 
    ViewModelFullSizeGalleryFragment fragment = new ViewModelFullSizeGalleryFragment(); 
    fragment.setUrl(url); 
    fragment.setIndexAndTarget(position, target); 
    return fragment; 
} 

private String mUrl; 
private int mPosition; 
private int mTarget; 

public void setUrl(String url) { 
    mUrl = url; 
} 

public void setIndexAndTarget(int position, int target) { 
    mPosition = position; 
    mTarget = target; 
} 

@Override protected void initViewModel(View view) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     mImageView.setTransitionName(mUrl); 
    } 
    Glide.with(getContext()) 
      .load(mUrl) 
      .transform(new HotelDetailsImageTransformation(getContext(), 
        LMTApplication.mWidth)) 
      .diskCacheStrategy(DiskCacheStrategy.ALL) 
      .skipMemoryCache(true) 
      .error(R.drawable.ic_nopic) 
      .into(new SimpleTarget<GlideDrawable>() { 
       @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { 
        if (mImageView != null && resource != null) { 
         mImageView.setImageDrawable(resource); 
         mImageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
          @Override public boolean onPreDraw() { 
           mImageView.getViewTreeObserver().removeOnPreDrawListener(this); 
           if (mTarget == mPosition) 
            ((ISharedElementCallback) getContext()).onViewReadyForTransition(); 
           return true; 
          } 
         }); 

        } 
       } 
      }); 
} 

@Override public void onBackPressed() { 
    //!! Not used. 
} 

public interface ISharedElementCallback { 
    void onViewReadyForTransition(); 
} 

public ImageView getImageView() { 
    return mImageView; 
} 

Havent herausgefunden, was eigentlich das Flimmern macht ... Jede Hilfe wird großartig sein. Vielen Dank.

Auch. Wenn es irgendeine Hilfe gibt, gibt es ein Kartenfragment hinter der Recycleransicht von Aktivität A, wenn es irgendeine Hilfe gibt.

Antwort

0

Funktioniert die Einstellung android:windowSharedElementsUseOverlay (in der XML-Designdatei Ihrer Activity) auf false Ihr Problem lösen?

Verwandte Themen