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