- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
目前,我需要使用 RecyclerView
的 paddingTop
和 paddingBottom
,因为我想避免复杂的空间计算,在我的第一个 RecyclerView
项和最后一项。
但是,我注意到,requiresFadingEdge
效果也会受到影响。
这是我的 XML
<androidx.recyclerview.widget.RecyclerView
android:requiresFadingEdge="vertical"
android:paddingTop="0dp"
android:paddingBottom="0dp"
android:overScrollMode="always"
android:background="?attr/recyclerViewBackground"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false" />
如你所见,淡出效果向下移动了 40dp,这不是我想要的。
褪色效果看起来不错。但是,我的 RecyclerView
需要非零的 paddingTop
和 paddingBottom
。
有没有办法让 RecyclerView
的 requiresFadingEdge
不受 paddingTop
和 paddingBottom
的影响?
最佳答案
我找到了最好的官方解决方案。覆盖 RecyclerView
的这 3 个方法。哪些对衰落边缘起着最重要的作用。
首先创建你的 recyclerView。
public class MyRecyclerView extends RecyclerView {
// ... required constructor
@Override
protected boolean isPaddingOffsetRequired() {
return true;
}
@Override
protected int getTopPaddingOffset() {
return -getPaddingTop();
}
@Override
protected int getBottomPaddingOffset() {
return getPaddingBottom();
}
}
就是这样。使用这个 recyclerview,你会看到褪色边缘不受影响。
以下内容仅供说明。如果你想知道幕后花絮。
为了理解这种边缘效应是如何工作的,我深入研究了使用 android:requiresFadingEdge
的类,我发现它不是由 RecyclerView
处理的,而是由 RecyclerView
处理的View
类,它是所有 View 的父类。
在 View
类的 onDraw
方法中,我通过使用此方法 isPaddingOffsetRequired
的帮助找到了绘制渐变边缘的代码。仅用于处理淡入淡出效果。
根据文档,如果你想改变渐变边缘的行为,这个方法应该被子类覆盖。默认返回 false
。因此,通过返回 true
,我们要求 View 在 View 绘制时为边缘应用一些偏移量。
查看以下 View
类的 onDraw
方法 fragment 以了解计算。
final boolean offsetRequired = isPaddingOffsetRequired();
if (offsetRequired) {
paddingLeft += getLeftPaddingOffset();
}
int left = mScrollX + paddingLeft;
int right = left + mRight - mLeft - mPaddingRight - paddingLeft;
int top = mScrollY + getFadeTop(offsetRequired);
int bottom = top + getFadeHeight(offsetRequired);
if (offsetRequired) {
right += getRightPaddingOffset();
bottom += getBottomPaddingOffset();
}
正如我们所见,top
变量是使用 getFadeTop(offsetRequired)
初始化的。
protected int getFadeTop(boolean offsetRequired) {
int top = mPaddingTop;
if (offsetRequired) top += getTopPaddingOffset();
return top;
}
在这个方法中,top
是在需要偏移的时候加上topOffSet的值来计算的。因此,为了扭转效果,我们需要传递您传递的填充的负值。所以我们需要返回 -getPaddingTop()
。
现在对于 bottom 我们没有传递负值,因为 bottom 正在处理 top + height
。因此,传递负值会使淡入淡出距离底部更短,因此我们需要添加底部填充以使其正确可见。
您可以覆盖这 4 个方法来使用它。 getLeftPaddingOffset()、getRightPaddingOffset()、getTopPaddingOffset()、getBottomPaddingOffset()
关于android - 有没有办法让 RecyclerView requiresFadingEdge 不受 paddingTop 和 paddingBottom 的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55372837/
目前,我需要使用 RecyclerView 的 paddingTop 和 paddingBottom,因为我想避免复杂的空间计算,在我的第一个 RecyclerView 项和最后一项。 但是,我注意到
我是一名优秀的程序员,十分优秀!