精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一步一步教你150行代碼實現簡書滑動返回效果

移動開發
通過閱讀本文你能學習到: 1、ViewDragHelper的使用(如果你想學習自定義View,那么ViewDragHelper你絕對不能錯過) 2、好像也沒有什么了.... 這個效果,難度不大,會ViewDragHelper的同學應該10分鐘就能寫出來了吧~如果不會也沒關系~

今天帶大家實現簡書的滑動返回效果.

先看看效果圖:

最終效果圖.gif

因為沒有具體內容,也沒有簡書的圖片資源,所以稍微簡陋了點.
但是依然不妨礙我們的效果展示~

OK,接下來慣例,通過閱讀本文你能學習到:

  1. ViewDragHelper的使用(如果你想學習自定義View,那么ViewDragHelper你絕對不能錯過)
  2. 好像也沒有什么了....

這個效果,難度不大,會ViewDragHelper的同學應該10分鐘就能寫出來了吧~
如果不會也沒關系~

1. 我們自定義一個SwipeBackFrameLayout繼承自FrameLayout

1.1 因為看到左邊黃色的View是被遮住的,而另外一個View的寬度是MatchParent的,所以FrameLayout是不錯的選擇.
順便增加一個回調,通知activity去finish

  1. public void setCallback(Callback mCallback){ 
  2.     this.mCallback = mCallback; 
  3. private Callback mCallback; 
  4. public interface Callback{ 
  5.     void onShouldFinish(); 

1.2 Xml布局,非常簡單:

  1. <yifeiyuan.practice.practicedemos.drager.SwipeBackFrameLayout  
  2. xmlns:android="http://schemas.android.com/apk/res/android"     
  3. xmlns:tools="http://schemas.android.com/tools"     
  4. android:id="@+id/swipe_back" 
  5. android:layout_width="match_parent"     
  6. android:layout_height="match_parent"     
  7. tools:context="yifeiyuan.practice.practicedemos.drager.SwipeBackActivity"
  8.     <TextView 
  9.         android:layout_width="40dp"         
  10.         android:layout_height="match_parent"         
  11.         android:text="@string/hello_world" 
  12.         android:gravity="center" 
  13.         android:background="#ffff00" 
  14.         /> 
  15.     <View 
  16.         android:layout_width="match_parent"         
  17.         android:layout_height="match_parent" 
  18.         android:background="#ff00ff" 
  19.         /> 
  20. </yifeiyuan.practice.practicedemos.drager.SwipeBackFrameLayout> 

1.3 實例化一個ViewDragHelper

  1. //1f代表靈敏度  
  2. mDragHelper = ViewDragHelper.create(this, 1f,new ViewDragHelper.Callback() { 
  3.     @Override 
  4.     public boolean tryCaptureView(View child, int pointerId) { 
  5.         return false
  6.     } 
  7. //因為我們是從左向右滑動 所以設置EDGE_LEFT 
  8. mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); 

1.4 在SwipeBackFrameLayout里實例化xml里的子View

  1. private View mDividerView; 
  2. private View mContentView; 
  3. @Override 
  4. protected void onFinishInflate() { 
  5.     super.onFinishInflate();  
  6.    mDividerView = getChildAt(0); 
  7.     mDividerView.setAlpha(0f); 
  8.     mContentView = getChildAt(1); 

1.5 讓ViewDragHelper處理touch事件

  1. @Override 
  2. public boolean onInterceptTouchEvent(MotionEvent ev) { 
  3.     return mDragHelper.shouldInterceptTouchEvent(ev); 
  4.  
  5. @Override 
  6. public boolean onTouchEvent(MotionEvent event) {     
  7.     mDragHelper.processTouchEvent(event); 
  8.     return true

1.6重寫ViewDragHelper的一些處理方法
已附上詳細注釋

  1. @Override 
  2. public void onEdgeTouched(int edgeFlags, int pointerId) {     
  3.     super.onEdgeTouched(edgeFlags, pointerId);  
  4.    //觸摸到左邊界的時候 我們capture住mContentView            
  5.     mDragHelper.captureChildView(mContentView, pointerId);  
  6. }             
  7. @Override             
  8. public int getViewHorizontalDragRange(View child) { 
  9.       return 1;       
  10.  
  11. @Override  
  12. public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { 
  13.      super.onViewPositionChanged(changedView, left, top, dx, dy); 
  14.      Log.d(TAG, "onViewPositionChanged() called with left = [" + left + "], top = [" + top + "], dx = [" + dx + "], dy = [" + dy + "]");  
  15.      //0.0 - 1.0 
  16.      //Notice 這邊可以給個接口回調出去,就可以做各種炫酷的效果了                      
  17.      float alpha = (float) (left*1.0/mDividerWidth);   
  18.      mDividerView.setAlpha(alpha);             
  19. }   
  20.      @Override 
  21.      public int clampViewPositionHorizontal(View child, int left, int dx) { 
  22. //                Log.d(TAG, "clampViewPositionHorizontal() called with  dx = [" + dx + "]"); 
  23.      // 計算left 我們的目標范圍是0-dividerwidth的寬度 
  24.      mLastdx = dx;  
  25.      int newLeft = Math.min(mDividerWidth, Math.max(left,0));                            
  26.      return newLeft;  
  27. }             
  28.      @Override             
  29.      public void onViewReleased(View releasedChild, float xvel, float yvel) {                 
  30.      //>0代表用戶想關閉                 
  31.      if (mLastdx>0){ 
  32.      // 還不到關閉條件,我們讓view滑動過去,再關閉                     
  33.      if (mDividerWidth != releasedChild.getLeft()) {     
  34.        mDragHelper.settleCapturedViewAt(mDividerWidth,releasedChild.getTop(); 
  35.        invalidate();  
  36. else {     
  37.      if (mCallback != null) {   
  38.           mCallback.onShouldFinish();   
  39.       }      
  40. }   
  41. }else{             
  42.         //用戶不想關閉 ,則滑動到最左邊 
  43.      if (mDividerWidth != 0) {    
  44.           mDragHelper.settleCapturedViewAt(0, releasedChild.getTop());   
  45.           invalidate();   
  46.      } 
  47. }             
  48. }             
  49.  
  50.      @Override             
  51.      public void onViewDragStateChanged(int state) {   
  52.               super.onViewDragStateChanged(state);  
  53. //滑動停止,并且到達了滑動的判斷條件 則回調關閉 
  54. if(mDragHelper.getViewDragState()==ViewDragHelper.STATE_IDLE&&mCallback != null&&mDividerWidth==mContentView.getLeft()&&mLastdx>0) {                     
  55. mCallback.onShouldFinish();  
  56.                } 
  57.             } 
  58.         }); 

1.7 增加對view滑動事件處理,對于以上mDividerWidth我們在onLayout里獲取

  1. private int mDividerWidth; 
  2. @Override 
  3. protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
  4.     super.onLayout(changed, left, top, right, bottom); 
  5.     mDividerWidth = mDividerView.getWidth(); 
  6. //Notice view 剛初始化的時候就會被調用一次 
  7.     @Override 
  8.     public void computeScroll() { 
  9.         super.computeScroll(); 
  10.       //        Log.d(TAG, "computeScroll() called with " + "");  
  11.     if (mDragHelper.continueSettling(true)) { 
  12.         invalidate(); 
  13.      } 

我們寫完自定義view后還需要自定義一下activity的退出動畫~

2.定義activity的finish動畫

2.1 在anim目錄下,創建兩個動畫xml:

  1. //no_anim 
  2. <alpha 
  3. android:duration="300"     
  4. xmlns:android="http://schemas.android.com/apk/res/android"     
  5. android:fromAlpha="1.0" 
  6. android:toAlpha="1.0" 
  7. ></alpha> 
  8.  
  9. //out_to_right 
  10. <translate     
  11. xmlns:android="http://schemas.android.com/apk/res/android"     
  12. android:duration="300"     
  13. android:fromXDelta="0%"     
  14. android:toXDelta="100%"     
  15. ></translate> 

2.2 在activity里設置callback監聽,并運用動畫

  1. mSwipeBack.setCallback(new SwipeBackFrameLayout.Callback() {     
  2.     @Override 
  3.     public void onShouldFinish() { 
  4.         finish(); 
  5.         overridePendingTransition(R.anim.no_anim, R.anim.out_to_right); 
  6.     } 
  7. }); 

好了!!~代碼量非常少!~就是這么簡單~

吐槽一下,簡書對代碼塊的支持太差了,代碼復制過來全是亂的!!
同學們還是去看源碼吧:

源碼在我的Github

責任編輯:倪明 來源: 簡書
相關推薦

2009-07-06 19:29:37

云計算私有云服務器虛擬化

2022-08-29 15:19:09

CSS煙花動畫

2018-03-07 15:24:41

PythonMySQL

2020-10-28 15:03:25

C+代碼開發

2009-12-17 08:57:28

Windows 7磁盤分區

2024-07-22 11:43:28

LVMPnetLab網絡

2011-06-07 16:03:48

匿名SQL Server

2024-12-02 14:48:30

Docker鏡像文件

2024-09-13 15:20:46

2025-04-08 09:30:00

SeataDocker分布式系統

2017-11-29 11:14:52

離線緩存URL協議緩存

2018-06-11 15:30:12

2013-03-18 16:09:27

JavaEEOpenfire

2017-12-25 11:50:57

LinuxArch Linux

2024-11-01 11:40:11

2009-12-18 16:27:43

Cisco路由器配置

2012-03-22 10:33:33

思杰XenDesktop

2017-09-28 09:40:36

圖像分類準確率

2022-09-30 15:37:19

Web網站服務器

2023-09-05 07:52:43

點贊
收藏

51CTO技術棧公眾號

久久国产一区二区三区| 欧美丰满一区二区免费视频| 久久精品五月婷婷| 国产精品欧美综合| 欧美在线播放| 亚洲精品第一页| 波多野结衣天堂| h视频在线免费观看| 成人免费黄色大片| 国产精品免费在线免费| 欧美精品一区二区蜜桃| 久久av免费看| 欧美大片一区二区三区| 蜜臀av午夜一区二区三区| 免费黄网站在线播放| a亚洲天堂av| 成人精品一区二区三区电影免费 | 91国内精品久久久| 日韩视频一区| 欧美成人免费观看| 色一情一交一乱一区二区三区| 国产精品一区二区三区av| 日韩欧美国产视频| 日韩极品视频在线观看| 国产在线一在线二| 成人精品gif动图一区| 国产日产欧美a一级在线| 日韩欧美激情视频| 午夜精品久久| 久久久精品中文字幕| 亚洲一区二区三区蜜桃| 在线一区二区三区视频| 欧美精品丝袜中出| 另类小说第一页| 综合日韩av| 亚洲一区二区av电影| 亚洲日本欧美在线| 爱爱爱免费视频在线观看| 丁香婷婷综合网| 91精品网站| 国产精品美女一区| 蜜桃久久精品一区二区| 国产成人精品一区二区在线| 欧美一二三区视频| 亚洲电影成人| 国模极品一区二区三区| 精品99在线观看| 亚洲精品国产偷自在线观看| 色一区av在线| 色撸撸在线视频| 日韩国产一区二区| 色视频www在线播放国产成人| aaaaa级少妇高潮大片免费看| 红杏aⅴ成人免费视频| 欧美www视频| 久久久久久久久久影视| 成人爽a毛片免费啪啪红桃视频| 91精品欧美综合在线观看最新| 久久久久国产一区| 日韩免费在线电影| 欧美美女黄视频| 特黄视频免费观看| 精品视频91| 亚洲福利在线观看| 超碰男人的天堂| 秋霞综合在线视频| 亚洲欧美一区二区激情| 手机免费看av| 欧美国产偷国产精品三区| 精品国产自在精品国产浪潮| 婷婷伊人五月天| 欧美视频亚洲视频| 久久人人看视频| 日韩久久中文字幕| 日本欧美在线观看| 亚洲999一在线观看www| www.99视频| 波多野结衣一区二区三区| 免费av一区二区三区| 国产精品一级伦理| 亚洲天堂精品视频| 男人日女人视频网站| 欧美性xxx| 欧美男男青年gay1069videost| 中文字幕一二三| 伦理一区二区三区| 色妞在线综合亚洲欧美| 欧美日韩人妻精品一区二区三区| 亚洲激情另类| 国产精品老女人视频| www.成人在线观看| 久久综合九色综合欧美就去吻| 视频一区视频二区视频三区视频四区国产 | 天天操夜夜操视频| 精品在线一区二区三区| 国产亚洲欧美一区二区| 99re在线视频| 香蕉久久一区二区不卡无毒影院| 99视频在线免费| 日本精品在线观看| 伊人久久久久久久久久久久久| 欧美一区免费观看| 三级欧美在线一区| 国产成人一区二区三区免费看| 飘雪影院手机免费高清版在线观看 | 国产不卡一区二区三区在线观看| 黄色小视频在线观看| 一区二区三区中文在线| 国产自偷自偷免费一区| 日韩免费精品| 日韩在线激情视频| 一级片中文字幕| 国产福利精品导航| 亚洲第一导航| 午夜不卡影院| 日韩精品一区二区三区四区视频 | 久久视频国产| 欧美一区二区三区免费观看| 国产黄色美女视频| 国产精品欧美综合在线| 日韩欧美一区二| 免费一级欧美在线大片| 亚洲视频一区二区| 日韩免费不卡视频| 国产麻豆欧美日韩一区| 亚洲精品9999| 中文字幕在线中文字幕在线中三区| 欧美一级免费观看| 国产7777777| 美日韩精品视频| 久久96国产精品久久99软件| 午夜激情在线| 欧美一级一级性生活免费录像| 三区四区在线观看| 久久精品动漫| 蜜桃传媒视频麻豆第一区免费观看| 在线中文免费视频| 91精品国产综合久久精品图片| 色综合99久久久无码国产精品| 在线观看视频日韩| 国产精品久久久对白| 91最新在线视频| 欧美一级一级性生活免费录像| 成人涩涩小片视频日本| 精品一区二区三区在线观看| 亚洲国产一区在线| 国产一区一一区高清不卡| 亚洲欧美日韩区| 亚洲天堂视频网站| 久久久国产午夜精品| 国内外免费激情视频| 亚洲高清极品| 国产成人综合亚洲| 成人在线视频成人| 欧美午夜寂寞影院| а天堂中文在线资源| 久久99精品国产.久久久久| 中文字幕av导航| 日本成人手机在线| 羞羞色国产精品| 你懂的免费在线观看视频网站| 色偷偷成人一区二区三区91 | 欧美又黄又嫩大片a级| 亚洲欧洲中文字幕| www日韩av| 在线播放高清视频www| 亚洲区免费影片| 黄色一区二区视频| 亚洲男女一区二区三区| 国产精品成人免费一区久久羞羞| 亚洲精品韩国| 欧美日韩免费观看一区| 黄色精品视频网站| 九九久久国产精品| 欧洲毛片在线| 欧美日本国产视频| 国产一级做a爰片在线看免费| www.亚洲色图| www.xxx亚洲| 亚洲天天影视网| 国产欧美亚洲日本| 九七电影院97理论片久久tvb| 欧美成人剧情片在线观看| 欧美一级特黄aaaaaa大片在线观看| 欧美日韩亚洲高清| 国产农村妇女精品一区| 国产白丝网站精品污在线入口| 国产精品一色哟哟| 日韩一区二区在线免费| 高清视频在线观看一区| 亚洲四虎影院| 欧美高清激情视频| 高清毛片在线看| 精品日韩一区二区三区| 久久国产香蕉视频| 亚洲一区二区三区视频在线| 国产美女免费无遮挡| 国产成人av影院| 黑人粗进入欧美aaaaa| 亚洲一本视频| 在线免费观看一区二区三区| 久久超级碰碰| 国产这里只有精品| 天堂在线中文网官网| 欧美乱大交xxxxx| 精品亚洲综合| 日韩成人小视频| 国产成人毛毛毛片| 欧美日韩国产123区| 亚洲精品男人天堂| 亚洲国产wwwccc36天堂| 五月天婷婷丁香网| www久久精品| 亚洲精品成人无码毛片| 蜜臀av一区二区| 日韩毛片在线免费看| 亚洲精品影院在线观看| 日本a级片在线观看| 日韩午夜电影网| 日韩欧美三级一区二区| 亚洲8888| 久久精品人成| 欧美大奶一区二区| 粉嫩高清一区二区三区精品视频| 国产精品无码久久久久| 国产99视频精品免视看7| jizzjizz中国精品麻豆| 欧美高清一级大片| 欧洲在线视频| 美日韩精品免费观看视频| 在线观看美女网站大全免费| 亚洲美腿欧美激情另类| 五月婷婷深深爱| 亚洲国产精品一区二区三区| 丰满肥臀噗嗤啊x99av| 日韩欧美国产午夜精品| 99精品免费观看| 欧美一区二区三区思思人 | 亚洲国产97在线精品一区| www.色视频| 欧美本精品男人aⅴ天堂| 精品人妻午夜一区二区三区四区 | 天堂成人在线观看| 亚洲电影在线看| 手机看片一区二区| 日韩不卡在线观看| 欧美巨乳在线| 亚洲图片在线综合| 92国产在线视频| 日韩在线免费视频| 精品麻豆一区二区三区| 久久网福利资源网站| 黄色免费在线观看| 欧美精品亚州精品| 9765激情中文在线| 91黑丝高跟在线| 伊人久久视频| 国产精品久久久久久久久久三级 | 在线不卡视频| 男人的天堂99| 免费在线一区观看| 激情文学亚洲色图| 99这里只有精品| xxx在线播放| 中文字幕亚洲区| 免费一级黄色大片| 色综合久久中文综合久久牛| 夜夜躁日日躁狠狠久久av| 欧美日韩激情一区二区三区| 国产高潮流白浆喷水视频| 亚洲国产小视频在线观看| 每日更新av在线播放| 色多多国产成人永久免费网站| 国产网友自拍视频导航网站在线观看| 欧美黑人巨大精品一区二区| a国产在线视频| 国产suv精品一区二区三区88区| 久久精品国产福利| 超碰97人人人人人蜜桃| 亚洲调教一区| 午夜在线视频免费观看| 亚洲小说区图片区| 无需播放器的av| 成人在线视频一区| 干b视频在线观看| 一区二区三区精品视频| 探花视频在线观看| 69精品人人人人| 五月婷在线视频| www.日韩欧美| 三级在线观看视频| 91精品在线观| 九九热线有精品视频99| 在线观看污视频| 久久精品成人| 蜜臀视频在线观看| 国产精品毛片高清在线完整版| 久久影院一区二区| 色呦呦国产精品| www.日韩在线观看| 中日韩午夜理伦电影免费 | 91久久久久久久一区二区| 五月天亚洲一区| 日本a在线天堂| 日韩成人av影视| 国产激情视频网站| 亚洲欧洲日本在线| 91黑人精品一区二区三区| 欧美成人伊人久久综合网| 9i精品一二三区| 欧美一级大片在线免费观看| 国产精一区二区| 五月天亚洲综合小说网| 国产精品婷婷| 伊人久久久久久久久| 国产精品高清亚洲| 男人的天堂av网站| 精品视频久久久久久久| 俄罗斯一级**毛片在线播放| 亚洲伊人第一页| 久久免费大视频| 天天爱天天操天天干| 久久天堂av综合合色蜜桃网| 欧美片一区二区| 欧美一区二区视频在线观看| 3d成人动漫在线| 国产精品久久久久久婷婷天堂| 日韩精品丝袜美腿| 日韩欧美精品免费| 国产成人精品免费一区二区| 欧美国产日韩在线观看成人| 欧美日韩国产小视频在线观看| 国产精品ⅴa有声小说| 日本精品久久久久久久| 亚洲免费专区| 欧美 日韩精品| 久久伊人蜜桃av一区二区| 日韩中文字幕在线观看视频| 日韩成人av一区| 天堂av在线| 欧美不卡三区| 日韩电影在线观看一区| 中文字幕在线看高清电影| 色综合天天性综合| 国产精品免费观看| 国产精品久久一| 91视频久久| 九色91porny| 亚洲一区电影777| 天堂中文字幕在线| 欧美在线一区二区视频| 国产日产一区| 五月天av在线播放| 亚洲欧美aⅴ...| 成人久久精品人妻一区二区三区| 欧美激情欧美激情| 秋霞蜜臀av久久电影网免费| 国产男女无遮挡| 欧美高清一级片在线观看| 一级二级三级视频| 欧美成人网在线| 久久久久久毛片免费看| 免费无码av片在线观看| 日本一区二区动态图| 91麻豆成人精品国产| 久久91精品国产| 农村少妇一区二区三区四区五区| 人妻熟女一二三区夜夜爱| 中文字幕免费观看一区| 999av视频| 88国产精品欧美一区二区三区| 国产一区二区欧美| 17c国产在线| 天天av天天翘天天综合网 | 欧美国产丝袜视频| 国产乱码久久久久| 97精品在线视频| 菠萝蜜一区二区| 韩国三级丰满少妇高潮| 手机电影在线观看| 欧美系列亚洲系列| 男人和女人做事情在线视频网站免费观看| 91久热免费在线视频| 亚洲青色在线| 调教驯服丰满美艳麻麻在线视频| 69堂成人精品免费视频| 中文字幕在线高清| 欧美一级免费在线观看| 91免费看`日韩一区二区| 波多野结衣午夜| 欧美精品videos另类日本| 免费精品国产| 在线观看中文av| 欧美中文字幕一区二区三区亚洲| 国产丝袜在线| 日本不卡二区| 成人精品鲁一区一区二区| 在线观看亚洲国产| 奇米成人av国产一区二区三区| 91精品啪在线观看国产18|