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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...