总结今天实现Topbar随屏幕滚动逐渐出现和淡出问题
2016-08-11 01:35
387 查看
实现场景:
在开发过程中,需要实现初始界面Topbar不显示,当屏幕向下滚动时,Topbar逐步淡现,当屏幕向上滚动时,Topbar逐步淡出和手指向上向下抛动时Topbar对应出现和消失的效果.
代码例子使用ListView控件h_rmnr_list
在xml文件中将自定义的Topbar的透明度设置为0 android:alpha="0"
绑定控件mListView,准备好数据之后为mListView实现以下两个事件,直接上代码:
<pre style="font-family: 宋体; background-color: rgb(255, 255, 255);"><span style="font-size:18px;"><span style="color: rgb(0, 0, 128); "><strong>private float </strong></span><span style="color: rgb(102, 14, 122); "><strong>downY</strong></span>=<span style="color: rgb(0, 0, 255);">0</span>; <span style="color: rgb(128, 128, 128); "><em>//手指点击点的Y轴坐标
</em></span><span style="color: rgb(0, 0, 128); "><strong>private float </strong></span><span style="color: rgb(102, 14, 122); "><strong>currentY</strong></span>=<span style="color: rgb(0, 0, 255);">0</span>; <span style="color: rgb(128, 128, 128); "><em>//手指离开点的Y轴坐标
</em></span><span style="color: rgb(0, 0, 128); "><strong>private float </strong></span><span style="color: rgb(102, 14, 122); "><strong>dminusc</strong></span>=<span style="color: rgb(0, 0, 255);">0</span>; <span style="color: rgb(128, 128, 128); "><em>//上俩值相减</em></span></span>
在开发过程中,需要实现初始界面Topbar不显示,当屏幕向下滚动时,Topbar逐步淡现,当屏幕向上滚动时,Topbar逐步淡出和手指向上向下抛动时Topbar对应出现和消失的效果.
代码例子使用ListView控件h_rmnr_list
在xml文件中将自定义的Topbar的透明度设置为0 android:alpha="0"
绑定控件mListView,准备好数据之后为mListView实现以下两个事件,直接上代码:
<pre style="font-family: 宋体; background-color: rgb(255, 255, 255);"><span style="font-size:18px;"><span style="color: rgb(0, 0, 128); "><strong>private float </strong></span><span style="color: rgb(102, 14, 122); "><strong>downY</strong></span>=<span style="color: rgb(0, 0, 255);">0</span>; <span style="color: rgb(128, 128, 128); "><em>//手指点击点的Y轴坐标
</em></span><span style="color: rgb(0, 0, 128); "><strong>private float </strong></span><span style="color: rgb(102, 14, 122); "><strong>currentY</strong></span>=<span style="color: rgb(0, 0, 255);">0</span>; <span style="color: rgb(128, 128, 128); "><em>//手指离开点的Y轴坐标
</em></span><span style="color: rgb(0, 0, 128); "><strong>private float </strong></span><span style="color: rgb(102, 14, 122); "><strong>dminusc</strong></span>=<span style="color: rgb(0, 0, 255);">0</span>; <span style="color: rgb(128, 128, 128); "><em>//上俩值相减</em></span></span>
private void initeEvent() { h_rmnr_list.setOnTouchListener(new View.OnTouchListener() { //监听触控事件 @Override public boolean onTouch(View v, MotionEvent event) { float rate=1f/300; //设置比例标准 理想情况是手指在屏幕划过的长度为300时 透明度由0到1 switch (event.getAction()){ case MotionEvent.ACTION_DOWN: //单点触控动作 downY=event.getRawY(); //获取触控Y轴坐标 break; case MotionEvent.ACTION_MOVE: //触控点移动动作 currentY=event.getRawY(); //实时获取触控点坐标 if(topbar.getAlpha()!=1){ //如果topbar已经不为透明 避免二次由向下滚动时再度改变Topbar的透明度 if(downY>currentY&&(downY-currentY)<301){ //向下滚动的情况 dminusc=downY-currentY; //获取起始触控点的Y轴差值 if(rate*dminusc>0.85){ //rate*dminusc无法达到取得1的转态 扩大透明度设为1的达标范围 topbar.setAlpha(1); //将透明度设为1 }else if (rate*dminusc<0.15){ //向下滚动距离过小时 恢复透明转态 topbar.setAlpha(0); }else{ topbar.setAlpha(dminusc*rate); //中间透明度变化设置 } } } if(topbar.getAlpha()==1){ //如果topbar目前为可视转态 才有必要进行向上滚动时隐藏topbar if(downY<currentY&&(currentY-downY)<300){ //向上滚动情况 dminusc=currentY-downY; //获取起始触控点的Y轴差值 if(rate*dminusc>0.85){ //rate*dminusc无法达到取得0的转态 扩大透明度设为0的达标范围 topbar.setAlpha(0); }else if (rate*dminusc<0.15){ //向上滚动距离过小时 恢复可视转态 topbar.setAlpha(1); }else{ topbar.setAlpha(1-dminusc*rate); //中间透明度变化设置 } } } break; case MotionEvent.ACTION_UP: //单点触控离开动作 //为了避免出现透明度停留在o和1之间的情况出现 if(rate*dminusc>0.5||rate*dminusc==0.5){ topbar.setAlpha(1); }else if(rate*dminusc<0.5){ topbar.setAlpha(0); } break; } return false; } }); h_rmnr_list.setOnScrollListener(new AbsListView.OnScrollListener() { //监听滑动事件 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if(scrollState== AbsListView.OnScrollListener.SCROLL_STATE_FLING){ //出现手指抛动事件时调用 if(downY>currentY){ //手指向上抛动 即屏幕向下滚动时调用 直接将topbar设置为可视 topbar.setAlpha(1); }else { //手指向下抛动 即屏幕向上滚动时调用 直接将topbar设置为透明 topbar.setAlpha(0); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //滚动过程一直会调用的方法 } }); }
相关文章推荐
- 今天遇到了隐藏顶部菜单栏(top bar)的菜鸟问题,解决了。
- recyclerview里面实现多布局嵌套recyclerview第一次进入的时候出现自动滚动到第二天reccyclerview问题
- 解决 listview的item超过屏幕显示出现滚动的全选问题
- 总结一下实现dfs搜索时出现的小问题
- 实现JLABLE的ICON是出现的问题
- 今天看了ACE 中Proactor实现部分的一些代码,做一些总结和分析
- 今天出现 连接池溢出问题?
- TOP N的一些问题,可以实现取得表中最大的一行ID的数据。
- [总结]DataGrid 固定表头实现(纵向和横向滚动条滚动,而Header不动)
- 使用Microsoft.Web.UI.WebControls TreeView实现无刷新功能出现新问题
- 关于Javascript与表单结合时出现"对象不支持此属性或方法"的问题总结(不断更新中...)
- 今天解决的问题:在vc中往Access数据库写中文时出现乱码。
- vs2003升级到vs2005常出现的几个问题总结
- 实现CSS制作网页时绝对居中问题的总结
- 实现CSS制作网页时绝对居中问题的总结!
- 关于用timestop破解vista后出现的QQ频繁报错问题
- 出现exeplorer.exe错误的问题的总结
- 操作Oracle数据库实现上传图片到Blob类型的字段出现的问题
- 今天调试一个WebPart的简单程序出现的问题
- 关于“解决实现注册用户后,自动具备访问网站的权限的问题”文章中配置出现找不到角色的问题的解决办法