1. 程式人生 > >關於如何實現Android透明狀態列的總結

關於如何實現Android透明狀態列的總結

好久沒寫部落格了,哈哈,言歸正傳,最近遇到了透明狀態列的需求,下面總結一下 ,希望能幫助到有需求的人。

我們先看下之前正常的效果,頂部是一條明顯的橙色的顏色。(這是臨時找的圖,跟我程式碼的效果類似,意思一樣)


為了需求和美觀,我們要做成下面的樣子(把頂部透明,樣式基本就這樣,只是找了類似的圖片,動圖懶得做~~~)


下面直接說程式碼,首先要在theme中引用的style檔案寫:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowActionBar">false</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

然後我把部分佈局貼出來,這裡我就只貼搜尋框的程式碼,因為它是緊跟於狀態列的佈局
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <View
            android:id="@+id/view_topview"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:padding="50dp" />

        <LinearLayout
            android:id="@+id/ll_search"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#00FCAF24"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/tv_city"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_gravity="center"
                android:layout_marginLeft="10dp"
                android:background="@drawable/mulu" />

            <EditText
                android:id="@+id/tv_search"
                android:layout_width="fill_parent"
                android:layout_height="35dp"
                android:layout_gravity="center"
                android:layout_marginBottom="2dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginTop="3dp"
                android:layout_weight="1"
                android:background="@drawable/home_search_bg"
                android:cursorVisible="false"
                android:drawableLeft="@mipmap/search1a"
                android:hint="搜尋商品/供應商/氣源地"
                android:maxLength="10"
                android:paddingLeft="10dp"
                android:textColor="#333333"
                android:textColorHint="#929292"
                android:textSize="14sp" />

            <ImageView
                android:id="@+id/iv_sao"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginRight="10dp"
                android:src="@drawable/xiaoxi" />
        </LinearLayout>
    </LinearLayout>

有人會問到這個View是幹嘛的,其實到現在我也沒弄清楚是幹嘛的,誤打誤撞而已,我理解的意思是(最後在總結),所以這裡我們先看Fragment的程式碼,
 mRootView = inflater.inflate(R.layout.home_fragment, container, false);
        mTopView = mRootView.findViewById(R.id.view_topview);
        //設定狀態列的初始顏色
        SystemStatesBarUtils.setTopViewHeightColor(getActivity(), mTopView, R.color.transparence);
然後我這裡是做了一個滑動佈局的時候,狀態列的顏色跟隨我滑動的動作顏色漸變
 @Override
    public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
        if (y <= 0) {   //設定標題的背景顏色 滑動到頂部
            layout.setBackgroundColor(Color.argb(0, 252, 175, 36));
            mTopView.setBackgroundColor(Color.argb(0, 252, 175, 36));
            //toolbar_common.setAlpha(0);
        } else if (y > 0 && y <= height) { //滑動距離小於banner圖的高度時,設定背景和字型顏色顏色透明度漸變 中間漸變
            float scale = (float) y / height;
            float alpha = (205 * scale);
            layout.setBackgroundColor(Color.argb((int) alpha, 72, 137, 219));
            mTopView.setBackgroundColor(Color.argb((int) alpha, 72, 137, 219));
            //toolbar_common.setAlpha(scale);
            Log.e("111-------------------", "scale------" + scale + "alpha-----" + alpha);
        } else {    //滑動到banner下面設定普通顏色 滑動到底部了
            mTopView.setBackgroundColor(Color.argb(205, 72, 137, 219));
            layout.setBackgroundColor(Color.argb(205, 72, 137, 219));
            //toolbar_common.setAlpha(1);
            //toolbar_common.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.colorPrimary));
        }
    }

這個方法的layout  就是搜尋框的佈局id,這是Scoollview的滑動事件設定控制元件的顏色跟隨滑動事件而漸變

然後在Activity中別忘了新增版本的判斷

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明狀態列
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明導航欄 如果只是想要更改狀態列 這句可以登出
            //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
然後就完事了,對於這個Top_View,我的理解是,之前透明瞭ActionBar,我們在搜尋框和狀態列之間加個Veiw,並且屬性padding為50,那我們設定Top-View的顏色,就會填充到狀態列,然後就可以了,我是這麼理解,有大神知道怎麼回事的可以發表評論,畢竟我不是大神。哈哈