效果图:
效果分析:
往上滑动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控件中。
结束。