日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android实现下拉头部缩放功能

發(fā)布時間:2025/4/16 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android实现下拉头部缩放功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

?

概念介紹

1、onInterceptTouchEvent()是用于處理事件(重點(diǎn)onInterceptTouchEvent這個事件是從父控件開始往子控件傳的,直到有攔截或者到?jīng)]有這個事件的view,然后就往回從子到父控件,這次是onTouch的)(類似于預(yù)處理,當(dāng)然也可以不處理)并改變事件的傳遞方向,也就是決定是否允許Touch事件繼續(xù)向下(子控件)傳遞,一但返回True(代表事件在當(dāng)前的viewGroup中會被處理),則向下傳遞之路被截斷(所有子控件將沒有機(jī)會參與Touch事件),同時把事件傳遞給當(dāng)前的控件的onTouchEvent()處理;返回false,則把事件交給子控件的onInterceptTouchEvent()

2、onTouchEvent()用于處理事件(重點(diǎn)onTouch這個事件是從子控件回傳到父控件的,一層層向下傳),返回值決定當(dāng)前控件是否消費(fèi)(consume)了這個事件,也就是說在當(dāng)前控件在處理完Touch事件后,是否還允許Touch事件繼續(xù)向上(父控件)傳遞。返回false,則向上傳遞給父控件,詳細(xì)一點(diǎn)就是這個touch事件就給了父控件,那么后面的up事件就是到這里touch觸發(fā),不會在傳給它的子控件。如果父控件依然是false,那touch的處理就給到父控件的父控件,那么up的事件處理都在父控件的父控件,不會觸發(fā)下面的。

思路:

監(jiān)聽手勢,記錄下拉的距離,將滑動的值(可以幾分之一)+頭部原始值? 從新付給頭部參數(shù)

先看效果

詳細(xì)步驟:

1.onInterceptTouchEvent部分,當(dāng)手指按下記錄當(dāng)前的坐標(biāo)值,返回false 意思是將事件傳給子view當(dāng)開始拉動時,攔截事件,事件不傳遞給子view,記錄最新的坐標(biāo)值? ? ? ? ??mLastMotionY = y;? ? ?當(dāng)手指離開屏幕時,取消攔截,將事件傳遞給子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 部分,手指按下記錄初始坐標(biāo)值(并消耗事件),手指滑動記錄最新的坐標(biāo)值,同時調(diào)用pullEvent()函數(shù)來刷新界面

@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,傳遞給相頭部和需要放大的圖片 重新設(shè)置值

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);}}

?

?頭部設(shè)置新的高度,同時圖片同上設(shè)置新的高度

@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);}}

大概的思路如上

?

?

總結(jié)

以上是生活随笔為你收集整理的Android实现下拉头部缩放功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。