美文网首页自定义ViewAndroid-控件Android收藏集
实现banner滑动渐变时如何获取banner高度?

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

作者: Endeav0r | 来源:发表于2018-07-16 11:08 被阅读445次

先上效果图:


就问你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;


1.png

相关文章

网友评论

  • Endeav0r:补一种更优雅的方式:
    //获取顶部title的高度
    mActionbar.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {
    height = mActionbar.getMeasuredHeight();
    BLog.i("----------height=" + height);
    return true;
    }
    });

    ---------------------

    内容来自 王的博客 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Wang_WY/article/details/77665117?utm_source=copy
  • 橘子周二:有一个更简单的方法哦,直接监听recyclerview的滑动距离即可。
    addScorllListenrer,上下滑动 y 轴变化 衡等于0,所以你只需要订好阀值即可
    橘子周二:avpRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled (RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);
    scrollHeight += dy;
    if (scrollHeight >= scrollMax && !commentBarAlreadyShow) {
    operatorCommentNumBar(true);
    commentBarAlreadyShow = true;
    } else if (scrollHeight < scrollMax && commentBarAlreadyShow) {
    operatorCommentNumBar(false);
    commentBarAlreadyShow = false;
    }
    }
    });
    橘子周二:@Endeav0r y = y +newY,打印出来 根据需要选择范围即可
    Endeav0r:@_RANGO 滑动距离范围怎么确定呢
  • 铝小亮:有demo么?

本文标题:实现banner滑动渐变时如何获取banner高度?

本文链接:https://www.haomeiwen.com/subject/fgivpftx.html