SearchBar背景透明度变化

搜索条,其背景色随着界面的上下滑动而渐变。在这里考虑到搜索条的样式会根据UI进行设计,没有固定的样式,所以就直接写在了布局文件中。文中涉及到自定义轮播图控件ADViewPager
具体应用请阅读:http://www.jianshu.com/p/3564b08db10e

效果图:
SearchBar.gif

一:原理
不透明度的范围0~255,根据轮播图的高度和轮播图滑出屏幕的高度+搜索条的高度求出百分比,然后计算出不透明度值,再设置搜索条的不透明度就行了。

二:布局




    

        

            

            

        

    

    
    

        

        

            

            

            

        

        

    


三:滑动监听
在布局文件中我们看到了SlidingScrollView,这是继承了ScrollView并重写了onScrollChanged(int l, int t, int oldl, int oldt)方法。从ScrollView的源码中我们找到了onScrollChanged这个方法,再仔细一看是包级私有的,我们无法使用,Google为什么这样做呢?虽然不可以直接用官方的控件,但是我们可以重写它,修改它的权限,这样我们就可以在外部使用了。
onScrollChanged里面有4个参数,l代表滑动后当前ScrollView可视界面的左上角在整个ScrollView的X轴中的位置,oldi也就是滑动前的X轴位置。同理,t也是当前可视界面的左上角在整个ScrollView的Y轴上的位置,oldt也就是移动前的Y轴位置。

public class SlidingScrollView extends ScrollView {
    private OnScrollChangedListener onScrollChangedListener;

    public SlidingScrollView(Context context) {
        this(context, null);
    }

    public SlidingScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SlidingScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (onScrollChangedListener != null) {
            onScrollChangedListener.onScrollChanged(l, t, oldl, oldt);
        }
    }

    public interface OnScrollChangedListener {
        void onScrollChanged(int l, int t, int oldl, int oldt);
    }

    /**
     * 滑动监听,对外提供的方法
     * @param onScrollChangedListener
     */
    public void setOnScrollChangedListener(OnScrollChangedListener onScrollChangedListener) {
        this.onScrollChangedListener = onScrollChangedListener;
    }
}

四:实际应用

//在界面加载的时候,初始化搜索条背景为透明
rlSearchBar.getBackground().setAlpha(0);

scrollView.setOnScrollChangedListener(new SlidingScrollView.OnScrollChangedListener() {
    @Override
    public void onScrollChanged(int l, int t, int oldl, int oldt) {
        int height = adViewPager.getHeight() - rlSearchBar.getHeight();
        float fraction = (float) Math.min(Math.max(t, 0), height) / height;
        int alpha = (int) (fraction * 255);
        rlSearchBar.getBackground().setAlpha((int) (fraction * 255));
    }
});

在RelativeLayout 布局文件中,搜索条放在文件末尾,并且不设置相对位置,就会浮在界面最顶端,不然会被SlidingScrollView覆盖的。

源码:https://github.com/GitPhoenix/SearchBar

你可能感兴趣的:(SearchBar背景透明度变化)