關於ListView的彈性滑動

2021-08-25 20:45:21 字數 2822 閱讀 4585

最近專案中用到了彈性滑動,但是這個彈性滑動只有在2.3之後才有了功能函式,在2.2以及之前的版本中,只有自己去實現了。

查了一下網上的資源,貌似沒有提供出來乙個具體的方式來實現。看到乙個牛人寫的乙個軟體中實現了彈性滑動,查了查原始碼,然後看了看listview的原始碼,然後自己搞了一下,實現了彈性滑動。

基本思路就是得到出當前的可顯示的item的位置,然後判斷出否是越界,這裡的越界就是是否有過度的滑動。如果有的話,就利用scrollto()這個方法,先把控制項滑動到手勢觸控事件的位置,當觸控事件結束時,滑動到螢幕頂端,或者末端。

首先是自定義乙個類,繼承listview,然後在其中加入手勢的事件模型。在處理touch事件時將事件交給手勢listener來處理。並且返回父類的處理結果。

public class bouncylistview extends listview 

public bouncylistview(context context, attributeset attrs)

public bouncylistview(context context, attributeset attrs, int defstyle)

gesturedetector mgesturedetector = new gesturedetector(context,

new gesturedetector.ongesturelistener()

@override

public void onshowpress(motionevent e)

@override

public boolean onscroll(motionevent e1, motionevent e2,

float distancex, float distancey)

view firstview = getchildat(firstpos);

if (!outbound)

firstout = (int) e2.getrawy();

if (firstview != null

&& (outbound || (firstpos == 0

&& firstview.gettop() == 0 && distancey < 0)))

//outbound bottom

return false;

}@override

public void onlongpress(motionevent e)

@override

public boolean onfling(motionevent e1, motionevent e2,

float velocityx, float velocityy)

@override

public boolean ondown(motionevent e)

});@override

public boolean dispatchtouchevent(motionevent event)

if (!mgesturedetector.ontouchevent(event)) else

return super.dispatchtouchevent(event);

}}

實現過度滑動,item跟隨手勢的**是這一段:

int firstpos = getfirstvisibleposition();

int lastpos = getlastvisibleposition();

int itemcount = getcount();

if (outbound && firstpos != 0

&& lastpos != (itemcount - 1))

view firstview = getchildat(firstpos);

if (!outbound)

firstout = (int) e2.getrawy();

if (firstview != null && (outbound ||

(firstpos == 0 && firstview.gettop() == 0 && distancey < 0)))

scrollto(0, distance/2);使得item只是過度滑動你所滑動距離的一半,這樣更美觀。

而實現彈性滑動的基本思路就是滑動回去加個時間。

**如下:

rect rect = new rect();

getlocalvisiblerect(rect);

translateanimation am = new translateanimation( 0, 0, -rect.top, 0);

am.setduration(300);

startanimation(am);

scrollto(0, 0);

這個**是從專案中摘出的。只有上面的彈性滑動,下邊部分其實一樣。

顯示效果如下

[img]

看別人的**往往會給自己帶來一些思路,然後自己去研究,以上的思路可以應用與gridview,我這裡實現gridview的彈性滑動是沒有問題的。我目前遇到的乙個問題就是scrollview的彈性滑動問題。看了很長時間的scrollview的原始碼,但是沒有太好的思路,主要是在顯示部分的座標拿不到,不像listview裡可以通過getfirstvisibleposition()這樣乙個方法來拿到item的位置,繼而拿到item,scrollview中只有乙個子控制項。他的滑動實現貌似跟listview,gridview這些採用adapter的不一樣。在研究中,哪位兄台如果知道其中原來,還請告知一聲。

具有彈性的ListView

android預設的listview在滾動到頂端或者底端的時候,並沒有很好的提示。android 5.x中,google為這樣的行為只i彈夾了乙個半月型的陰陽效果。自己修改listview也可以實現listview像ios那樣的彈性效果,比如增加headerview或者使用scrollview。這裡...

listView橫向滑動

listview橫向滑動很少使用,但是有時候也會用到,我也是在網上看到了大神自定義了乙個listview可以橫向滑動。試了下很不錯,希望大家能用的上。自定義 如下 public class horizontallistview extends adapterview private synchron...

ListView彈性下拉效果

效果圖 用什麼實現的?通過屬性動畫和事件分發機制實現的。只分析實現原理和關鍵 1.自定義乙個view繼承listview public class pullseparatelistview extends listview 2.複寫listview的dispatchtouchevent方法 核心 o...