實現沉浸式狀態欄 + scrollView頂部伸縮 + actionBar漸變完美結合,打造屬於本身的View

最近需求要作一個拉縮漸變的狀態欄,往上拉的時候,須要顯示actionBar,這個過程是漸變的,頂部的圖片背景能實現拉縮,而且還要實現狀態欄沉浸式android

效果如以下:git

  • 實現狀態欄的透明化
  • 實現ScrollView的拉縮
  • 實現ActionBar的漸變

實現

一、至於試下實現ScrollView的拉縮這個效果很簡單重寫onTouchEvent方法,利用滑動的垂直方向的距離,而後在設置圖片的大小github

......
 case MotionEvent.ACTION_MOVE:
                    if (!mScaling) {
                        if (getScrollY() == 0) {
                            mFirstPosition = event.getY();
                        } else {
                            break;
                        }
                    }

                    int distance = (int) ((event.getY() - mFirstPosition) * 0.6);
                    if (distance < 0) {
                        break;
                    }
                    mScaling = true;
                    params.height = zoomViewInitHeight + distance;

                    Log.d(TAG, "params.height == " + params.height + ", zoomViewInitHeight == " + zoomViewInitHeight + ", distance == " + distance);
                    zoomView.setLayoutParams(params);
                    return true;
複製代碼

這裏要注意的是:在手指釋放的時候須要進行恢復圖片的高度bash

二、ActionBar的透明度很簡單了,在onScrollChanged裏進行操做便可微信

@Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        int transAlpha = getTransAlpha();

        if (transView != null) {
            Log.d(TAG, "[onScrollChanged .. in ], 透明度 == " + transAlpha);
            transView.setBackgroundColor(ColorUtils.setAlphaComponent(transColor, transAlpha));
        }
        if (translucentChangedListener != null) {
            translucentChangedListener.onTranslucentChanged(transAlpha);
        }
    }

複製代碼

三、至於沉浸式狀態欄就很簡單了,以前寫過帖子ide

這裏我簡單的封裝了一些工具類ui

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0
            WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
            localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
        }
複製代碼

在相應的Activity或基類執行這段代碼就ok了。spa

可見在4.4到5.0的系統、5.0及以上系統的處理方式有所不一樣

除了這種代碼修改額方式外,還能夠經過主題來修改,須要在values、values-v1九、values-v21目錄下分別建立相應的主題:

//values
<style name="TranslucentTheme" parent="AppTheme">
</style>//values-v19<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">false</item>
</style>//values-v21<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">false</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
</style>
複製代碼

給相應Activity或Application設置該主題就ok了。

兩種方式根據需求選擇就行了,到這裏咱們就完成了第一步,將狀態欄透明化了。

完成了第一步,咱們開始給狀態欄加上想要的色彩吧!

在values、values-v19目錄添加以下尺寸:

//values<dimen name="padding_top">0dp</dimen>//values-v19<dimen name="padding_top">25dp</dimen>
複製代碼

關於25dp,在有些系統上可能有偏差,這裏不作討論!

2.1 頁面頂部使用Toolbar(或自定義title) 通常狀況狀態欄的顏色和Toolbar的顏色相同,既然狀態欄透明化後,佈局頁面延伸到了狀態欄,何不給Toolbar加上一個狀態欄高度的頂部padding呢:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    android:paddingTop="@dimen/padding_top"
    android:theme="@style/AppTheme.AppBarOverlay" />
複製代碼

效果圖下:

博客地址:

http://www.jianshu.com/p/05aa5329c3d3

項目地址:

https://github.com/androidstarjack/TranslucentScrollView

相信本身,沒有作不到的,只有想不到的

若是你以爲此文對您有所幫助, 歡迎加入微信公衆號:終端研發部

技術+職場
相關文章
相關標籤/搜索