gpt4 book ai didi

android - 有没有办法让 RecyclerView requiresFadingEdge 不受 paddingTop 和 paddingBottom 的影响

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:22 26 4
gpt4 key购买 nike

目前,我需要使用 RecyclerViewpaddingToppaddingBottom,因为我想避免复杂的空间计算,在我的第一个 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" />

当paddingTop和paddingBottom为40dp时

enter image description here

如你所见,淡出效果向下移动了 40dp,这不是我想要的。


当paddingTop和paddingBottom为0dp时

enter image description here

褪色效果看起来不错。但是,我的 RecyclerView 需要非零的 paddingToppaddingBottom


有没有办法让 RecyclerViewrequiresFadingEdge 不受 paddingToppaddingBottom 的影响?

最佳答案

我找到了最好的官方解决方案。覆盖 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com