轉載請注明出處http://blog.csdn.net/pkxiuluo01/article/details/17415427
首先給個連結:如何2.3之後如何添加listview 的overscroll(邊界回彈)效果,http://blog.csdn.net/androiddevelop/article/details/8155350
正文:
android 2.3 listview引入 overscroll 的相關api 之後 添加了一個自帶的效果 也就是 當滑動到邊界的時候,如果再滑動,就會有一個邊界就會有一個發光效果
如何去掉這個效果呢?以下有兩種情況需要考慮
一.如果不需要使用 overscroll的那種 回彈效果
解決方案:
隻需要在布局的 xml中 添加android:fadingedge="none" 或者在代碼中添加setoverscrollmode(over_scroll_never);
over_scroll_never的含義是 在任何情況下都不可以overscroll
void android.widget.abslistview.setoverscrollmode(int
mode)
set the over-scroll mode for this view. valid over-scroll modes are <code>over_scroll_always</code> (default),<code>over_scroll_if_content_scrolls</code> (allow
over-scrolling only if the view content is larger than the container), or<code>over_scroll_never</code>.
setting the over-scroll mode of a view will have an effect only if the view is capable of scrolling.
overrides: setoverscrollmode(...) inview
<dl>
<dt>parameters:</dt>
<dd>
mode the new over-scroll mode for this view.</dd>
</dl>
abslistview.java
[java] view
plaincopy
@override
public void setoverscrollmode(int mode) {
if (mode != over_scroll_never) {
if (medgeglowtop == null) {
context context = getcontext();
medgeglowtop = new edgeeffect(context);
medgeglowbottom = new edgeeffect(context);
}
} else {
medgeglowtop = null;
medgeglowbottom = null;
}
super.setoverscrollmode(mode);
}
二.需要使用api提供的 overscroll效果
解決方案:由于需要使用overscroll效果就不能簡單的通過設定 scrollmode了 這個時候需要用java 的反射來解決
通過網上搜尋的解決方案是 把medgeglowtop 和medgeglowbottom設為null 但是通過運作後發現有會抛出nullpoiontexception (測試的系統版本為4.1.1手機為小米2)
不過進一步翻看api源碼 我發現隻要把medgeglowtop 和medgeglowbottom的medge和mglow設為透明就行了代碼如下
class<?> c = (class<?>) class.forname(abslistview.class.getname());
field egtfield = c.getdeclaredfield("medgeglowtop");
field egbbottom = c.getdeclaredfield("medgeglowbottom");
egtfield.setaccessible(true);
egbbottom.setaccessible(true);
object egtobject = egtfield.get(this); //this 指的是listivew執行個體
object egbobject = egbbottom.get(this);
//egtobject.getclass() 實際上是一個 edgeeffect 其中有兩個重要屬性 mglow medge 并且這兩個屬性都是drawable類型
class<?> cc = (class<?>) class.forname(egtobject.getclass().getname());
field mglow = cc.getdeclaredfield("mglow");
mglow.setaccessible(true);
mglow.set(egtobject,new colordrawable(color.transparent));
mglow.set(egbobject,new colordrawable(color.transparent));
field medge = cc.getdeclaredfield("medge");
medge.setaccessible(true);
medge.set(egtobject,new colordrawable(color.transparent));
medge.set(egbobject,new colordrawable(color.transparent));
注:
1.别忘了try catch 可能抛出的異常
2.為了在低版本不出bug 最好加個版本判斷 大于api level 9的 可以使用該方法