一個滑動懸浮置頂的View,通過自定義ScrollView來實現一個精美的固定懸浮效果
效果圖:
這個特效其實沒有那么復雜!
思路:
- 自定義ListView對頭布局進行處理
- 自定義 RecycleView 貌似很復雜的樣子
- 自定義Behavior 把問題復雜化了
- 自定義listView + PopuWindows
- 自定義ViewGroup ,(需要重新onLayout登方法)
- 自定義Scrollview,對View進行處理
思來考去,其實我們寫View的時候以少量的代碼打造輪子才是精髓。於是對scrollView進行處理。明顯的簡單方面!!!
通過廣告欄的高度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里面進行
/** * 用於用戶手指離開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); } }; };
重要的在監聽回調里面做一些操作:
@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鏈接地址
https://github.com/androidstarjack/MyCorverUpLoadApp
下載慢?CSDN下載鏈接:
相信自己,沒有做不到的,只有想不到的
如果你覺得此文對您有所幫助,歡迎入群 QQ交流群 :232203809 微信公眾號:終端研發部