zoukankan      html  css  js  c++  java
  • 如何使ListView具有像ios一样的弹性

    ListView 是我们在开发过程中经常使用的控件之一,通常情况下,当我们没有对它进行自定义或者给添加headerview 或者footerView的时候,他都没有一个很好的反馈效果,但是相比较而言,Ios的列表都具有弹性,也就是它的bounce功能,它容许用户将内容拖过界,甩手后再弹回来。但是android想要做到这些就需要自己重写listView来实现这样的一个效果,使用scrollView嵌套啊,或者添加headerView.其实有种很简单的方法,我们可以查看View的相关源码,其中有这样的一个方法

    1.View类里面的overScrollBy方法。

     1 protected boolean overScrollBy(int deltaX, int deltaY,
     2             int scrollX, int scrollY,
     3             int scrollRangeX, int scrollRangeY,
     4             int maxOverScrollX, int maxOverScrollY,
     5             boolean isTouchEvent) {
     6         final int overScrollMode = mOverScrollMode;
     7         final boolean canScrollHorizontal =
     8                 computeHorizontalScrollRange() > computeHorizontalScrollExtent();
     9         final boolean canScrollVertical =
    10                 computeVerticalScrollRange() > computeVerticalScrollExtent();
    11         final boolean overScrollHorizontal = overScrollMode == OVER_SCROLL_ALWAYS ||
    12                 (overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollHorizontal);
    13         final boolean overScrollVertical = overScrollMode == OVER_SCROLL_ALWAYS ||
    14                 (overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollVertical);
    15 
    16         int newScrollX = scrollX + deltaX;
    17         if (!overScrollHorizontal) {
    18             maxOverScrollX = 0;
    19         }
    20 
    21         int newScrollY = scrollY + deltaY;
    22         if (!overScrollVertical) {
    23             maxOverScrollY = 0;
    24         }
    25 
    26         // Clamp values if at the limits and record
    27         final int left = -maxOverScrollX;
    28         final int right = maxOverScrollX + scrollRangeX;
    29         final int top = -maxOverScrollY;
    30         final int bottom = maxOverScrollY + scrollRangeY;
    31 
    32         boolean clampedX = false;
    33         if (newScrollX > right) {
    34             newScrollX = right;
    35             clampedX = true;
    36         } else if (newScrollX < left) {
    37             newScrollX = left;
    38             clampedX = true;
    39         }
    40 
    41         boolean clampedY = false;
    42         if (newScrollY > bottom) {
    43             newScrollY = bottom;
    44             clampedY = true;
    45         } else if (newScrollY < top) {
    46             newScrollY = top;
    47             clampedY = true;
    48         }
    49 
    50         onOverScrolled(newScrollX, newScrollY, clampedX, clampedY);
    51 
    52         return clampedX || clampedY;
    53     }

    2.我们在看一下ListView 里面的overScrollBy方法

     1 protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
     2 
     3  int scrollY, int scrollRangeX, int scrollRangeY,
     4 
     5  int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
     6 
     7  L.d("deltaX=" + deltaX + ";deltaY=" + deltaY + ";scrollX=" + scrollX
     8 
     9  + ";scrollY=" + scrollY + ";scrollRangeX=" + scrollRangeX
    10 
    11  + ";scrollRangeY=" + scrollRangeY + ";maxOverScrollX="
    12 
    13  + maxOverScrollX + ";maxOverScrollY=" + maxOverScrollY);
    14 
    15  return false;
    16 
    17  } 

    这里maxOverScrollX、maxOverScrollY默认值是0,对于maxOverScrollY这个参数,注释是这样说明的Number of pixels to overscroll by in either direction along the Y axis.也就是说只要我们改变这个参数的值就可以了,

    我们可以通过屏幕的density来计算具体的值,这样可以满足不同手机分辨率的需求,

    1  private static final int DISTANCE = 200;
    2  private int mMaxOverDistance;
    3  DisplayMetricsmetrics=getContext().getResources().getDisplayMetrics();
    4         float density= metrics.density;
    5         mMaxOverDistance=(int)(density*DISTANCE);

    在在需要的listview里面重写overScrollBy方法

    1  @Override
    2     protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
    3         return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
    4                 scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverDistance,
    5                 isTouchEvent);
    6 
    7 
    8 
    9     }

    就这简单,其实他就是一个相当于动画的效果,没有下拉刷新上啦加载的效果,要想实现,还是需要我们自己定义滴,或者使用开源的三方框架!!

  • 相关阅读:
    idea添加junit4(单元测试)
    hadoop学习之路(2)
    hadoop学习之路(1)
    MySQL主从配置(两台Linux之间)
    ZooKeeper概念详解,最全整理
    Linux小知识点
    Java Freemarker 实现导出 Word文档
    Oracle学习笔记十六:常用函数
    Oracle学习笔记十五:基本数据类型
    Oracle学习笔记十四:备份与恢复案例
  • 原文地址:https://www.cnblogs.com/ai394495243/p/5145279.html
Copyright © 2011-2022 走看看