成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一步一步教你150行代碼實現(xiàn)簡書滑動返回效果

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

今天帶大家實現(xiàn)簡書的滑動返回效果.

先看看效果圖:

最終效果圖.gif

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

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

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

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

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

1.1 因為看到左邊黃色的View是被遮住的,而另外一個View的寬度是MatchParent的,所以FrameLayout是不錯的選擇.
順便增加一個回調(diào),通知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. //因為我們是從左向右滑動 所以設(shè)置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 這邊可以給個接口回調(diào)出去,就可以做各種炫酷的效果了                      
  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代表用戶想關(guān)閉                 
  31.      if (mLastdx>0){ 
  32.      // 還不到關(guān)閉條件,我們讓view滑動過去,再關(guān)閉                     
  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.         //用戶不想關(guān)閉 ,則滑動到最左邊 
  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. //滑動停止,并且到達了滑動的判斷條件 則回調(diào)關(guān)閉 
  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 剛初始化的時候就會被調(diào)用一次 
  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目錄下,創(chuàng)建兩個動畫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里設(shè)置callback監(jiān)聽,并運用動畫

  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

責任編輯:倪明 來源: 簡書
相關(guān)推薦

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+代碼開發(fā)

2009-12-17 08:57:28

Windows 7磁盤分區(qū)

2024-07-22 11:43:28

LVMPnetLab網(wǎng)絡(luò)

2011-06-07 16:03:48

匿名SQL Server

2024-09-13 15:20:46

2024-12-02 14:48:30

Docker鏡像文件

2025-04-08 09:30:00

SeataDocker分布式系統(tǒng)

2017-11-29 11:14:52

離線緩存URL協(xié)議緩存

2018-06-11 15:30:12

2013-03-18 16:09:27

JavaEEOpenfire

2024-11-01 11:40:11

2017-12-25 11:50:57

LinuxArch Linux

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網(wǎng)站服務器

2023-09-05 07:52:43

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文字幕在线一区二区三区 | 男人的天堂中文字幕 | 产真a观专区 | 成人免费观看视频 | 日本又色又爽又黄的大片 | 欧美一级免费看 | 午夜在线小视频 | 华丽的挑战在线观看 | 国产在线视频一区二区董小宛性色 | 91精品久久久久久久久中文字幕 | 欧美综合在线视频 | 久草99| 久久精品免费观看 | 极品粉嫩国产48尤物在线播放 | 国产夜恋视频在线观看 | 国产毛片毛片 | 国产免费拔擦拔擦8x高清 | 国产一区二区三区不卡av | 国产日韩久久久久69影院 | 欧美日韩国产一区 | 欧美精品在线播放 | 欧美日韩福利视频 | 国产精品久久久久久亚洲调教 | 精久久久 | 狠狠爱免费视频 | www网站在线观看 | av看看 | 精品福利在线视频 | 91色视频在线观看 | 久久久久91| 久久国产精品亚洲 | 精品视频在线播放 | 国产精品一区二区av | 免费观看一区二区三区毛片 | 国产婷婷综合 | 国产欧美精品一区二区三区 | 波多野结衣精品在线 | 欧美中文字幕在线观看 | 成人小视频在线观看 | 91久久国产精品 | 美女天天干 |