如果视图不可见,请勿显示转换

时间:2015-07-16 10:19:36

标签: android android-transitions

我有一个产品列表,如果我点击一个产品,产品的图像将转换为详细信息屏幕。
如果我回去,图像将转换回列表 这很好用。

问题是当我在细节屏幕中向下滚动时,图像不再可见 但是当我回到列表屏幕时,图像仍然会转换,结果是一个错误的过渡。

视频示例here

我希望实现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 个答案:

答案 0 :(得分:0)

使用以下链接,您可以知道滚动内的视图是否可见:https://stackoverflow.com/a/12428154/4097924

然后你可以用一个简单的方法来知道你的imageView在scrollview中是否可见,类似于这个简单的例子:

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上看到它。 :)