日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android双击回到顶部,Android之双击回到顶部

發(fā)布時間:2024/8/1 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android双击回到顶部,Android之双击回到顶部 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

雙擊回到頂部在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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。