安卓標題欄隨屏幕滑動改變顏色

爲了咱們項目的美觀咱們也許常常會碰到一些感受很頭疼的問題,如標題所說就是一個,一個scrollView包裹的頁面或者存在listView的頁面每每須要在往上滑動的時候標題欄實現懸浮而且背景顏色也要隨之改變。廢話很少說了,直接說怎麼實現吧。ide

1.若是是scrollView包裹的頁面,咱們須要把scrollView和標題欄定義在相對佈局中,保證標題欄能夠懸浮,listView也是同理。佈局

2.若是是scrollView咱們須要用到onOverScrolled方法,然而這是一個protected方法,因此咱們要經過自定義scrollView使用接口回調來實現,listView則須要使用的是onScroll方法,它一樣是一個protected方法,因此它的解決思路和上面是同樣的。this

3.知道改怎麼調用監聽方法了就能夠來完成功能的實現,原理其實也很簡單,就是監聽滑動的高度來給標題欄設定不一樣的背景色,固然也能夠作更多的事情。下面就兩種分別把主要代碼放在下面。spa

a.ScrollViewxml

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).實現佈局這部分代碼過於簡單就不粘了get

4).在頁面中實現功能it

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

      //獲取圖片的高度,在這個範圍內漸變
                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));
                        }
                    }
                }
            }
        });

 

大概就是這樣了。

相關文章
相關標籤/搜索