我在自己的项目中,写了一个下拉刷新的自定义View-----RefreshLayout,继承自LinearLayout,原理是往该控件中添加头部刷新的View和内容的View,让刷新的头部View通过调用scrollTo(0,headViewHeight)方法滚动相应的位置使得头部View隐藏,只显示出内容View。
但在魅族手机Pro6 Android7.1.1 发现点击状态栏会自动滚回到顶部。应该是该魅族系统下提供了该功能,因为在其他手机中没有发现,还没研究过相应的系统代码。在滚回顶部的过程中,经过分析,发现其自动调用scrollTo(0,0)方法滚回到顶部,使得我的刷新的头部View显示了出来。为了不让其自动调用scrollTo(0,0)方法,我用了以下思路解决,仅提供该思路参考,大神们可以指出问题或更好的解决方案哈。
/**
* 是否禁止滚动
*/
private boolean isBanScroll = false;
/**
* 计算垂直方向滚动偏移。
*
* @return
*/
@Override
protected int computeVerticalScrollOffset() {//先计算完偏移量,才调用scrollTo方法
isBanScroll = true;
return super.computeVerticalScrollOffset();
}
@Override
public void scrollTo(int x, int y) {
if (!isBanScroll) {//不禁止时才滚动
super.scrollTo(x, y);
}
}
通过上面的控制,可以让系统不自动调用
scrollTo(0,0)方法,isBanScroll 参数可以在onInterceptTouchEvent方法中置为false。
@Override public boolean onInterceptTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downY = event.getY(); downX = event.getX(); isBanScroll = false; break; } return super.onInterceptTouchEvent(event); }完美解决了LinearLayout自动调用 scrollTo(0,0)方法滚动到顶部,同时不影响点击状态栏recyclerview自动滚回顶部。