您的位置:首页 > 运维架构

总结今天实现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>


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) {
//滚动过程一直会调用的方法
}
});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息