1. 程式人生 > >Android ScrollView中控制元件頂部懸浮

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