实现banner滑动渐变时如何获取banner高度?

先上效果图:

《实现banner滑动渐变时如何获取banner高度?》 就问你6不6

如果顶部是单个ImageView我们可以用下面的方法来获取:
ViewTreeObserver vto = image_view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        title.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        height = image_view.getHeight() - (head_layout.getHeight() + 20);
    }
});
如果是多布局复杂的Recyclerview,banner一般位于最顶部,那么recyclerview第0个位置上的item高度又如何获取呢
@Override
public void setData(List<News.Data.New> datas) {
    mData.addAll(datas);
    mAdapter.notifyDataSetChanged();

    getBannerHeight();
}

public void getBannerHeight() {
    new Handler().postDelayed(() -> {
        try {
            ViewGroup item = (ViewGroup) rcy.getLayoutManager().getChildAt(0);
            View at = item.getChildAt(0);
            int height = at.getHeight();
            Log.e(TAG, "height========: " + height);
            int barHeight = mActionBar.getHeight();
            if (height - barHeight > 0)
                duration = height - barHeight;

            Log.e(TAG, "d========: " + duration);
        } catch (Exception e) {
            Log.e(TAG, "getBannerHeight: 异常了。。。。。。。。。。。。。");
            getBannerHeight();
        }

    }, 1500);
}

简单说明一下:notifyDataSetChanged之后,先获取到第0个itemview,再通过 view.getHeight()方法得到banner的高度。再用BannerHeight – ActionbarHeight得到我们的滑动范围duration。
这里为什么要延迟1.5秒获取?是因为在notifyDataSetChanged之后立即获取高度的话,item.getChildAt(0)可能会返回空,至于为什么要用异常递归,就是为了防止item.getChildAt空时获取不到,直至获取到再接束。

ps.上述方法虽然可以实现效果,但感觉不优雅,如果哪位大神有好的方法,请留言与我交流

最后一张图解释下 duration = height – barHeight;

《实现banner滑动渐变时如何获取banner高度?》 1.png

    原文作者:Endeav0r
    原文地址: https://www.jianshu.com/p/97bbefba7329
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞