一個滑動懸浮置頂的View,經過自定義ScrollView來實現一個精美的固定懸浮效果android
效果圖:git
這個特效其實沒有那麼複雜!github
思路:bash
思來考去,其實咱們寫View的時候以少許的代碼打造輪子纔是精髓。因而對scrollView進行處理。明顯的簡單方面!!!ide
經過廣告欄的高度H和view中Y方向鎖滑動的距離Y進行比較,從而對view進行處理佈局
關鍵代碼:學習
重寫onTouchEvent獲取滑動的距離動畫
/**
* 重寫onTouchEvent, 當用戶的手在HoveringScrollview上面的時候,
*/
public boolean onTouchEvent(MotionEvent ev) {
//直接將HoveringScrollview滑動的Y方向距離回調給onScroll方法中
if (onScrollListener != null) {
onScrollListener.onMyScroll(lastScrollY = this.getScrollY());
}
switch (ev.getAction()) {
//當用戶擡起手的時候, HoveringScrollview可能還在滑動,
// 因此當用戶擡起手咱們隔6毫秒給handler發送消息,
// 在handler處理 HoveringScrollview滑動的距離
case MotionEvent.ACTION_UP:
handler.sendMessageDelayed(handler.obtainMessage(), 20);
break;
}
return super.onTouchEvent(ev);
};
`複製代碼
須要在Handler裏面進行ui
/**
* 用於用戶手指離開MyScrollView的時候獲取MyScrollView滾動的Y距離,而後回調給onScroll方法中
*/
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
int scrollY = HoveringScrollview.this.getScrollY();
// 此時的距離和記錄下的距離不相等,在隔6毫秒給handler發送消息?
if (lastScrollY != scrollY) {
lastScrollY = scrollY;
handler.sendMessageDelayed(handler.obtainMessage(), 6);
}
if (onScrollListener != null) {
onScrollListener.onMyScroll(scrollY);
}
};
};複製代碼
重要的在監聽回調裏面作一些操做:this
@Override
public void onMyScroll(int scrollY) {
LogUtils.e("yuyahao","scrollY: " +scrollY);
// TODO Auto-generated method stub
if (scrollY >= searchLayoutTop) {
if (hoveringLayout.getParent() != search01) {
search02.removeView(hoveringLayout);
search01.addView(hoveringLayout);
}
} else {
if (hoveringLayout.getParent() != search02) {
search01.removeView(hoveringLayout);
search02.addView(hoveringLayout);
}
}
}複製代碼
當廣告欄的高亮 大於手指所華東的高度的時候,所指定固定懸浮的View在他自己父佈局的View中,不然指定一個頂部的父容器添加在裏面便可。
代碼並無不少,須要的同窗能夠下載github Demo體驗和學習。
項目Github連接地址
下載慢?CSDN下載連接: