scrollView的fadingEdgeLength属性设置不生效

ScrollView想要通过自定义fadingEdgeLength来更改默认的渐隐高度,但是配置之后不生效

废话不多说,先看解决办法如下:

解决问题

/**
 * 可配置渐隐高度ScrollView
 *
 * @author yilei.liu
 * 2023.2.28
 */
public class VodScrollView extends ScrollView {

    // 顶部的渐隐高度
    private float mTopFadingEdgeStrength;
    // 底部的渐隐高度
    private float mBottomFadingEdgeStrength;


    public ScrollView(Context context) {
        super(context);
    }

    public ScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public ScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected float getTopFadingEdgeStrength() {
        if (getScrollY() == 0) {
            return 0f;
        }
        return mTopFadingEdgeStrength;
    }

    @Override
    protected float getBottomFadingEdgeStrength() {
        View contentView = getChildAt(0);
        // 这里如果不去减去padding,那么设置paddingtop或者bottom之后会导致无法判断是否已经到达底部
        if (contentView.getMeasuredHeight() == (getScrollY() + getHeight() - getPaddingTop() - getPaddingBottom())) {
            return 0f;
        }
        return mBottomFadingEdgeStrength;
    }

    /**
     * 获取当前的顶部的渐隐高度
     *
     * @return 当前的顶部的渐隐高度
     */
    public float getmTopFadingEdgeStrength() {
        return mTopFadingEdgeStrength;
    }

    /**
     * 设置当前的顶部的渐隐高度
     *
     * @param mTopFadingEdgeStrength 顶部的渐隐高度 单位 px
     */
    public void setmTopFadingEdgeStrength(float mTopFadingEdgeStrength) {
        this.mTopFadingEdgeStrength = mTopFadingEdgeStrength;
    }

    /**
     * 获取当前的顶部的渐隐高度
     *
     * @return 当前的顶部的渐隐高度
     */
    public float getmBottomFadingEdgeStrength() {
        return mBottomFadingEdgeStrength;
    }

    /**
     * 设置当前的底部的渐隐高度
     *
     * @param mBottomFadingEdgeStrength 底部的渐隐高度 单位 px
     */
    public void setmBottomFadingEdgeStrength(float mBottomFadingEdgeStrength) {
        this.mBottomFadingEdgeStrength = mBottomFadingEdgeStrength;
    }
}

解决办法简单来说就是覆写这两个方法,同时也说明这两个方法的实现在ScrollView中存在问题,从而导致自己通过原生提供的接口无法生效,

原生ScrollView中被覆写的方法的实现

 @Override
    protected float getTopFadingEdgeStrength() {
        if (getChildCount() == 0) {
            return 0.0f;
        }
        // 这里返回的是我们通过原生方法设置的fadingEdgeLength除当前滚动距离的结果, 什么迷惑行为?
        final int length = getVerticalFadingEdgeLength();
        if (mScrollY < length) {
            return mScrollY / (float) length;
        }

        return 1.0f;
    }

    @Override
    protected float getBottomFadingEdgeStrength() {
        if (getChildCount() == 0) {
            return 0.0f;
        }
        // 这里返回的是(view实际总高度 - 滚动距离 - view可见的高度)/ 我们通过原生方法设置的fadingEdgeLength除当前滚动距离的结果
        // 迷惑行为?
        final int length = getVerticalFadingEdgeLength();
        final int bottomEdge = getHeight() - mPaddingBottom;
        final int span = getChildAt(0).getBottom() - mScrollY - bottomEdge;
        if (span < length) {
            return span / (float) length;
        }

        return 1.0f;
    }

可以看出原生的方法实现,可能过于高级,我无法理解,所以为了满足我的业务需求这里通过覆写这两个方法(阿巴阿巴),实现了业务需求。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值