Android ScrollView中控制元件頂部懸浮
阿新 • • 發佈:2019-02-07
在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);
}