Android ScrollView中控件頂部懸浮

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章