有焦点 item 的水平/垂直滚动 RecyclerView-LayoutManager。仿 Android 豆瓣书影音“推荐“频道列表布局

FocusLayoutManager

项目地址:CCY0122/FocusLayoutManager 

简介:有焦点 item 的水平/垂直滚动 RecyclerView-LayoutManager。仿 Android 豆瓣书影音“推荐“频道列表布局

更多:作者   提 Bug   

标签:

 

Download

有焦点 item 的水平/垂直滚动 RecyclerView-LayoutManager。仿 Android 豆瓣书影音“推荐“频道列表布局

效果


截图: 

 


GIF: 
gif1 gif2


可自己监听滚动编写效果,如修改成仿 MacOS 文件浏览: 

依赖

implementation 'com.ccy:FocusLayoutManager:1.0.2'
// (or api)

使用

 focusLayoutManager =
                new FocusLayoutManager.Builder()
                        .layerPadding(dp2px(this, 14))
                        .normalViewGap(dp2px(this, 14))
                        .focusOrientation(FocusLayoutManager.FOCUS_LEFT)
                        .isAutoSelect(true)
                        .maxLayerCount(3)
                        .setOnFocusChangeListener(new FocusLayoutManager.OnFocusChangeListener() {
                            @Override
                            public void onFocusChanged(int focusdPosition, int lastFocusdPosition) {

                            }
                        })
                        .build();
recyclerView.setLayoutManager(focusLayoutManager);

各属性意义见图:
 
注意:因为 item 在不同区域随着滑动会有不同的缩放,所以实际 layerPadding、normalViewGap 会被缩放计算。

调整动画效果:

                new FocusLayoutManager.Builder()
                        ......
                        .setSimpleTrasitionListener(new FocusLayoutManager.SimpleTrasitionListener() {
                             @Override
                            public float getLayerViewMaxAlpha(int maxLayerCount) {
                                return super.getLayerViewMaxAlpha(maxLayerCount);
                            }

                            @Override
                            public float getLayerViewMinAlpha(int maxLayerCount) {
                                return super.getLayerViewMinAlpha(maxLayerCount);
                            }

                            @Override
                            public float getLayerChangeRangePercent() {
                                return super.getLayerChangeRangePercent();
                            }
                            //and more

                            //更多可重写方法和释义见接口声明
                        })
                        .build();

自定义动画/滚动监听:

如果你想在滑动时不仅仅改变 item 的大小、透明度,你有更多的想法,可以监听 TrasitionListener,该监听暴露了很多关键布局数据,


            ......
            .setSimpleTrasitionListener(null) //如果默认动画不想要,移除之。or use removeTrasitionlistener(XXX) 
            .addTrasitionListener(new FocusLayoutManager.TrasitionListener() {
                            @Override
                            public void handleLayerView(FocusLayoutManager focusLayoutManager,
                                                        View view, int viewLayer,
                                                        int maxLayerCount, int position,
                                                        float fraction, float offset) {

                            }

                            @Override
                            public void handleFocusingView(FocusLayoutManager focusLayoutManager,
                                                           View view, int position,
                                                           float fraction, float offset) {

                            }

                            @Override
                            public void handleNormalView(FocusLayoutManager focusLayoutManager, View view, int position, float fraction, float offset) {

                            }
                        })

各参数意义见接口注释。 实际上SimpleTrasitionListener内部就会被转为TrasitionListener。可参考转换类是怎么做的:TrasitionListenerConvert

源码解析

https://blog.csdn.net/ccy0122/article/details/90515386

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
焦点item水平/垂直滚动RecyclerView-LayoutManager仿Android豆瓣影音推荐频道列表布局效果截图: GIF:  可自己监听滚动编写效果,如修改成仿MacOS文件浏览: 依赖api 'com.ccy:FocusLayoutManager:1.0.1' // (or implementation)使用focusLayoutManager =                 new FocusLayoutManager.Builder()                         .layerPadding(dp2px(this, 14))                         .normalViewGap(dp2px(this, 14))                         .focusOrientation(FocusLayoutManager.FOCUS_LEFT)                         .isAutoSelect(true)                         .maxLayerCount(3)                         .setOnFocusChangeListener(new FocusLayoutManager.OnFocusChangeListener() {                             @Override                             public void onFocusChanged(int focusdPosition, int lastFocusdPosition) {                                                              }                         })                         .build(); recyclerView.setLayoutManager(focusLayoutManager);各属性意义见图: 注意:因为item在不同区域随着滑动会有不同的缩放,所以实际layerPadding、normalViewGap会被缩放计算。调整动画效果:new FocusLayoutManager.Builder()                         ......                         .setSimpleTrasitionListener(new FocusLayoutManager.SimpleTrasitionListener() {                              @Override                             public float getLayerViewMaxAlpha(int maxLayerCount) {                                 return super.getLayerViewMaxAlpha(maxLayerCount);                             }                             @Override                             public float getLayerViewMinAlpha(int maxLayerCount) {                                 return super.getLayerViewMinAlpha(maxLayerCount);                             }                             @Override                             public float getLayerChangeRangePercent() {                                 return super.getLayerChangeRangePercent();                             }                             //and more                                                          //更多可重写方法和释义见接口声明                         })                         .build();自定义动画/滚动监听:如果你想在滑动时不仅仅改变item的大小、透明度,你有更多的想法,可以监听TrasitionListener,该监听暴露了很多关键布局数据,......             .setSimpleTrasitionListener(null) //如果默认动画不想要,移除之。or use removeTrasitionlistener(XXX)              .addTrasitionListener(new FocusLayoutManager.TrasitionListener() {                             @Override                             public void handleLayerView(FocusLayoutManager focusLayoutManager,                                                         View view, int viewLayer,                                                         int maxLayerCount, int position,                                                         float fraction, float offset) {                                                              }                             @Override                             public void handleFocusingView(FocusLayoutManager focusLayoutManager,                                                            View view, int position,                                                            float fraction, float offset) {                             }                             @Override                             public void handleNormalView(FocusLayoutManager focusLayoutManager, View view, int position, float fraction, float offset) {                             }                         })各参数意义见接口注释。 实际上SimpleTrasitionListener内部就会被转为TrasitionListener。可参考转换类是怎么做的:TrasitionListenerConvert源码解析https://blog.csdn.net/ccy0122/article/details/90515386
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值