最近專案中用到了彈性滑動,但是這個彈性滑動只有在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...