原理:
如图,其实页面上有两个相同布局的标题,吸顶标题默认隐藏,然后监听ScrollView滚动的高度Y,当滚动的高度Y大于内容1的高度,吸顶标题显示,反之,隐藏吸顶标题。这样从视觉效果上看,标题具有吸顶效果。是不是很easy
原理二:
这种方式的实现方式就是对第一种实现方式的简单优化,其他基本一致。
大体思路:将方式一的两个顶部栏变成一个,利用removeView和addView根据坐标点在页面滑动的时候动态的把固定栏在内外部切换。在scrollview外部添加一个空的layout,当滑动到指定的点,就将内层悬浮窗布局移除,添加到外层的空的布局。这样就解决了要同步状态和写两个相同的xml布局的问题了。
原理三:
首先要使用android5.0的material design风格 我们需要引入以下依赖
优缺点比较:
1.性能不好
3.效果不一样,如果头部不显示的话,有问题
nestedwscrollview要求6.0(API23)
scrollview的setOnScrollChangeListener滚动监听,要求6.0(API23)之后才能用。
解决方法:在6.0以下有onScrollChanged方法,也能监听scrollview滑动,但是这个方法不能直接调用,所以要自定义一个继承scrollview的view,提供一个方法,把onScrollChanged暴露出来。
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
public class MyScrollView extends ScrollView
{
private ScrollViewListener scrollViewListener = null;
public interface ScrollViewListener
{
void onScrollChanged(MyScrollView scrollView, int l, int t, int oldl, int oldt);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener)
{
this.scrollViewListener = scrollViewListener;
}
public MyScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
//此方法受保护的
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt)
{
super.onScrollChanged(l, t, oldl, oldt);
if (scrollViewListener != null)
{
scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
}
}
}
完整的代码:
@Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { if (needFloatSerarch) { if (scrollY >= topHeight) {//悬挂 if (!isFloatingSearchView) { if (insideSeachLayout.getParent() != outSideLayout) { insideSeachLayoutParent.removeView(insideSeachLayout); outSideLayout.addView(insideSeachLayout); recyclerView.setNestedScrollingEnabled(true); isFloatingSearchView = true; } L.d("y >= topHeight" + "isFloatingSearchView=" + isFloatingSearchView);//已经滑动到了顶部 } } else { if (isFloatingSearchView) { if (insideSeachLayout.getParent() != insideSeachLayoutParent) { outSideLayout.removeView(insideSeachLayout); insideSeachLayoutParent.addView(insideSeachLayout); recyclerView.setNestedScrollingEnabled(false); isFloatingSearchView = false; } L.d("y < topHeight" + "isFloatingSearchView=" + isFloatingSearchView);// } } } }
NestedScrollView代替了ScrollView,他们两个都可以用来跟ToolBar交互,实现上拉下滑中ToolBar的变化。在NestedScrollView的名字中其实就可以看出他的作用了,Nested是嵌套的意思,而ToolBar基本需要嵌套使用。
NestedScrollView滚动到某一个位置的:
NestedScrollView的滚动监听,滚动到指定位置
scrollView.post(new Runnable() { @Override public void run() { scrollView.fling(-topHeight); scrollView.smoothScrollBy(0, -topHeight); } });
// 滚动到底部
nestedScrollView.fullScroll(ScrollView.FOCUS_DOWN);
滚动到顶部
// nestedScrollView.fullScroll(ScrollView.FOCUS_UP);
Android比较常见的滚动视图吸顶效果
【五种方式实现Android吸顶效果 最全总结!】列表滑动到顶部 固定顶部栏效果
demo
https://www.jianshu.com/p/23b8820f1549
demo
http://www.chenglong.ren/2016/11/14/android中nestedscrollview的使用/
https://www.jianshu.com/p/27b330bc09bf