项目作者: CCY0122

项目描述 :
有焦点item的水平/垂直滚动RecyclerView-LayoutManager。仿Android豆瓣书影音“推荐“频道列表布局
高级语言: Java
项目地址: git://github.com/CCY0122/FocusLayoutManager.git


Download

FocusLayoutManager

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

效果


截图:



GIF:

gif1
gif2


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

依赖

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

使用

  1. focusLayoutManager =
  2. new FocusLayoutManager.Builder()
  3. .layerPadding(dp2px(this, 14))
  4. .normalViewGap(dp2px(this, 14))
  5. .focusOrientation(FocusLayoutManager.FOCUS_LEFT)
  6. .isAutoSelect(true)
  7. .maxLayerCount(3)
  8. .setOnFocusChangeListener(new FocusLayoutManager.OnFocusChangeListener() {
  9. @Override
  10. public void onFocusChanged(int focusdPosition, int lastFocusdPosition) {
  11. }
  12. })
  13. .build();
  14. recyclerView.setLayoutManager(focusLayoutManager);

各属性意义见图:




注意:因为item在不同区域随着滑动会有不同的缩放(受动画控制),所以实际视觉上堆叠view的间距、普通view的间距未必等于layerPadding、normalViewGap

调整动画效果:

  1. new FocusLayoutManager.Builder()
  2. ......
  3. .setSimpleTrasitionListener(new FocusLayoutManager.SimpleTrasitionListener() {
  4. @Override
  5. public float getLayerViewMaxAlpha(int maxLayerCount) {
  6. return super.getLayerViewMaxAlpha(maxLayerCount);
  7. }
  8. @Override
  9. public float getLayerViewMinAlpha(int maxLayerCount) {
  10. return super.getLayerViewMinAlpha(maxLayerCount);
  11. }
  12. @Override
  13. public float getLayerChangeRangePercent() {
  14. return super.getLayerChangeRangePercent();
  15. }
  16. //and more
  17. //更多可重写方法和释义见接口声明
  18. })
  19. .build();

自定义动画/滚动监听:

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

  1. ......
  2. .setSimpleTrasitionListener(null) //如果默认动画不想要,移除之。or use removeTrasitionlistener(XXX)
  3. .addTrasitionListener(new FocusLayoutManager.TrasitionListener() {
  4. @Override
  5. public void handleLayerView(FocusLayoutManager focusLayoutManager,
  6. View view, int viewLayer,
  7. int maxLayerCount, int position,
  8. float fraction, float offset) {
  9. }
  10. @Override
  11. public void handleFocusingView(FocusLayoutManager focusLayoutManager,
  12. View view, int position,
  13. float fraction, float offset) {
  14. }
  15. @Override
  16. public void handleNormalView(FocusLayoutManager focusLayoutManager, View view, int position, float fraction, float offset) {
  17. }
  18. })

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

源码解析

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