日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Android实现下拉头部缩放功能

發布時間:2025/4/16 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;

@Overridepublic boolean onInterceptTouchEvent(MotionEvent event) {if (!isPullToZoomEnabled() || isHideHeader()) {return false;}final int action = event.getAction();if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {mIsBeingDragged = false;return false;}if (action != MotionEvent.ACTION_DOWN && mIsBeingDragged) {return true;}switch (action) {case MotionEvent.ACTION_MOVE: {if (isReadyForPullStart()) {final float y = event.getY(), x = event.getX();final float diff, oppositeDiff, absDiff;// We need to use the correct values, based on scroll// directiondiff = y - mLastMotionY;oppositeDiff = x - mLastMotionX;absDiff = Math.abs(diff);if (absDiff > mTouchSlop && absDiff > Math.abs(oppositeDiff)) {if (diff >= 1f && isReadyForPullStart()) {mLastMotionY = y;mLastMotionX = x;mIsBeingDragged = true;}}}break;}case MotionEvent.ACTION_DOWN: {if (isReadyForPullStart()) {mLastMotionY = mInitialMotionY = event.getY();mLastMotionX = mInitialMotionX = event.getX();mIsBeingDragged = false;}break;}}return mIsBeingDragged;}

?

?

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实现下拉头部缩放功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。