亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android仿美團拖拽效果實例代碼

2019-10-21 21:25:39
字體:
來源:轉載
供稿:網友

效果圖

Android,仿美團,拖拽,代碼

如上圖,實現(xiàn)了拖拽事件的無縫過渡。效果很流暢很自然,之所以寫輪子因為實在找不到好用的庫,該庫參考了https://github.com/woxingxiao/SlidingUpPanelLayout ,其實在大神的開源庫里就有Issues提到內嵌 scrollView 時滑動沖突的問題。再加上最近項目里面的詳情頁就有這樣的拖拽效果需求,只好自己實現(xiàn)一遍。

在實現(xiàn)的過程中,就遇到幾個比較棘手的問題,也經過了一番掙扎才想出解決的方案。

困難

  • 拖拽釋放的時機,如下拉1/6就自動收縮否則回彈,上拉1/3回彈還是展開
  • 釋放后,在回彈過程中更新背后view的視覺差、漸變效果
  • 處理好上面兩個問題,就可以很流暢的實現(xiàn)拖拽展開和收縮效果,接下來過渡的傳遞問題
  • 點擊漸變區(qū)域收縮并把內部scrollView滾回頂部
  • 什么時機該攔截事件還是父view處理
  • 狀態(tài)的更新和回調

以上問題也不是一蹴而就就能羅列清楚,這都是每解決一個問題我就萌新另一種想法逐漸完善而得到的結果。就比如在實現(xiàn)這個效果之前,我就想應該和 ViewDragHelper 有關,那么拖拽都有哪些需要重寫的方法以及我自己需要實現(xiàn)哪些?關于重寫 tryCaptureView、getViewVerticalDragRange、clampViewPositionVertical 必須的就不多說了,下面兩方法在本項目中處理的邏輯簡單說一下

onViewPositionChanged:當拖拽view的位置發(fā)生改變時觸發(fā)

onViewReleased:簡單可以理解為不再拖拽時觸發(fā),但還有其狀態(tài)和方法會影響它觸發(fā)的時機,我們沒涉及到就不研究

回到開始我們想要的拖拽效果,超過多少就回彈、展開、收縮,在這里我們通過第一個方法可以知道,目前拖拽的view到底是展開還是收縮,我用了一個局部的boolean來記錄狀態(tài),畢竟此方法執(zhí)行頻繁減少消耗。再在釋放時根據 slideUp 來判斷,至于 onPanelDragged() 方法就用來跟新拖拽狀態(tài)和更新視覺差

 @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { slideUp = dy > 0;//正為收縮,負為展開 onPanelDragged(top); } @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { int target; if (!slideUp) {  if (mSlideOffset >= mAnchorPoint / 6) {  target = computePanelToPosition(mAnchorPoint);  } else {  target = computePanelToPosition(0f);  } }else {  if (mSlideOffset >= mAnchorPoint / 3) {  target = computePanelToPosition(0f);  } else {  target = computePanelToPosition(mAnchorPoint);  } } if (mDragHelper != null) {  mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), target); } }
 /** * 拖拽狀態(tài)更新以及位置的更新 * */ private void onPanelDragged(int newTop) { setPanelStateInternal(PanelState.DRAGGING); //重新計算距離頂部偏移 mSlideOffset = computeSlideOffset(newTop); //更新視覺差效果和分發(fā)事件 applyParallaxForCurrentSlideOffset(); //如果偏移是向上,覆蓋則無效,需要增加main的高度 LayoutParams lp = mMainView.getLayoutParams(); int defaultHeight = getHeight() - getPaddingBottom() - getPaddingTop() - mPanelHeight; if (mSlideOffset <= 0 && !mOverlayFlag) {  lp.height = (newTop - getPaddingBottom());  if (lp.height == defaultHeight) {  lp.height = LayoutParams.MATCH_PARENT;  } } else if (lp.height != LayoutParams.MATCH_PARENT && !mOverlayFlag) {  lp.height = LayoutParams.MATCH_PARENT; } mMainView.requestLayout(); }

緊接著,我們點擊展開后漸變層,收縮并將內嵌 scrollView 滾回頂部,點擊肯定就在 onTouchEvent 或者 dispatchTouchEvent 里實現(xiàn),但有沒有區(qū)別呢?首先明確一點的時,不管方法寫在哪個回調里面都可以實現(xiàn)我們需求,但在此我寫在了后者里面,因為在 viewGroup 里面的點擊事件傳遞,dispatchTouchEvent(分發(fā)) 會經過詢問 onInterceptTouchEvent(攔截) 是否攔截再到 onTouchEvent(響應),這也算是優(yōu)化的一點吧。

所有很自然而然地,我在分發(fā)里面處理了事件過渡的邏輯,其實說白了就在 MotionEvent.ACTION_MOVE 里決定了到底誰來消化這個事件

case MotionEvent.ACTION_MOVE:{ float dx = x - mPrevMotionX; float dy = y - mPrevMotionY; mPrevMotionX = x; mPrevMotionY = y; //橫向滑動就不分發(fā)了 if (Math.abs(dx) > Math.abs(dy)) {  return true; } //滑動向上、向下 if (dy > 0) { //收縮  if (mScrollableViewHelper.getScrollableViewScrollPosition(mScrollView, true) > 0) {  isMyHandleTouch = true;  return super.dispatchTouchEvent(ev);  } //之前子view處理了事件 //我們就需要重新組合一下讓面板得到一個合理的點擊事件 if (isMyHandleTouch) {  MotionEvent up = MotionEvent.obtain(ev);  up.setAction(MotionEvent.ACTION_CANCEL);  super.dispatchTouchEvent(up);  up.recycle();  ev.setAction(MotionEvent.ACTION_DOWN);  }  isMyHandleTouch = false;  return this.onTouchEvent(ev); } else { //展開  //scrollY=0表示沒滑動過,canScroll(1)表示可scroll up  //邏輯或的意義:拖拽到頂后,要不要禁用外部拖拽  if (isOnTopFlag == 1) {  int offset = mDragView.getScrollY();  boolean scroll = mScrollableViewHelper.getScrollableViewScrollPosition(mScrollView, true) > 0;  setEnabled(offset == 0 || scroll);  mDragHelper.abort();  return super.dispatchTouchEvent(ev);  }  //面板是否全部展開  if (mSlideOffset < mAnchorPoint) {  isMyHandleTouch = false;  return this.onTouchEvent(ev);  }  if (!isMyHandleTouch && mDragHelper.isDragging()) {  mDragHelper.cancel();  ev.setAction(MotionEvent.ACTION_DOWN);  }  isMyHandleTouch = true;  return super.dispatchTouchEvent(ev); }}
  • 這里消化了橫向滑動事件,因為內部 scrollView 可以通過橫向滑動優(yōu)先獲取控制權,不信你注釋那句代碼,在一開始就先右滑不放再上滑,就會出現(xiàn)所謂的 bug
  • getScrollableViewScrollPosition 方法是一個輔助類,用來判斷view在豎直方向還有沒有可滑動的距離
  • 關鍵的 return,是要繼續(xù)處理還是給 dragHelper 處理
  • 收縮和展開其核心都圍繞 event 該給誰處理,邏輯條件有點繞

(也因為在這里的處理邏輯,有很多操作的情況沒完全覆蓋,導致不可預知的滑動出現(xiàn)bug,如有發(fā)現(xiàn)請給我反饋,我去優(yōu)化)

處理到這里,需求基本達到了??梢越o設計師秀一波,把手機遞給她然后靜靜地聽她懟iOS了,“為什么 Android 都能做得到,你 iOS 卻做不出來,你看人家多厲害”。

再優(yōu)化一個小問題,狀態(tài)的回調,為了避免裝逼失敗等下要求展開或者收縮時又要做些什么效果,有點危機意識。我縱觀了一些全局,實在沒有合適的方法可做回調,實在沒有方法在任何操作都觸發(fā)啊。最后我打起漸變層的主意,這個實現(xiàn)可把我樂了一下,太聰明了哈哈哈哈哈而且狀態(tài)都能正確回調。你要知道漸變層繪制可是需要不停的觸發(fā)的,回調只能一次

@Overrideprotected boolean drawChild(Canvas canvas, View child, long drawingTime) { ...(省略一些代碼) //沒有合適的回調方法,只能另辟蹊徑了 //在這里判斷dragView有沒有到頂,然后把事件給內嵌view final int targetY = computePanelToPosition(mAnchorPoint); final int originalY = computePanelToPosition(0f); if (mDragView.getTop() == targetY) { //避免多次回調 if (isOnTopFlag != 1 && stateCallback != null) {  stateCallback.onExpandedState(); } isOnTopFlag = 1; }else if (mDragView.getTop() == originalY){ if (isOnTopFlag == -1 && stateCallback != null) {  stateCallback.onCollapsedState(); } isOnTopFlag = 0; }else { isOnTopFlag = -1; }...(省略一些代碼)}

github:https://github.com/BmobSnail/SlideNestedPanelLayout 

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
97se亚洲国产综合自在线| 五月天中文字幕| 加勒比海盗1在线观看免费国语版| 欧美视频免费看| 精品手机在线视频| 黑人巨大精品一区二区在线| 国产精品一区免费视频| 欧美成人精品三级在线观看| 久久亚洲精品国产亚洲老地址| 亚洲成成品网站| 成人免费精品动漫网站| 日韩欧美亚洲日产国产| www.亚洲.com| 在线影视一区二区三区| 欧美色片在线观看| 日本久久久久久久| 欧美高清性粉嫩交| 国产欧美91| 韩国三级中文字幕hd久久精品| av网站免费在线| 国产123在线| 欧美精品久久96人妻无码| 999这里有精品| 亚洲男人天堂色| 性欧美videos精品| 精品国产乱码| 色婷婷激情一区二区三区| 美女喷白浆视频| 女同久久另类99精品国产| 屁屁影院ccyy国产第一页| 国产成人av一区二区三区| www.激情网.com| 红桃av在线播放| xxxxwwww在线免费观看| 麻豆视频在线免费看| 最新天堂资源在线| 欧美性猛交xxxx免费看久久久| 超碰中文字幕在线| av黄色在线看| 黄色动漫在线免费观看| 日本在线视频网| 久久久久久久久综合影视网| 性国产高清在线观看| 一级毛片免费观看| 自拍日韩欧美| 99re这里只有精品视频首页| 午夜理伦三级做爰电影| 91九色国产视频| 欧美多人乱p欧美4p久久| 农村妇女精品一区二区| 国内精品久久久久| 四虎永久免费影库二三区| 91国产免费看| 男人天堂久久| 亚洲国产精品网站| 五月亚洲婷婷| 欧美日韩亚洲高清一区二区| 午夜爽爽爽男女免费观看| 日韩一区二区精品葵司在线| 国内精品美女在线观看| 亚洲男人天堂2019| 亚洲第一福利专区| 日韩国产中文字幕| 国产一区私人高清影院| 欧美亚洲大陆| 日韩精品福利在线| 国产成人高清激情视频在线观看| 一本一道久久a久久精品| 国产一级网站视频在线| 天堂资源最新在线| 九色中文视频| 久播影院第一理论片| 国产无遮挡又黄又爽在线观看| 91传媒在线观看| 小说区视频区图片区| 小次郎av收藏家| 欧美va亚洲va日韩∨a综合色| 男人天堂资源网| 在线观看免费av网址| 视频免费1区二区三区| 国产一区二区三区色淫影院| 亚洲一区二区三区自拍| 日韩精品久久久毛片一区二区| 成人国产视频在线观看| 久久久久久久一区二区| 性亚洲最疯狂xxxx高清| 国产婷婷一区二区三区久久| 国产视频手机在线| 免费av在线播放| 欧洲激情视频| 日韩高清不卡在线| 亚洲国产高清福利视频| 美女又爽又黄视频毛茸茸| 国产激情91久久精品导航| 国产精品美女久久久| 国产美女自拍| 亚洲精品aaaa精品| 美女与牲口做爰视频在线观看| 姑娘第5集在线观看免费好剧| 天天摸天天舔天天操| 嫩草视频免费在线观看| 国产精品视频第一页| 人人妻人人澡人人爽欧美一区| 欧美激情在线观看| 国产美女久久久久| 国产日韩欧美精品一区| 日韩性小视频| 久久影院模特热| 92精品国产成人观看免费| 日韩欧美一区二区三区免费看| 精品在线一区二区| 国产一二三四| 日韩一级精品视频在线观看| 波多野结衣mp4| 97超碰在线公开在线看免费| av电影中文字幕| 瑟瑟在线观看| 天天操天天干天天插| 日韩成人在线播放| 美女搞黄视频在线观看| 欧美激情一区二区三区不卡| 欧美午夜无遮挡| 在线三级av| 人与牲动交xxxxbbbb高清| 在线 亚洲欧美在线综合一区| 亚洲天堂资源在线| 最近中文字幕在线mv视频在线| 欧美成人一区二区视频| 九义人在线观看完整免费版电视剧| 蜜桃视频一区二区三区| 亚洲资源在线看| 日韩中文字幕在线视频| h视频在线观看网站| 日韩欧美亚洲另类制服综合在线| 黄在线观看免费网站ktv| 成人免费在线一区二区三区| 成人爽a毛片免费啪啪动漫| www.欧美色图| xxxxx在线观看| 国产欧美精品日韩| 欧美专区日韩专区| 777影院狠狠色| 欧美成人中文字幕| 日韩大陆毛片av| 成人黄色国产精品网站大全在线免费观看| 最新中文字幕一区二区三区| 国产精品直播网红| 性欧美孕妇孕交| 18free性欧美另类hd| 亚洲国产精品成人va在线观看| 亚洲日本aⅴ片在线观看香蕉| 欧美性69xxxx肥| 日本精品久久电影| a91a精品视频在线观看| 精品人妻一区二区三区视频| 成人午夜精品一区二区三区| eeuss影院www影院入口| 韩国午夜理伦三级不卡影院| 国产日韩高清在线| www.操操| 91黄色精品| 美女脱光内衣内裤视频久久影院| 欧美天堂影院| 亚洲一级免费在线观看| 久久综合中文| 中文字幕亚洲欧美一区二区三区| www.亚洲一区| 男人添女人下部高潮视频在线观看| 成人www视频网站免费观看| 日本伊人精品一区二区三区介绍| 99蜜桃臀久久久欧美精品网站| 黄色一级大片免费| 欧美大片网站在线观看| 欧美xxxx做受欧美.88| 2018中文字幕第一页| 亚洲国产精品国自产拍av秋霞| 风间由美久久久| 91天堂在线观看| 亚洲欧美在线视频| 538任你躁在线精品免费| 日韩毛片免费观看| 国产一区二区波多野结衣| 成人黄色网页| 国产欧美日韩免费看aⅴ视频| yy6080午夜| 黄色av网址在线观看| 日韩视频一区二区三区在线播放| 国产精品免费精品一区| 亚洲图片久久| 久久精品国语| 极品久久久久久| 久久精品99久久久久久| 日韩成人在线视频网站| 成人黄色a**站在线观看| 亚洲色图欧美在线| av毛片在线免费看| 中文字幕在线观看视频www| 簧片在线免费看| 亚洲一区二三区| 日韩av一区在线观看| 香蕉视频911| 俺也去精品视频在线观看| 亚洲综合大片69999| 黑人巨大精品欧美一区二区小视频| 欧美亚洲一区二区三区| 国产精品 日韩| 免费看av不卡| 九九视频九九热| 欧美一区二区三区免费观看视频| 四虎成人在线播放| 国产成人在线播放视频| 亚洲影院色无极综合| 激情综合在线观看| 午夜性福利视频| 亚洲国产精品久久精品怡红院| 视频一区免费观看| 另类国产精品一区二区| 国产一区二区三区不卡在线观看| 男男做爰猛烈叫床爽爽小说| 国产亚洲精品激情久久| 久久久久久久尹人综合网亚洲| 亚洲欧美综合区自拍另类| 亚洲女同一区| 中文岛国精品亚洲一区| 老司机免费视频一区二区三区| 日韩欧美一级在线播放| 精品国产乱码久久久久久老虎| 一区二区三区国产精华| 日韩一级淫片| 动漫3d精品一区二区三区| 精品国产一区二区在线观看| 亚洲亚洲精品三区日韩精品在线视频| 亚洲第一天堂无码专区| 久久精品亚洲94久久精品| 国产精品传媒入口麻豆| 伪装者在线观看完整版免费| 香蕉av在线| 欧美69xxxxx| 风间由美一区二区三区在线观看| 二区三区中文字幕| 亚洲激情午夜| www.国产精品.com| 久久久久久久久艹| 99re资源| 成人在线播放网址| 中文字幕人妻精品一区| 国产在线视频综合| 不卡视频在线| 国产制服91一区二区三区制服| 亚洲激情国产| 国产视频1区2区3区| 国产老女人精品毛片久久| 国产精品少妇在线视频| 一级香蕉视频在线观看| 69av影院| 欧美激情极品视频| 久久精品国产68国产精品亚洲| 婷婷社区五月天| 色噜噜狠狠色综合网图区| 国产精品冒白浆免费视频| 中文字幕电影一区| 瑟瑟视频在线观看| 亚洲av无码一区二区三区在线| 欧美黄免费看| 免费成人在线看| 国产精品成人av| 日本网站在线看| 国产91对白在线播放| 国产激情美女久久久久久吹潮| av在线电影网| 菠萝蜜视频在线观看www入口| 精品在线亚洲视频| 欧美一区三区四区| 19j韩国主播韩宝贝在线| 国产91精品入口17c| 91av在线网站| 精品亚洲夜色av98在线观看| 欧美日韩国产激情| 天堂久久午夜av| 国产绿帽一区二区三区| 日韩中文字幕第一页| 免费黄色网网址| 福利片在线免费观看| 免费观看一级特黄欧美大片| 影音先锋亚洲电影| 亚洲欧洲一区二区三区久久| 亚洲欧美综合另类在线卡通| 中文字幕av在线| 国产精品电影在线观看| 欧美一区二区免费在线观看| 成人免费网站观看| 国产精品视频你懂的| 91超碰在线免费| 激情国产在线| 国内精品久久久久国产| 触手亚洲一区二区三区| 在线视频成人| 欧美aa国产视频| 欧美黑人激情| 成人不用播放器| www.成人在线| 亚洲成人tv网| 最近免费中文字幕中文高清百度| 99久久久久久久久久| 97精品人妻一区二区三区香蕉| 国产综合色视频| 人妻互换一区二区激情偷拍| 免费在线黄色电影| 天天色天天射天天综合网| 国产精品一二一区| 亚洲黄色免费av| 麻豆精品国产91久久久久久| 国产高清不卡av| 亚洲最大免费视频| 国产 日韩 欧美 综合 一区| 狠狠干夜夜爽| 就爱干草视频| 一二三四区在线观看| 女女同性女同一区二区三区按摩| 国产va免费精品观看精品| av激情在线| 免费看黄在线看| 日本免费一级视频| 麻豆免费版在线观看| 国产成人禁片免费观看| 国产欧美日韩综合一区在线观看| 自拍偷拍欧美激情| 日本免费黄网站|