Не показывать переход, если вид не виден

У меня есть список продуктов, если я нажму на один, изображение продукта перейдет в подробный экран.
И если я вернусь, изображение будет перенесено обратно в список.
Это отлично работает.

Проблема в том, что когда я прокручиваю свой экран подробностей, изображение больше не видно.
Но когда я возвращаюсь к экрану со списком, изображение все еще передается, в результате чего происходит глючный переход.

Пример видео здесь

Я хочу добиться чего-то вроде Play Store, где нет анимации возврата, если изображение больше не видно.

Код

Начало детализации деятельности:

Intent intent = new Intent(getActivity(), ProductDetailActivity.class);
intent.putExtra(ProductDetailActivity.EXTRA_PRODUCT, product);

Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
                productViewHolder.getProductCover(), productViewHolder.getProductCover().getTransitionName()).toBundle();

getActivity().startActivity(intent, options);

В DetailActivity я установил имя перехода:

coverImageView.setTransitionName(getString(R.string.transition_key_product_cover_with_id, product.getId()));

styles.xml:

<item name="android:windowContentTransitions">true</item>

Есть идеи, как реализовать поведение, которого я хочу достичь?

1 ответ

С помощью следующей ссылки вы можете узнать, является ли представление внутри свитка видимым или нет: /questions/44363030/android-kak-proverit-viden-li-vid-iznutri-scrollview/44363070#44363070

Затем вы можете сделать простой метод, чтобы узнать, виден ли ваш imageView внутри прокрутки, подобно этому простому примеру:

public boolean isVisibleInsideScroll(){
   Rect scrollBounds = new Rect();
   scrollView.getHitRect(scrollBounds);
   if (imageView.getLocalVisibleRect(scrollBounds)) {
       // Any portion of the imageView, even a single pixel, is within the visible window
       return true;
   } else {
       // NONE of the imageView is within the visible window
       return false;
   }
}

Тогда я вижу два возможных варианта, которые я не доказал:

  • Вариант 1: переписать метод onBack (и каждый способ вернуться, если у вас есть другой). Внутри метода вы можете назначить переход, когда элемент виден перед тем, как покинуть экран:

    @Override
    public void onBackPressed(){
        if(isVisibleInsideScroll()){
            coverImageView.setTransitionName(getString(R.string.transition_key_product_cover_with_id, product.getId()));
        }
        super.onBackPressed();
    }
    
  • Вариант 2: перезаписать метод onScroll (и каждый раз при прокрутке прокрутки) вы можете зарегистрировать или отменить регистрацию анимации, если вид виден. Код в этой опции похож на предыдущий.

Удачи! Мне очень нравится ваша анимация, я видел ее в YouTube.:)

Другие вопросы по тегам