Android 編程下如何調整 SwipeRefreshLayout 的下拉刷新距離


SwipeRefreshLayout 的下拉刷新距離比較短,並且也沒有提供設置下拉距離的 API,但是看 SwipeRefreshLayout 的源碼,會發現有一個內部變量 mDistanceToTriggerSync,這個變量決定了觸發刷新的下拉距離。下面的代碼展示了源碼中是如何給這個變量賦值的:

final DisplayMetrics metrics = getResources().getDisplayMetrics();
mDistanceToTriggerSync = (int) Math.min(((View) getParent()).getHeight() * MAX_SWIPE_DISTANCE_FACTOR, REFRESH_TRIGGER_DISTANCE * metrics.density);

上面使用了父視圖高度和一些常數計算來決定觸發距離。MAX_SWIPE_DISTANCE_FACTOR (0.6) 和 REFRESH_TRIGGER_DISTANCE (120) 是私有常量,這些都是我們無法直接修改的。但是,我們可以通過反射的方法來重新計算 mDistanceToTriggerSync 的數值,代碼如下:

ViewTreeObserver vto = swipeLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    public void onGlobalLayout() {

        final DisplayMetrics metrics = getResources().getDisplayMetrics();
        Float mDistanceToTriggerSync = Math.min(((View) swipeLayout.getParent()).getHeight() * 0.6f, 500 * metrics.density);

        try {
            Field field = SwipeRefreshLayout.class.getDeclaredField("mDistanceToTriggerSync");
            field.setAccessible(true);
            field.setFloat(swipeLayout, mDistanceToTriggerSync);
        } catch (Exception e) {
            e.printStackTrace();
        }

        ViewTreeObserver obs = swipeLayout.getViewTreeObserver();
        obs.removeOnGlobalLayoutListener(this);
    }
});

對比下代碼,只是將 REFRESH_TRIGGER_DISTANCE (120) 的數值改為了 500,就會發現下拉刷新的距離明顯增大了,另附代碼下載:SwipeRefreshLayout.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM