0

Я пытаюсь создать «простой» переход общего элемента изображения между элементом просмотра ресайклера (Activity A) & a view pager (Activity B). Мне удалось сгладить все, но кажется, что независимо от того, как я установил переходы exit/reenter/enter/return, переход из B в A, когда общий элемент будет установлен назад, мерцает. И, мерцая, я имею в виду весь экран.Общий переход на общий элемент Android для всего экрана мерцает при повторной установке

Я использую темы AppCompat & Методы ActivityCompat с комбинациями PreDrawListeners как в A (reenter), так и в B (когда изображение установлено с помощью Glide).

Heres активность Код связанные:

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 активность B связанный код.

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); 
      } 
     } 
    } 
}; 

активность B фрагмент вида пейджера:

класса БЩЕСТВЕННОГО ViewModelFullSizeGalleryFragment расширяет 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 понял, что на самом деле делает мерцающий ... Любая помощь будет грандиозна. Благодарю.

Также. Если его какая-либо помощь, то это фрагмент карты за ресайклером Activity A, если его помощь.

ответ

0

Устанавливает android:windowSharedElementsUseOverlay (внутри файла темы XML вашей деятельности) до false решить вашу проблему?

Смежные вопросы