android双击回到顶部,Android之双击回到顶部
雙擊回到頂部在Android應(yīng)用中用的很多,眾所周知的微信消息列表,朋友圈都提供這樣的效果,下面我將自己自項目中的實踐記錄下來,分享給大家
首先:獲取雙擊事件
網(wǎng)上有很多的獲取雙擊事件的方法,這里我講它稍加封裝,整個工程也可以使用
首先我們來定義雙擊事件的接口
packagecom.....activity.info;
importandroid.view.View;
/**
*?@author?wfy
*?單擊雙擊事件接口
*/
publicinterfaceOnDoubleClickListener?{
publicvoidOnSingleClick(View?v);
publicvoidOnDoubleClick(View?v);
}
下來定義一個DoubleClick類,它提供一個靜態(tài)方法給一個view注冊雙擊事件,注釋我已經(jīng)寫的及其詳細了,不再多說
packagecom.....activity.info;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.view.View;
/**
*?@author?wfy
*?消息列表+好友動態(tài)的雙擊回到頂部
*/
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;//與執(zhí)行雙擊事件
newThread(){
publicvoidrun()?{
try{
Thread.sleep(DOUBLE_CLICK_TIME);
//此時線程沉睡?而flag被修改為false??在DOUBLE_CLICK_TIME內(nèi)點擊則?進入else
}?catch(InterruptedException?e)?{
e.printStackTrace();
}????//等待雙擊時間,否則執(zhí)行單擊事件
if(!flag){
//睡醒了看一看flag被人動過沒,沒有人動,則認作單擊事件
//因此不建議用此方法執(zhí)行單擊事件?因為會等待睡醒,有點擊延遲的存在
//沒有人動,自己把它改成true,以接受下次點擊
flag?=?true;
Message?msg?=?handler.obtainMessage();
msg.obj?=?v;
//發(fā)個消息,讓執(zhí)行單擊
handler.sendMessage(msg);
}
}
}.start();
}else{
flag?=?true;
listener.OnDoubleClick(v);????//執(zhí)行雙擊
}
}
});
}
}
其次:給你要雙擊的組件注冊雙擊事件,此處用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);
}
});
最后:細心的會發(fā)現(xiàn),在上面的OnDoubleClick方法中我啟動了一個異步任務(wù),下面貼出代碼,這是一個內(nèi)部類
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還沒回去,則直接去頂部
//目的:要產(chǎn)生滾動的假象,但也不能耗時過多
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?
對于第一個問題和第二個問題:我在異步任務(wù)里已經(jīng)做了判斷,先一個一個滾,滾到第十五個(也就是異步任務(wù)里的time)還沒回去則直接回頂部,這樣既有了滾動的動作,也不會因為有好多item讓用戶等待太久
對于第三個問題:首先在當前的activity里定義一個靜態(tài)的變量,用來持續(xù)追蹤當前可見的第一個item,然后通過監(jiān)聽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,理解了就是自己的,方法很重要。
總結(jié)
以上是生活随笔為你收集整理的android双击回到顶部,Android之双击回到顶部的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP+ACCESS校园网物品交易平台
- 下一篇: Android获取百度网盘路径,百度网盘