实现用户可见最大百分比的item查找

本文介绍了一种基于RecyclerView的实现方法,用于模仿微博播放列表的蒙版覆盖切换效果。该方法通过计算可见项目的最大百分比来确定当前显示项目的最佳位置,从而实现平滑的过渡效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

####因项目需要仿微博播放列表,实现播放列表的蒙版覆盖切换,用户可见最大百分比的item的position查找

public class RecycleViewPercentItem {

    private VisibleItem mVisibleItem;
    private int percentPosition = -1;
    private int lastPercentPosition = -1;

    public RecycleViewPercentItem(VisibleItem mVisibleItem) {
        this.mVisibleItem = mVisibleItem;
    }
    //初始最大百分比的位置
    public void setPercentPosition(int percentPosition) {
        this.percentPosition = percentPosition;
    }
    //RecyclerView,列表的最大长度
    public void getItemVisible(RecyclerView recyclerView, int maxSize) {
        lastPercentPosition = percentPosition;
        LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
        //获取可见item个数
        int childCount = manager.findLastVisibleItemPosition() - manager.findFirstVisibleItemPosition() + 1;
        //第一个可见item的位置
        int firstVisible = manager.findFirstVisibleItemPosition();
        Map<Integer, Integer> percents = new HashMap<>();
        for (int i = 0; i < childCount; i++) {
            //取出所有可见itemview
            View view = manager.findViewByPosition(firstVisible + i);
            int position = firstVisible + i;
            if (position >= maxSize) {
                break;
            }
            KLog.e("可见位置:" + position + ",可见百分比:" + getVisibilityPercents(view));
            percents.put(getVisibilityPercents(view), position);
        }
        if (percents.size() > 0) {
            //取出百分比最大的position
            Set<Integer> set = percents.keySet();
            percentPosition = percents.get(Collections.max(set));
        }
        if (lastPercentPosition == percentPosition) {
            return;
        }
        mVisibleItem.maxPercentPosition(percentPosition, lastPercentPosition);
    }

    private int getVisibilityPercents(View view) {
        Rect rect = new Rect();
        view.getLocalVisibleRect(rect);
        int height = view.getHeight();
        int percents = 100;
        if (rect.top == 0 && rect.bottom == height) {
            percents = 100;
        } else if (rect.top > 0) {
            percents = (height - rect.top) * 100 / height;
        } else if (rect.bottom > 0 && rect.bottom < height) {
            percents = rect.bottom * 100 / height;
        }
        return percents;
    }

    public interface VisibleItem {
        //当前可见最大百分比的position,上次可见最大百分比的position
        void maxPercentPosition(int percentPosition, int lastPercentPosition);
    }
}
复制代码

转载于:https://juejin.im/post/5a31f142f265da432840deb9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值