Android实现下拉头部缩放功能
?
?
概念介紹
1、onInterceptTouchEvent()是用于處理事件(重點onInterceptTouchEvent這個事件是從父控件開始往子控件傳的,直到有攔截或者到沒有這個事件的view,然后就往回從子到父控件,這次是onTouch的)(類似于預處理,當然也可以不處理)并改變事件的傳遞方向,也就是決定是否允許Touch事件繼續向下(子控件)傳遞,一但返回True(代表事件在當前的viewGroup中會被處理),則向下傳遞之路被截斷(所有子控件將沒有機會參與Touch事件),同時把事件傳遞給當前的控件的onTouchEvent()處理;返回false,則把事件交給子控件的onInterceptTouchEvent()
2、onTouchEvent()用于處理事件(重點onTouch這個事件是從子控件回傳到父控件的,一層層向下傳),返回值決定當前控件是否消費(consume)了這個事件,也就是說在當前控件在處理完Touch事件后,是否還允許Touch事件繼續向上(父控件)傳遞。返回false,則向上傳遞給父控件,詳細一點就是這個touch事件就給了父控件,那么后面的up事件就是到這里touch觸發,不會在傳給它的子控件。如果父控件依然是false,那touch的處理就給到父控件的父控件,那么up的事件處理都在父控件的父控件,不會觸發下面的。
思路:
監聽手勢,記錄下拉的距離,將滑動的值(可以幾分之一)+頭部原始值? 從新付給頭部參數
先看效果
詳細步驟:
1.onInterceptTouchEvent部分,當手指按下記錄當前的坐標值,返回false 意思是將事件傳給子view,當開始拉動時,攔截事件,事件不傳遞給子view,記錄最新的坐標值? ? ? ? ??mLastMotionY = y;? ? ?當手指離開屏幕時,取消攔截,將事件傳遞給子view
? ? ? ? ? ? ? ? ? ? ? ? ? ? mLastMotionX = x;
?
?
2.onTouchEvent 部分,手指按下記錄初始坐標值(并消耗事件),手指滑動記錄最新的坐標值,同時調用pullEvent()函數來刷新界面
@Overridepublic boolean onTouchEvent(@NonNull MotionEvent event) {if (!isPullToZoomEnabled() || isHideHeader()) {return false;}if (event.getAction() == MotionEvent.ACTION_DOWN && event.getEdgeFlags() != 0) {return false;}switch (event.getAction()) {case MotionEvent.ACTION_MOVE: {if (mIsBeingDragged) {mLastMotionY = event.getY();mLastMotionX = event.getX();pullEvent();isZooming = true;return true;}break;}case MotionEvent.ACTION_DOWN: {if (isReadyForPullStart()) {mLastMotionY = mInitialMotionY = event.getY();mLastMotionX = mInitialMotionX = event.getX();return true;}break;}case MotionEvent.ACTION_CANCEL:case MotionEvent.ACTION_UP: {if (mIsBeingDragged) {mIsBeingDragged = false;// If we're already refreshing, just scroll back to the topif (isZooming()) {smoothScrollToTop();if (onPullZoomListener != null) {onPullZoomListener.onPullZoomEnd();}isZooming = false;return true;}return true;}break;}}return false;}?取豎直方向滑動的距離的1/2,傳遞給相頭部和需要放大的圖片 重新設置值
private void pullEvent() {final int newScrollValue;final float initialMotionValue, lastMotionValue;initialMotionValue = mInitialMotionY;lastMotionValue = mLastMotionY;newScrollValue = Math.round(Math.min(initialMotionValue - lastMotionValue, 0) / FRICTION);pullHeaderToZoom(newScrollValue);if (onPullZoomListener != null) {onPullZoomListener.onPullZooming(newScrollValue);}}?
?頭部設置新的高度,同時圖片同上設置新的高度
@Overrideprotected void pullHeaderToZoom(int newScrollValue) {Log.d(TAG, "pullHeaderToZoom --> newScrollValue = " + newScrollValue);Log.d(TAG, "pullHeaderToZoom --> mHeaderHeight = " + mHeaderHeight);if (mScalingRunnable != null && !mScalingRunnable.isFinished()) {mScalingRunnable.abortAnimation();}ViewGroup.LayoutParams localLayoutParams = mHeaderContainer.getLayoutParams();localLayoutParams.height = Math.abs(newScrollValue) + mHeaderHeight;mHeaderContainer.setLayoutParams(localLayoutParams);if (isCustomHeaderHeight) {ViewGroup.LayoutParams zoomLayoutParams = mZoomView.getLayoutParams();zoomLayoutParams.height = Math.abs(newScrollValue) + mHeaderHeight;mZoomView.setLayoutParams(zoomLayoutParams);}}大概的思路如上
?
?
總結
以上是生活随笔為你收集整理的Android实现下拉头部缩放功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ajax、jQuery基础入门视频教程
- 下一篇: MATLAB 2018a软件安装教程