总结今天实现Topbar随屏幕滚动逐渐出现和淡出问题

来源:互联网 发布:企业it 运维 知乎 编辑:程序博客网 时间:2024/05/21 10:21

实现场景:

在开发过程中,需要实现初始界面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) {                //滚动过程一直会调用的方法        }    });}

0 0
原创粉丝点击