Android ScrollView中控件顶部悬浮

来源:互联网 发布:python statement 编辑:程序博客网 时间:2024/06/11 21:55

在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);}

0 0
原创粉丝点击