直播软件源码,自定义RecyclerView支持快速滚动

直播软件源码,自定义RecyclerView支持快速滚动

问题描述:

 

RecyclerView自带快速滚动无法控制滚动条的长度唯一,也就是说随着item的增多,滚动条的长度会越变越小。

 

解决问题:

 

通过自定义RecyclerView来实现滚动条的长度不会因为item的增多而发生长度变化。

 

1
package com.emsm.app.widget;<br> <br>import android.view.MotionEvent;<br> <br>import androidx.annotation.NonNull;<br>import androidx.core.view.ViewCompat;<br>import androidx.recyclerview.widget.GridLayoutManager;<br>import androidx.recyclerview.widget.LinearLayoutManager;<br>import androidx.recyclerview.widget.RecyclerView;<br>import androidx.recyclerview.widget.StaggeredGridLayoutManager;<br> <br>import com.emsm.app.util.LogHelps;<br> <br>/**<br> * @Author chentao 0000668668<br> * @Time 2023/2/10<br> * @Description<br> *  * 专注美妆(香水口红护肤)批发代发-供淘宝/天猫/京东/微商/代购/闲鱼等<br> *  * 主做欧美大牌:迪奥/阿玛尼/祖马龙/香奈儿/古驰/TF/MAC/圣罗兰等等<br> *  * 只做高品质产品!(送朋友亲人客户公司活动以及自用或泡妞等等)<br> *  * +V:em-smart-99999<br> */<br>public class ScrollerEvent {<br>    private RecyclerView mRecyclerView;<br> <br>    private float mInitialBarHeight;<br>    private float mLastPressedYAdjustedToInitial;<br>    private int mLastAppBarLayoutOffset;<br> <br>    public void attachRecyclerView(RecyclerView recyclerView, CallBack call) {<br>        this.mRecyclerView = recyclerView;<br>        this.mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {<br>            @Override<br>            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {<br>                super.onScrollStateChanged(recyclerView, newState);<br>                LogHelps.i("");<br>            }<br> <br>            @Override<br>            public void onScrolled(@NonNull RecyclerView parent, int dx, int dy) {<br>                super.onScrolled(parent, dx, dy);<br>                if (call == null) {<br>                    return;<br>                }<br> <br>                // 滚动条拇指的垂直范围<br>                float extent = parent.computeVerticalScrollExtent();<br>                //  可滚动的区域大小<br>                float range = parent.computeVerticalScrollRange();<br>                // 当前偏移量(当前滚动的距离)<br>                float offset = parent.computeVerticalScrollOffset();<br>                // 最大偏移量(最大可滚动的距离)<br>                float maxOffset = range - extent;<br>                // 可以滑动时,在绘制<br>                if (maxOffset > 0) {<br>                    // float offsetY = ratio * mMeasureHeight;<br>                    float ratio = offset / maxOffset;<br>                    LogHelps.i("dx:" + dx +<br>                            " dy:" + dy +<br>                            " extent:" + extent +<br>                            " range:" + range +<br>                            " offset:" + offset +<br>                            " maxOffset:" + maxOffset +<br>                            " ratio:" + ratio);<br> <br>                    call.onScrolled(ratio);<br>                }<br>            }<br>        });<br>    }<br> <br>    public boolean onTouchEvent(MotionEvent event, int viewHeight) {<br>        if (mRecyclerView == null || event == null) {<br>            return true;<br>        }<br> <br>        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {<br>            mRecyclerView.stopScroll();<br> <br>            int nestedScrollAxis = ViewCompat.SCROLL_AXIS_NONE;<br>            nestedScrollAxis |= ViewCompat.SCROLL_AXIS_VERTICAL;<br> <br>            mRecyclerView.startNestedScroll(nestedScrollAxis);<br> <br>            mInitialBarHeight = viewHeight;<br>            mLastPressedYAdjustedToInitial = event.getY() + 0;<br>        } else if (event.getActionMasked() == MotionEvent.ACTION_MOVE) {<br>            float newHandlePressedY = event.getY() + 0;<br>            int barHeight = viewHeight;<br>            float newHandlePressedYAdjustedToInitial = newHandlePressedY + (mInitialBarHeight - barHeight);<br>            float deltaPressedYFromLastAdjustedToInitial = newHandlePressedYAdjustedToInitial - mLastPressedYAdjustedToInitial;<br> <br>            int dY = (int) ((deltaPressedYFromLastAdjustedToInitial / mInitialBarHeight) * (mRecyclerView.computeVerticalScrollRange() + 0));<br>            updateRvScroll(dY + mLastAppBarLayoutOffset);<br> <br>            mLastPressedYAdjustedToInitial = newHandlePressedYAdjustedToInitial;<br>        } else if (event.getActionMasked() == MotionEvent.ACTION_UP) {<br>            mLastPressedYAdjustedToInitial = -1;<br>            mRecyclerView.stopNestedScroll();<br>        }<br>        return true;<br>    }<br> <br>    public void updateRvScroll(int dY) {<br>        if (mRecyclerView == null) {<br>            return;<br>        }<br>        try {<br>            mRecyclerView.scrollBy(0, dY);<br>        } catch (Exception t) {<br>            t.printStackTrace();<br>        }<br>    }<br> <br>    interface CallBack {<br>        // 滚动的比例值 0-1<br>        void onScrolled(float ratio);<br>    }<br> <br>    /**<br>     * 判断是否可以滚动<br>     * @param recyclerView<br>     * @return<br>     */<br>    public static boolean isRecyclerScrollable(RecyclerView recyclerView) {<br>        if (recyclerView == null) {<br>            return false;<br>        }<br> <br>        float range = recyclerView.computeVerticalScrollRange();<br>        float height = recyclerView.getHeight();<br>        // LogHelps.i("recyclerView的滚动范围 " + range + " | RecyclerView的高度 " + height);<br>        // 滚动范围大于RecyclerView的高度 说明是可以滚动的<br>        if (true) {<br>            return range > height;<br>        }<br> <br>        boolean h = false;<br>        if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {<br>            LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();<br>            RecyclerView.Adapter adapter = recyclerView.getAdapter();<br>            if (layoutManager == null || adapter == null) {<br>                h = false;<br>            } else {<br>                h = layoutManager.findLastCompletelyVisibleItemPosition() < adapter.getItemCount() - 1;<br>            }<br>        } else if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {<br>            GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();<br>            RecyclerView.Adapter adapter = recyclerView.getAdapter();<br>            if (layoutManager == null || adapter == null) {<br>                h = false;<br>            } else {<br>                h = layoutManager.findLastCompletelyVisibleItemPosition() < adapter.getItemCount() - 1;<br>            }<br>        } else if (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {<br>            StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) recyclerView.getLayoutManager();<br>            RecyclerView.Adapter adapter = recyclerView.getAdapter();<br>            if (layoutManager == null || adapter == null) {<br>                h = false;<br>            } else {<br>                h = layoutManager.findLastCompletelyVisibleItemPositions(null)[(layoutManager.getSpanCount() - 1)] < adapter.getItemCount() - 1;<br>            }<br>        }<br> <br>        return h;<br>    }<br> <br>}

以上就是 直播软件源码,自定义RecyclerView支持快速滚动,更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2022-04-20 短视频商城系统,下拉框rule出现验证问题解决方法
2022-04-20 app直播源代码,登录界面的背景图自定义插入
2022-04-20 成品直播源码,设置文字不能被选中或解除文字无法被选中
点击右上角即可分享
微信分享提示