android双击回到顶部,Android之双击回到顶部
雙擊回到頂部在Android應用中用的很多,眾所周知的微信消息列表,朋友圈都提供這樣的效果,下面我將自己自項目中的實踐記錄下來,分享給大家
首先:獲取雙擊事件
網上有很多的獲取雙擊事件的方法,這里我講它稍加封裝,整個工程也可以使用
首先我們來定義雙擊事件的接口
packagecom.....activity.info;
importandroid.view.View;
/**
*?@author?wfy
*?單擊雙擊事件接口
*/
publicinterfaceOnDoubleClickListener?{
publicvoidOnSingleClick(View?v);
publicvoidOnDoubleClick(View?v);
}
下來定義一個DoubleClick類,它提供一個靜態方法給一個view注冊雙擊事件,注釋我已經寫的及其詳細了,不再多說
packagecom.....activity.info;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.view.View;
/**
*?@author?wfy
*?消息列表+好友動態的雙擊回到頂部
*/
publicclassDoubleClick?{
publicstaticvoidregisterDoubleClickListener(View?view,finalOnDoubleClickListener?listener){
if(listener==null)return;
view.setOnClickListener(newView.OnClickListener()?{
//雙擊間隔時間350毫秒
privatestaticfinalintDOUBLE_CLICK_TIME?=350;
privatebooleanflag?=true;
privateHandler?handler?=newHandler(){
@Override
publicvoidhandleMessage(Message?msg)?{
listener.OnSingleClick((View)msg.obj);
}
};
//等待雙擊
publicvoidonClick(finalView?v)?{
if(flag){
flag?=?false;//與執行雙擊事件
newThread(){
publicvoidrun()?{
try{
Thread.sleep(DOUBLE_CLICK_TIME);
//此時線程沉睡?而flag被修改為false??在DOUBLE_CLICK_TIME內點擊則?進入else
}?catch(InterruptedException?e)?{
e.printStackTrace();
}????//等待雙擊時間,否則執行單擊事件
if(!flag){
//睡醒了看一看flag被人動過沒,沒有人動,則認作單擊事件
//因此不建議用此方法執行單擊事件?因為會等待睡醒,有點擊延遲的存在
//沒有人動,自己把它改成true,以接受下次點擊
flag?=?true;
Message?msg?=?handler.obtainMessage();
msg.obj?=?v;
//發個消息,讓執行單擊
handler.sendMessage(msg);
}
}
}.start();
}else{
flag?=?true;
listener.OnDoubleClick(v);????//執行雙擊
}
}
});
}
}
其次:給你要雙擊的組件注冊雙擊事件,此處用button演示一下
Button?button=newButton(this);
DoubleClick.registerDoubleClickListener(button,?newOnDoubleClickListener()?{
@Override
publicvoidOnSingleClick(View?v)?{
//?TODO?Auto-generated?method?stub
}
@Override
publicvoidOnDoubleClick(View?v)?{
//?TODO?Auto-generated?method?stub
GoTopTask?task=newGoTopTask();
task.execute(firstposition);
}
});
最后:細心的會發現,在上面的OnDoubleClick方法中我啟動了一個異步任務,下面貼出代碼,這是一個內部類
privateclassGoTopTaskextendsAsyncTask{
@Override
protectedvoidonPreExecute()?{
//回到頂部時間置0??此處的時間不是俠義上的時間
time=0;
super.onPreExecute();
}
@Override
protectedString?doInBackground(Integer...?params)?{
//?TODO?Auto-generated?method?stub
for(inti=params[0];i>=0;i--){
publishProgress(i);
//返回頂部時間耗費15個item還沒回去,則直接去頂部
//目的:要產生滾動的假象,但也不能耗時過多
time++;
if(time>15){
publishProgress(0);
returnnull;
}
try{
Thread.sleep(5);
}?catch(InterruptedException?e)?{
e.printStackTrace();
}
}
returnnull;
}
@Override
protectedvoidonProgressUpdate(Integer...?values)?{
lv.setSelection(values[0]);
super.onProgressUpdate(values);
}
@Override
protectedvoidonPostExecute(String?result)?{
super.onPostExecute(result);
}
@Override
protectedvoidonCancelled()?{
//?TODO?Auto-generated?method?stub
super.onCancelled();
}
}
寫到這里相信大家都明白思路了,就是用lv.setSelection(0)讓list回到頂部,可是這里存在三個問題:1、直接閃回到頂部用戶體驗不是很好,很突兀?? 2、如1所說,那一個個往會顯示,可是你有1000個item,我看到好幾百個時,往回一個一個滾嗎?相信沒有人有那個耐心等 ? 3、不能每次都從最后往會滾,從當前可見的第一個item滾,那么如何獲取當前可見的第一個item?
對于第一個問題和第二個問題:我在異步任務里已經做了判斷,先一個一個滾,滾到第十五個(也就是異步任務里的time)還沒回去則直接回頂部,這樣既有了滾動的動作,也不會因為有好多item讓用戶等待太久
對于第三個問題:首先在當前的activity里定義一個靜態的變量,用來持續追蹤當前可見的第一個item,然后通過監聽lv滾動事件實時修改firstposition,這里貼出代碼
lv.setOnScrollListener(newOnScrollListener()?{
@Override
publicvoidonScrollStateChanged(AbsListView?view,intscrollState)?{
//?TODO?Auto-generated?method?stub
}
@Override
publicvoidonScroll(AbsListView?view,intfirstVisibleItem,
intvisibleItemCount,inttotalItemCount)?{
//?TODO?Auto-generated?method?stub
firstposition=firstVisibleItem;
}
});
好了,到這里就大功告成了,是不是很簡單,之所以寫的很詳細,是想讓看的人理解,而不是僅僅copy我的code,理解了就是自己的,方法很重要。
總結
以上是生活随笔為你收集整理的android双击回到顶部,Android之双击回到顶部的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP+ACCESS校园网物品交易平台
- 下一篇: 页面回到顶部的几种方法