当前位置: 首页 > news >正文

RecyclerView设置边缘渐变失效

使用android提供的GridLayoutManager、LinearLayoutManagerd,在xml添加fadingEdgeLengthrequiresFadingEdge是有渐变效果的。

<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv"android:layout_width="0dp"android:layout_height="0dp"android:fadingEdgeLength="50dp"android:requiresFadingEdge="horizontal"/>

但是用了自定义LayoutManager之后就失效了。


原因

自定义的LayoutManager没有重写computeHorizontalScrollOffset、computeHorizontalScrollRang等方法。


public int computeHorizontalScrollExtent(@NonNull State state) {return 0;
}public int computeHorizontalScrollOffset(@NonNull State state) {return 0;
}public int computeHorizontalScrollRange(@NonNull State state) {return 0;
}public int computeVerticalScrollExtent(@NonNull State state) {return 0;
}public int computeVerticalScrollOffset(@NonNull State state) {return 0;
}public int computeVerticalScrollRange(@NonNull State state) {return 0;
}

渐变效果是在View.draw()中实现的。draw渐变效果时,是分了上下左右,四个方向来绘制的。只要了解了一个方向的渐变效果就一通百通了。

在View绘制渐变效果时,getTopFadingEdgeStrength返回的是0,导致drawTop为false,所以没有渐变效果。

public void draw(@NonNull Canvas canvas) {final int viewFlags = mViewFlags;// 是否设置了requiresFadingEdgeboolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0;boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0;boolean drawTop = false;float topFadeStrength = 0.0f;if (verticalEdges) {// 顶部渐变的强度,范围是0~1// 最终会调用到LayoutManger.computeVerticalScollOffset,// 因为自定义的LayoutManger没有重写该方法,所以返回的是0.topFadeStrength = Math.max(0.0f, Math.min(1.0f, getTopFadingEdgeStrength()));// fadeHeight就是在xml中设置的fadingEdgeLength// 因为topFadeStrength为0,所以drawTop就为false了drawTop = topFadeStrength * fadeHeight > 1.0f;}saveCount = canvas.getSaveCount();int topSaveCount = -1;int solidColor = getSolidColor();if (solidColor == 0) {if (drawTop) {topSaveCount = canvas.saveUnclippedLayer(left, top, right, top + length);}} else {scrollabilityCache.setFadeColor(solidColor);}// 绘制渐变效果if (drawTop) {matrix.setScale(1, fadeHeight * topFadeStrength);matrix.postTranslate(left, top);fade.setLocalMatrix(matrix);p.setShader(fade);if (solidColor == 0) {// 和背景颜色一致的渐变效果canvas.restoreUnclippedLayer(topSaveCount, p);} else {// getSolidColor获取到的颜色渐变canvas.drawRect(left, top, right, top + length, p);}}}

解决

方法一:重写LayoutManger的相关方法,返回对应的值。

方法二:直接重写RecylerView的getBottomFadingEdgeStrength、getLeftFadingEdgeStrength等方法。

protected float getBottomFadingEdgeStrength() {return 1f;
}protected float getLeftFadingEdgeStrength() {return 1f;
}protected float getRightFadingEdgeStrength() {return 1f;
}protected float getTopFadingEdgeStrength() {return 1f;
}
http://www.dtcms.com/a/548702.html

相关文章:

  • 网站续费模版徐州建设工程网上交易平台
  • [系统架构设计师]云原生架构
  • spec-kit深度解析:AI驱动的规范驱动开发(SDD)的架构、哲学与实践启示
  • 怎么学做网站哈尔滨十大广告公司
  • AI应用开发
  • Rust 中精确大小迭代器(ExactSizeIterator)的深度解析与实践
  • 培训/课程预约小程序开发-提升教育机构的管理效率和用户体验
  • 【Unity基础详解】(3)Unity核心类:GameObject
  • oj题 ——— 单链表oj题
  • 企业网站建设推广含义网站建设开发上线流程
  • Unity-AutoHand插件手势跟踪响应研究
  • 数据结构——三十三、Dijkstra算法(王道408)
  • MQTTX:全能的 MQTT 客户端工具简化物联网开发
  • 抗体芯片技术:超越Western Blot的高通量蛋白分析方案
  • 佛山公司网站建设价格企业查询平台
  • k8s介绍+k8s部署
  • 【H5工具】一个简约高级感渐变海报H5设计工具
  • 未来之窗昭和仙君(四十五)时钟应用场景——东方仙盟筑基期
  • TTL转485电路
  • Milvus知识
  • 实战:动态线程池应对短视频转码百倍流量洪峰
  • 第一部分:一般性理論(注定的概率論)第一章引入
  • 合肥大型网站设计互联网营销师怎么做
  • 建设公众号网站评分标准细则网站的站内结构锚文本是如何做的
  • 裸金属 vs. 虚拟化 GPU 服务器:AI 训练与推理应该怎么选
  • 做网站的语言建设一下网站要求提供源码
  • 金仓替换MongoDB:金融交易数据一致性新解
  • Rust 内存泄漏的检测与防范:超越安全的实践指南
  • Spring Boot核心技术详解
  • 「安全升级 + 零代码平替」金仓数据库如何实现MongoDB社交动态发布系统的无缝迁移?