在Scrollview中实现控件置顶时悬浮的方法有很多,这里介绍一种实现起来比较简单的方法.
A和B是需要置顶显示的布局,A是我们额外画出来的布局,B是正常显示的布局.大体思路是在这个页面打开时,通过代码使A布局和B布局重合,监听scrollview的滑动事件,并相应的改变A布局的位置,当A布局没有滑动到顶部时,使它总是和B布局重合,当A布局滑动到顶部时那就让它一直在顶部显示.
public class MyScrollView extends ScrollView {private OnScrollListener onScrollListener;
public MyScrollView (Context context) {
super(context);
}
public MyScrollView (Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setOnScrollListener(OnScrollListener onScrollListener) {
this.onScrollListener = onScrollListener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (onScrollListener != null) {
onScrollListener.onScroll(t);
}
}
/**
* 滚动的回调接口
*/
public interface OnScrollListener {
/**
* 返回ScrollView滑动的Y方向距离
*
* @param scrollY
*/
public void onScroll(int scrollY);
}
}
自定义ScrollView,定义一个滑动监听接口,返回ScrollView在Y轴上滑动的距离.
在Activity中:
findViewById(R.id.rootLayout).getViewTreeObserver()
.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
onScroll(mMyScrollView.getScrollY());
}
});
rootLayout是这个页面的根部局,添加此监听,当页面布局发生变化时,手动的改变置顶布局的位置,使它和B布局重合
mMyScrollView = (MyScrollView) findViewById(R.id.mMyScrollView);
mMyScrollView.setOnScrollListener(new MyScrollView.OnScrollListener()
@Override
public void onScroll(int scrollY) {
int top= Math.max(scrollY, B.getTop());
A.layout(0, top, A.getWidth(),
top+ A.getHeight());
}
});
在程序中监听自定义的ScrollView的滑动事件,scrollY是scrollView在Y轴上滑动的距离,需要注意的是.getTop()是B布局到scrollView顶部的距离,而不是到屏幕顶端的距离,
它是一个固定的值,top是它们的最大值,然后动态的设置A布局在屏幕中的位置,这样就可以简单的实现布局置顶悬浮的效果了.
如果ScrollView里面嵌套的是Listview,那么需要自定义Listview,重写它的onMeasure方法,不过一般不推荐滑动布局嵌套另一个滑动布局:
@Override
/**
* 重写该方法,达到使ListView适应ScrollView的效果
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}