天天看點

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

Android 程式設計下如何調整 SwipeRefreshLayout 的下拉重新整理距離

專注移動網際網路産品設計研發 分享最新的移動網際網路産品和技術

繼續閱讀