Android 在ScrollView中的导航栏悬浮吸顶方法实现

效果图:

Android 在ScrollView中的导航栏悬浮吸顶方法实现_第1张图片

效果分析:

往上滑动scrollview当

导航栏距屏幕顶部的距离小于等于标题栏的高度时 悬浮,即上滑到紧贴标题栏时 悬浮。

反之:

(导航栏原来的位置)下滑到距离大于标题栏的高度时将悬浮的导航栏放回原来的位置。

 

实现步骤:

1、首先是布局实现,在内容布局(标题下面的容器)中,最外层使用FrameLayout包裹住ScrollView(自定义ScrollView,写一个接口监听它的onScrollChanged方法)控件和一个空的LinearLayout控件(用于动态将ScrollView控件中的导航栏添加到里面)。

xml布局,大致酱紫,不重要的view都已省略,重点看注释,看注释,看注释:


 

 
  

           
            

               
                 

                  
                   

                   
                    
                
               
                    

               

            
                  
           
                    
            
       

 

 2、然后是java代码

主要代码,重点还是看注释:

//scrollview的滑动监听  
  @Override
    public void onScrollChanged(MyScrollView ceshimy, int scrollX, int scrollY, int oldl, int oldt) {
        int[] location = new int[2];
        lineAddNavigationFixation.getLocationOnScreen(location);
 //lineAddNavigationFixation是包裹导航栏的LinearLayout

        int y = location[1];//导航栏距屏幕顶部的距离,会随着scrollview的滑动而改变
        if (y <= titleView.getHeight()) {//导航栏距屏幕顶部的距离小于等于标题栏的高度时 悬浮,即上滑到紧贴标题栏时 悬浮
            addNavigationSuspension();
        } else {//反之下滑到距离大于标题栏的高度时放回原来的位置
            addNavigationFixation();
        }

    }

  private void addNavigationSuspension() {//添加悬浮
 //lineAddNavigationSuspension是布局中的占位LinearLayout
        if (lineAddNavigationSuspension.getChildCount() == 0) {
           
            if (navigationDevice.getParent() != null)
                ((ViewGroup) navigationDevice.getParent()).removeView(navigationDevice);

            lineAddNavigationSuspension.addView(navigationDevice);
        }
    }

    private void addNavigationFixation() {//悬浮固定到原位置
        if (lineAddNavigationFixation.getChildCount() == 0) {
            //  L.e("---" + "固定");
            if (navigationDevice.getParent() != null)
                ((ViewGroup) navigationDevice.getParent()).removeView(navigationDevice);

            lineAddNavigationFixation.addView(navigationDevice);
        }
    }

ok,逻辑代码这么点,是不是so简单。

实现原理:

简单概括就是:

布局中,固定一个位置紧靠着标题栏的Linearlayout空控件,和在导航栏控件的外层包裹一个固定高度的Linearlayout控件。监听scrollview的滑动位置,做出相应操作动态将导航栏控件添加到某一个Linearlayout控件中。

结束。

 

 

 

 

 

你可能感兴趣的:(笔记,布局)