android组件的下拉回弹,转:Android可以下拉/上拉回弹的ListView原理

可是为什么直接用ListView看不到下拉效果呢?

其实这是因为版权的问题,这个下拉的效果是苹果先出的,大家也都知道苹果跟谷歌的版权纠纷,所以谷歌虽然也能做到下拉,但没有明确给出来,只是做了一个动画效果,就是拉到顶部或底部后继续拉会有个亮亮的光出现(注意是2.3之后的系统才有)。

接下来看看谷歌给我们提供了什么。

首先是View类内的overScrollBy方法。

protected boolean overScrollBy(int deltaX, int deltaY,

int scrollX, int scrollY,

int scrollRangeX, int scrollRangeY,

int maxOverScrollX, int maxOverScrollY,

boolean isTouchEvent) {

final int overScrollMode = mOverScrollMode;

final boolean canScrollHorizontal =

computeHorizontalScrollRange() > computeHorizontalScrollExtent();

final boolean canScrollVertical =

computeVerticalScrollRange() > computeVerticalScrollExtent();

final boolean overScrollHorizontal = overScrollMode == OVER_SCROLL_ALWAYS ||

(overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollHorizontal);

final boolean overScrollVertical = overScrollMode == OVER_SCROLL_ALWAYS ||

(overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollVertical);

int newScrollX = scrollX + deltaX;

if (!overScrollHorizontal) {

maxOverScrollX = 0;

}

int newScrollY = scrollY + deltaY;

if (!overScrollVertical) {

maxOverScrollY = 0;

}

// Clamp values if at the limits and record

final int left = -maxOverScrollX;

final int right = maxOverScrollX + scrollRangeX;

final int top = -maxOverScrollY;

final int bottom = maxOverScrollY + scrollRangeY;

boolean clampedX = false;

if (newScrollX > right) {

newScrollX = right;

clampedX = true;

} else if (newScrollX < left) {

newScrollX = left;

clampedX = true;

}

boolean clampedY = false;

if (newScrollY > bottom) {

newScrollY = bottom;

clampedY = true;

} else if (newScrollY < top) {

newScrollY = top;

clampedY = true;

}

onOverScrolled(newScrollX, newScrollY, clampedX, clampedY);

return clampedX || clampedY;

}

其实View的这个方法已经帮我们实现了下拉、上拉,甚至左拉右拉都实现了!!

可是为什么ListView继承了View却没有实现下拉呢?

我们接下来到ListView中的overScrollBy看一下。

protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,

int scrollY, int scrollRangeX, int scrollRangeY,

int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {

Log.d("deltaX=" + deltaX + ";deltaY=" + deltaY + ";scrollX=" + scrollX

+ ";scrollY=" + scrollY + ";scrollRangeX=" + scrollRangeX

+ ";scrollRangeY=" + scrollRangeY + ";maxOverScrollX="

+ maxOverScrollX + ";maxOverScrollY=" + maxOverScrollY);

return false;

}

据我打印的结果,发现后面的maxOverScrollX、maxOverScrollY永远是0!!

原来如此,谷歌也真是机(jiao)智(hua),代码明明实现了,就是不明确摆出来,这样苹果也无话可说了。

那么知道了原因,要实现也下拉也简单,自定义一个类继承ListView,重写overScrollBy方法即可。

protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,

int scrollY, int scrollRangeX, int scrollRangeY,

int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {

return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,

scrollRangeX, scrollRangeY, maxOverScrollX,

500, isTouchEvent);

}

上面的代码只是给maxOverScrollY硬性的给了个500的值,然后就可以下拉上拉了,很简单吧~~

PS:亲测有用,这种方法做出来的下拉ListView效果一般,也没有下拉刷新功能,如果要用到项目中的话,还是去找开源的下拉列表吧~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值