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

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,针对你的问题,我可以提供一些思路和参考代码。 首先,实现 Android 中的自定义吸顶,可以采用两种方式: 1. 使用固定顶部控件 + ScrollView + ViewPager 的方式实现。 这种方式比较常见,具体实现思路如下: (1)在布局文件中定义一个固定在顶部的控件,例如 LinearLayout,将其设置为可见性为 gone,即不可见。 (2)在 ScrollView 中添加 ViewPager,将其填充满整个布局,用于滑动切换不同的子页面。 (3)监听 ScrollView 的滑动事件,在滑动到一定位置时,将顶部控件设置为可见,实现吸顶效果。 具体实现代码可以参考以下链接: - https://www.jianshu.com/p/4f28a4d0c3b1 - https://www.cnblogs.com/xiaohuafice/p/11050662.html 2. 使用 CoordinatorLayout + AppBarLayout 实现。 这种方式相对来说比较简单,具体实现思路如下: (1)在布局文件中使用 CoordinatorLayout 作为根布局,并添加一个 AppBarLayout 作为子布局。 (2)在 AppBarLayout 中添加一个 Toolbar 控件作为顶部的固定控件,将其设置为可见性为 gone。 (3)在子页面中,使用 NestedScrollView 作为滑动的容器,并将其放在 AppBarLayout 的下面。 (4)监听 NestedScrollView 的滑动事件,在滑动到一定位置时,将 Toolbar 设置为可见,实现吸顶效果。 具体实现代码可以参考以下链接: - https://www.jianshu.com/p/5d0f7e7e7c97 - https://www.jianshu.com/p/5d0f7e7e7c97 希望以上内容能够帮助到你,有什么问题可以再和我交流哦!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值