Android中解决复写ListView时出现OnScollListener无法监听,这时如果实现标题栏渐变色的话,应该将计算滚动距离的方法,写在不断调用的回调中。

计算listView滑动距离的方法:

public int getScroll() {
    View c = this.getChildAt(0);
    if (c == null) {
        return 0;
    }
    int firstVisiblePosition = this.getFirstVisiblePosition();
    int top = c.getTop();
    return -top + firstVisiblePosition * c.getHeight() ;
}
当listView的OnScrollLsitener无法监听时,我们需要不断获取listView的滚动距离,此时,如果写在OnTouchEvent中的话,会出现只有手指放在屏幕上滚动时,才会不断获取listView的滚动距离,一旦手指离开屏幕,这个距离就会停止在手指离开的地方:如下代码是不正确的:

 @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
       
            case MotionEvent.ACTION_MOVE:
                distance = ev.getY() - startY;
             
if (onScrolllingTitleColor != null) {
    onScrolllingTitleColor.onScrolling(getScroll());
}
break; } return super.onTouchEvent(ev); }
所以我们需要将
getScroll();
这个方法写在listView能不断调用的方法里;

onScrollChanged(
int l, int t, int oldl, int oldt
);
在ScrollView中,这个方法会返回滚动的距离,即:t   的值,可是listView复写此方法并不能获得 t    的值,看了listView的onScrollListener的方法:

public void setOnScrollListener(OnScrollListener l) {
    mOnScrollListener = l;
    invokeOnItemScrollListener();
}
看看红色字体,这个方法干了什么呢?

void invokeOnItemScrollListener() {
    if (mFastScroll != null) {
        mFastScroll.onScroll(mFirstPosition, getChildCount(), mItemCount);
    }
    if (mOnScrollListener != null) {
        mOnScrollListener.onScroll(this, mFirstPosition, getChildCount(), mItemCount);
    }
    onScrollChanged(0, 0, 0, 0); // dummy values, View's implementation does not use these.
}
看到了吗?
onScrollChanged(0, 0, 0, 0);
这句代码,将所有的值置为了0,所以listView复写此方法所得到的值全部为零,可是我需要不断获取listView的滚动距离,怎么办呢?

虽然它里面的参数的值都为零,可是却是一直被调用的,真是糊涂了,咱们有没有用里面的值,也怪自己一直想着用里面的值判断,死脑筋了,既然这个方法一直被调用,那么,我们把获取listView滚动距离的方法写在这个回调里,不就一直能获取了吗?于是乎:

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);
    if (onScrolllingTitleColor != null) {
        onScrolllingTitleColor.onScrolling(getScroll());
    }
}

onScrollingTitleColor是一个回调接口对象,里面有一个参数,传入的就getScroll方法得到的listView的滚动距离,接口如下:

/**
 * 上滑标题栏变色
 */
public interface OnScrollingTitleColor {
    void onScrolling(int position);
}

private OnScrollingTitleColor onScrollingTitleColor;

public void setOnScrollingChangeTitleColor(OnScrollingTitleColor onScrollingTitleColor) {
    this.onScrollingTitleColor = onScrollingTitleColor;
}

在activity中实现OnScrollingTitleColor接口,实现onScrolling方法,不断改变标题栏颜色

@Override
public void onScrolling(int position) {
    if (position <= 0) {
        ll_action_btn.setBackgroundColor(Color.argb((int) 0, 18, 183, 245));
    } else if (position > 0 && position <= imageHeight) {
        float scale = (float) position / imageHeight;
        float alpha = (255 * scale);
        ll_action_btn.setBackgroundColor(Color.argb((int) alpha, 18, 183, 245));
    } else {
        ll_action_btn.setBackgroundColor(Color.rgb((int) 18, 183, 245));
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值