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之双击回到顶部相关推荐
- android 点击返回顶部,Android scrollToTop实现点击回到顶部(兼容PullTorefreshScrollview)...
前言 最近因为项目组需求,特研究了一下"回到顶部"效果,即:页面里有scrollview,内容很多,当滑动到页面下面或者更深时,需要回到顶部,即可点击出现的按钮,省得回滑N久.我没 ...
- Android Native APP开发笔记:双击返回键退出应用单击返回键返回桌面
文章目录 目的 基础说明 双击返回键退出应用 单击返回键回到桌面 总结 目的 双击返回键退出应用 很早之前就是Android中非常常见的一种功能,而目前好多安卓应用为了应用常驻都改为使用 单击返回键返 ...
- android 通知打开app,Android打开通知栏并回到主页的几种方式
用PendingIntent.getActivity创建通知栏 在MainActivity中增加点击事件,用来启动NotifyService和延迟2秒销毁MainActivity,如下面代码所示 In ...
- Android 页面跳转时发生双击导致app闪退的解决方案
在页面跳转时双击双击,查阅了各种资料 尝试一:从双击事件出发,避免双击事件 例如重写onClick事件 public abstract class NoDoubleClickListener impl ...
- android 自定义顶部,Android自定义实现顶部粘性下拉刷新效果
本文实例为大家分享了Android实现顶部粘性下拉刷新效果的具体代码,供大家参考,具体内容如下 activity_view_mv代码 xmlns:android="http://schema ...
- android 仿搜索动画,Android仿京东顶部搜索框滑动伸缩动画效果
最近使用京东发现,京东顶部的搜索框有一个新的伸缩效果,根据用户的手势滑动,伸缩搜索框.觉得效果还不错,就看了下其他的应用有没有这种伸缩的效果,发现安居客也使用了类似的一种效果,然后就想着实现这样的一种 ...
- Android ActionBar的Overlay模式如何不遮盖顶部内容的问题
关于actionbar的overlay模式请参考 如何让android的actionbar浮动且透明 一文.这篇文章讲的是如何在这种模式下让actionbar不遮住顶部的内容. 这 一般是这样的场景, ...
- Android底部菜单栏、Android沉浸式状态栏(顶部状态栏修改颜色)、自定义标题栏
0.简介: 没有使用TabHost切换,而是变成FragmentActivity替换Fragment:沉浸式引用的git上面的jar包. 先看图片 1.底部导航栏 核心代码 <span styl ...
- android 悬停浮动框,Android滑动到顶部悬停
无图说卵,先上图 jianshu-top.gif 查阅资料后,发现网上大部分都是用这种方法实现的: 多写一个和需要悬浮的部分一模一样的layout,先把浮动区域的可见性设置为gone.当浮动区域滑动到 ...
- 【Android开发】使用Bottom Navigation Activity去掉顶部栏(标题栏)
[Android开发]使用Bottom Navigation Activity去掉顶部栏(标题栏) 在使用android自带的模板Botton Navigation Activity后,页面顶部 ...
最新文章
- k3应付系统初始化应付票据_在家工作时应付无尽干扰的真实感觉
- 2019年雁栖湖会议重大科学问题面向全球发布
- 用python做数据分析,安装包一次到位
- python 桌面应用 启动缓慢_如何加快Python 应用的启动时间
- Python+BI爬取3000条车厘子数据,发现了这些秘密
- Windbg命令学习9,经典死锁(!cs和~~[TID])
- QT绘图底层是如何适配各种操作系统的
- CREO:CREO软件之零件【模型】扫描之扫描、螺旋扫描、可变剖面扫描、扫描混合、混合、边界混合、可变剖面扫描的简介及其使用方法(图文教程)之详细攻略
- python混合线性模型_如何在Python statsmodels中有多组线性混合效应模型?
- 中心极限定理 - 正态分布
- 2020年7月杭州更换异地驾照
- UE4 使用自发光材质作为烘焙光源
- 【送书活动第二话】:共10本技术书籍送! 送!! 送!!!
- 示波器X1探头和X10探头
- 产品版本、软件版本、文档版本定义
- scp免密码传送文件
- 企业微信服务商扫码登录
- AI模型看看视频,就学会了玩《我的世界》:砍树、造箱子、制作石镐样样不差...
- RabbitMQ几种工作模式,实现延时消息的两种案例
- Vue 开发 Lov 组件