zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    洛谷 1339 最短路
    洛谷 1330 封锁阳光大学 图论 二分图染色
    洛谷 1262 间谍网络 Tarjan 图论
    洛谷 1373 dp 小a和uim之大逃离 良心题解
    洛谷 1972 莫队
    洛谷 2158 数论 打表 欧拉函数
    洛谷 1414 数论 分解因数 水题
    蒟蒻的省选复习(不如说是noip普及组复习)————连载中
    关于筛法
    关于整数划分的几类问题
  • 原文地址:https://www.cnblogs.com/sunzn/p/3795009.html
Copyright © 2011-2022 走看看