实现ScrollView滑动时标题栏的隐藏效果(我自己写了例子)

想把最近做项目学会的东西整理一下,项目中有一个要求,就是实现ScrollView滑动时标题栏的隐藏效果,整体效果是ScrollView从头往下滑动的时候慢慢的隐藏标题栏的效果 

注意:我的标题栏是自己写的布局,并不是运用actionbar或者相关替代控件写的.

先看效果图吧: 
 
思路: 
1.监听ScrollView的滑动变化事件,但是我们会发现ScrollView并没有对外提供这个方法,所以我们要做的操作就是实现对外公布这个方法 
2.实现标题栏的动画,其实就是改变相对应的透明度而已。

代码: 
我们先自定义一个ScrollView,注释说明很清楚,就不想详细介绍了:

public class MyScrollView extends ScrollView{
    private ScrollViewListener scrollViewListener = null;

    public MyScrollView(Context context) {
        super(context);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
    //x为当前滑动条的横坐标,y表示当前滑动条的纵坐标,oldx为前一次滑动的横坐标,oldy表示前一次滑动的纵坐标
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null) {
            //在这里将方法暴露出去
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }



    //是否要其弹性滑动
    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
                                   int scrollY, int scrollRangeX, int scrollRangeY,
                                   int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {

        // 弹性滑动关键则是maxOverScrollX, 以及maxOverScrollY,
        // 一般默认值都是0,需要弹性时,更改其值即可
        // 即就是,为零则不会发生弹性,不为零(>0,负数未测试)则会滑动到其值的位置
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX,
                scrollRangeY, 0, 0, isTouchEvent);
    }
    //接口
    public interface ScrollViewListener {

        void onScrollChanged(View scrollView, int x, int y, int oldx, int oldy);

    }
    public void setScrollViewListener(ScrollViewListener listener)
    {
        scrollViewListener=listener;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

接着我们只需要使用这个自定义控件,获取监听事件就好了

mScrollView.setScrollViewListener(new MyScrollView.ScrollViewListener() {
            @Override
            public void onScrollChanged(View scrollView, int x, int y, int oldx, int oldy) {
                if (isFirst) {
                    isFirst = false;
                }
                    titleAnim(oldy,y);
            }
        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

最后就只需要获取标题栏对象,通过判断scrollView的滑动距离进行相对应的变化即可:

 if (y < 800) {
            float alpha = 1 - ((float) y) / 800;
            BaseActvity.titleBar.setAlpha(alpha);
            if (alpha==0)
            {
                BaseActvity.titleBar.setClickable(false);
            }else
            {
                BaseActvity.titleBar.setClickable(true);
            }
        } else {
            //下滑显示标题栏
            if (oldy > y) {
                BaseActvity.titleBar.setAlpha(1);
                BaseActvity.titleBar.setClickable(true);
            } else {
                BaseActvity.titleBar.setAlpha(0);
                BaseActvity.titleBar.setClickable(false);
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

http://blog.csdn.net/anny_lin/article/details/49722361

我自己写的例子,和上面效果相反(上划显示,下划消失)
源码下载:

http://download.csdn.net/detail/zhaihaohao1/9524904

你可能感兴趣的:(控件)