Android NestedScrollView当下最流行的滚动视图+吸顶效果的实现最简单的方式--高仿携程(抖音七)

原理:
【Android NestedScrollView当下最流行的滚动视图+吸顶效果的实现最简单的方式--高仿携程(抖音七)】如图,其实页面上有两个相同布局的标题,吸顶标题默认隐藏,然后监听ScrollView滚动的高度Y,当滚动的高度Y大于内容1的高度,吸顶标题显示,反之,隐藏吸顶标题。这样从视觉效果上看,标题具有吸顶效果。是不是很easy

原理二:
使用一个顶部栏 用一个空布局动态增删顶部栏来实现。

这种方式的实现方式就是对第一种实现方式的简单优化,其他基本一致。
大体思路:将方式一的两个顶部栏变成一个,利用removeView和addView根据坐标点在页面滑动的时候动态的把固定栏在内外部切换。在scrollview外部添加一个空的layout,当滑动到指定的点,就将内层悬浮窗布局移除,添加到外层的空的布局。这样就解决了要同步状态和写两个相同的xml布局的问题了。

原理三:
借助android5.0的新特性 CoordinatorLayout+AppbarLayout+ CollapsingToolbarLayout 首先要使用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滑动到指定View的位置 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




    推荐阅读