首页 > 代码库 > 安卓标题栏随屏幕滑动改变颜色

安卓标题栏随屏幕滑动改变颜色

为了我们项目的美观我们也许经常会碰到一些感觉很头疼的问题,如标题所说就是一个,一个scrollView包裹的页面或者存在listView的页面往往需要在往上滑动的时候标题栏实现悬浮并且背景颜色也要随之改变。废话不多说了,直接说怎么实现吧。

1.如果是scrollView包裹的页面,我们需要把scrollView和标题栏定义在相对布局中,保证标题栏可以悬浮,listView也是同理。

2.如果是scrollView我们需要用到onOverScrolled方法,然而这是一个protected方法,所以我们要通过自定义scrollView使用接口回调来实现,listView则需要使用的是onScroll方法,它同样是一个protected方法,所以它的解决思路和上面是一样的。

3.知道改怎么调用监听方法了就可以来完成功能的实现,原理其实也很简单,就是监听滑动的高度来给标题栏设定不同的背景色,当然也可以做更多的事情。下面就两种分别把主要代码放在下面。

a.ScrollView

1).首先自定义接口

public interface ScrollViewListener {
    void onScrollChanged(int scrollX, int scrollY, boolean clampedX, boolean clampedY);
}
2)自定义scrollView,实现接口的回调

  1. public class SmartScrollView extends ScrollView {  
  2.     private ScrollViewListener scrollViewListener = null;
  3.   
  4.     public SmartScrollView (Context context, AttributeSet attrs,  
  5.             int defStyle) {  
  6.         super(context, attrs, defStyle);  
  7.     }  
  8.   
  9.     public SmartScrollView (Context context, AttributeSet attrs) {  
  10.         super(context, attrs);  
  11.     }  
  12.   
  13.     public SmartScrollView (Context context) {  
  14.         super(context);  
  15.     }  
  16.       
  17.     @Override  
  18.     protected void onScrollChangedint scrollX, int scrollY, boolean clampedX, boolean clampedY) {  
  19.         super.onScrollChanged(scrollX, scrollY, clampedX, clampedY);  
  20.         if(this.scrollViewListener!= null) {  
  21.             scrollViewListener.onScrollChanged(scrollX, scrollY, clampedX, clampedY);  
  22.         }  
  23.     }  
  24.   
  25.     public void setScrollViewListener(ScrollViewListener scrollViewListener) {
  26.         this.scrollViewListener = scrollViewListener;
  27.     }  
  28.   
  29. }
  30.      

3).实现布局这部分代码过于简单就不粘了

4).在页面中实现功能

   smartScrollView.setScrollViewListener(new ScrollViewListener() {
            
            @Override
            public void onScrollChanged(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {

      //获取图片的高度,在这个范围内渐变
                if (scrollY >= iv_background.getTop() + iv_background.getMeasuredHeight()) {
                    ll_title.setBackgroundColor(Color.rgb(0,0,0));
                } else if (scrollY>=0) {

      //计算透明度
                    float persent = scrollY * 1f / (iv_background + iv_background.getMeasuredHeight());
                    int alpha = (int) (255 * persent);
                    int color = Color.argb(alpha,0,0,0);
                    ll_title.setBackgroundColor(color);
                }
            }
        });

b.listView

这个定义接口回调和scrollView类似,就是参数换了而已,直接写关键代码把

((PullRefreshListView) pl_list).setOnRefreshListener(new OnRefreshListener() {

            @Override
            public void onScroll(int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                int[] ints = new int[2];
                mImage.getLocationOnScreen(ints);
                /**
                 * mImage距离屏幕顶部的距离(图片顶部在屏幕最上面,向上滑动为负数,所以取反)
                 * 如果不隐藏状态栏,需要加上状态栏的高度;隐藏状态栏就不用加了;
                 */
                int scrollY = -ints[1] + statusbarHeight;
                int imageHeight = mImage.getHeight();
                if (mImage != null && imageHeight > 0) {
                    // 如果图片没有向上滑动,设置为全透明
                    if (scrollY < 0) {
                        mByWhichView.setBackgroundColor(Color.argb(0,0,0,0));
                    } else {
                        // 图片已经滑动,而且还没有全部滑出屏幕,根据滑出高度的比例设置透明度的比例
                        if (scrollY < imageHeight) {
                            int alpha= (int) (new Float(scrollY) / new Float(imageHeight) * 255);
                            ll_title.setBackgroundColor(Color.argb(alpha,0,0,0));
                        } else {
                            ll_title.setBackgroundColor((Color.rgb(0,0,0));
                        }
                    }
                }
            }
        });

 

大概就是这样了。

安卓标题栏随屏幕滑动改变颜色