Android--實現ViewPager邊界回彈效果(轉)

来源:http://www.cnblogs.com/819158327fan/archive/2017/05/09/6831742.html
-Advertisement-
Play Games

該View轉自 http://blog.csdn.net/Kalwang/article/details/4708721 ,感謝這位大神。 ...


該View轉自   http://blog.csdn.net/Kalwang/article/details/4708721  ,感謝這位大神。

  1 public class BounceBackViewPager extends ViewPager {
  2 
  3     private int currentPosition = 0;
  4     private Rect mRect = new Rect();//用來記錄初始位置
  5     private boolean handleDefault = true;
  6     private float preX = 0f;
  7     private static final float RATIO = 0.5f;//摩擦繫數
  8     private static final float SCROLL_WIDTH = 10f;
  9 
 10     public BounceBackViewPager(Context context) {
 11         super(context);
 12     }
 13 
 14     public BounceBackViewPager(Context context, AttributeSet attrs) {
 15         super(context, attrs);
 16     }
 17 
 18     @Override
 19     public boolean dispatchKeyEvent(KeyEvent event) {
 20         return super.dispatchKeyEvent(event);
 21     }
 22 
 23     @Override
 24     public boolean onInterceptTouchEvent(MotionEvent ev) {
 25         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
 26             preX = ev.getX();//記錄起點
 27             currentPosition = getCurrentItem();
 28         }
 29         return super.onInterceptTouchEvent(ev);
 30     }
 31 
 32     @Override
 33     public boolean onTouchEvent(MotionEvent ev) {
 34         switch (ev.getAction()) {
 35             case MotionEvent.ACTION_UP:
 36                 onTouchActionUp();
 37                 break;
 38             case MotionEvent.ACTION_MOVE:
 39                 if (getAdapter().getCount() == 1) {
 40                     float nowX = ev.getX();
 41                     float offset = nowX - preX;
 42                     preX = nowX;
 43 
 44                     if (offset > SCROLL_WIDTH) {//手指滑動的距離大於設定值
 45                         whetherConditionIsRight(offset);
 46                     } else if (offset < -SCROLL_WIDTH) {
 47                         whetherConditionIsRight(offset);
 48                     } else if (!handleDefault) {//這種情況是已經出現緩衝區域了,手指慢慢恢復的情況
 49                         if (getLeft() + (int) (offset * RATIO) != mRect.left) {
 50                             layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
 51                         }
 52                     }
 53                 } else if ((currentPosition == 0 || currentPosition == getAdapter().getCount() - 1)) {
 54                     float nowX = ev.getX();
 55                     float offset = nowX - preX;
 56                     preX = nowX;
 57 
 58                     if (currentPosition == 0) {
 59                         if (offset > SCROLL_WIDTH) {//手指滑動的距離大於設定值
 60                             whetherConditionIsRight(offset);
 61                         } else if (!handleDefault) {//這種情況是已經出現緩衝區域了,手指慢慢恢復的情況
 62                             if (getLeft() + (int) (offset * RATIO) >= mRect.left) {
 63                                 layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
 64                             }
 65                         }
 66                     } else {
 67                         if (offset < -SCROLL_WIDTH) {
 68                             whetherConditionIsRight(offset);
 69                         } else if (!handleDefault) {
 70                             if (getRight() + (int) (offset * RATIO) <= mRect.right) {
 71                                 layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
 72                             }
 73                         }
 74                     }
 75                 } else {
 76                     handleDefault = true;
 77                 }
 78 
 79                 if (!handleDefault) {
 80                     return true;
 81                 }
 82                 break;
 83 
 84             default:
 85                 break;
 86         }
 87         return super.onTouchEvent(ev);
 88     }
 89 
 90     private void whetherConditionIsRight(float offset) {
 91         if (mRect.isEmpty()) {
 92             mRect.set(getLeft(), getTop(), getRight(), getBottom());
 93         }
 94         handleDefault = false;
 95         layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
 96     }
 97 
 98     private void onTouchActionUp() {
 99         if (!mRect.isEmpty()) {
100             recoveryPosition();
101         }
102     }
103 
104     private void recoveryPosition() {
105         TranslateAnimation ta = new TranslateAnimation(getLeft(), mRect.left, 0, 0);
106         ta.setDuration(300);
107         startAnimation(ta);
108         layout(mRect.left, mRect.top, mRect.right, mRect.bottom);
109         mRect.setEmpty();
110         handleDefault = true;
111     }
112 
113 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HTML5進行app開發具有開發快,跨平臺等優點,但是當客戶需要訪問照相機或者調用攝像頭等硬體的時候,H5就會有限制,必須要調用原生方法進行設備訪問。下麵簡要介紹JS和原生方法互相調用的方法: 1 在webview的進行配置,首先支持JS和JS介面訪問: 這裡JSHook是一個Java類: 這裡只是 ...
  • 主要的有: 字體相關:line-height, font-family, font-size, font-style, font-variant, font-weight, font 文本相關: letter-spacing, text-align, text-indent, text-transf ...
  • 開本系列,談談一些有趣的 CSS 題目,題目類型天馬行空,想到什麼說什麼,不僅為了拓寬一下解決問題的思路,更涉及一些容易忽視的 CSS 細節。 解題不考慮相容性,題目天馬行空,想到什麼說什麼,如果解題中有你感覺到生僻的 CSS 屬性,趕緊去補習一下吧。 不斷更新,不斷更新,不斷更新,重要的事情說三遍 ...
  • $("#cbutton1").bind("click",{"id":"111","name":"aaa"},getData); 這一句給 cbutton1 指定了 click 事件的綁定函數為 getData,並且向該函數傳遞了JSON格式參數 {"id":"111", "name":"aaa"}. ...
  • var val = $("select[name='type_irb'] option:selected").val(); ...
  • 轉載請註明——博客園igoslly:http://www.cnblogs.com/igoslly/p/6833544.html 轉載請註明——博客園igoslly:http://www.cnblogs.com/igoslly/p/6833544.html 在實際方法調用中,程式按順序逐句執行,直到“ ...
  • 要點:就是緩存輸入的內容到 本地 下麵就是實現保存 搜索內容到本地 和 清空本地歷史的 方法 activity 下拉彈出layout佈局 ...
  • 我們開發中常用到圖片上傳,比如頭像上傳之類的,還有類似發佈空間說說時發佈多張圖片等等,我在這裡通過借鑒網路資源,並依賴於七牛雲存儲做了一個圖片上傳的小結。 我首先封裝了一個圖片上傳的工具類,繼承自nsobject,命名為QiniuTool;再多圖上傳時,還需要單張圖片的上傳結果處理,因此,我在這裡有 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...