Android 夜間模式初探

當(dāng)下各種閱讀類APP(如各種瀏覽器紧索,某日頭條等)都會有夜間模式富寿,也順應(yīng)了大家的睡前必須玩一下手機(jī)的作息習(xí)慣。關(guān)于夜間模式的實(shí)現(xiàn)愉烙,有很多種方法。這篇日志學(xué)習(xí)一下最簡單的實(shí)現(xiàn)方式解取,通過setTheme(int resid)方法實(shí)現(xiàn)主題切換來實(shí)現(xiàn)夜間模式步责,這也是Android官方推薦的方法。

整體思路與效果##

通過Android SDK提供的setTheme方法禀苦,可以切換Activity的不同的主題蔓肯,這樣定義一個合適的主題,就可以實(shí)現(xiàn)夜間模式了振乏。

首先看一下效果圖

主題切換效果圖

定義不同的主題##

自定義主題屬性###

<resources>
    <attr name="textColorValue" format="color" />
      ...
</resources>

這里我們可以定義一些切換時(shí)蔗包,需要更改的內(nèi)容屬性。比如說慧邮,當(dāng)前頁面中所有文字的顏色调限,在平時(shí)是黑色,在夜間模式是灰色误澳,那么可以在這里定義一個屬性耻矮,在自定義主題時(shí)設(shè)置不同的顏色即可。

自定義不同的主題###

<!--日間模式主題-->
    <style name="CustomThemeLight" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/light</item>
        <item name="colorPrimaryDark">@color/light</item>
        <item name="colorAccent">@color/black</item>
        <item name="android:textColorPrimary">@color/black</item>
        <item name="android:windowBackground">@color/white</item>
        <item name="textContent">@string/theme0</item>
        <item name="textColorValue">@color/black</item>
        <item name="pupwindowTheme">@style/AppTheme.PopupLight</item>
    </style>

    
    <!--夜間模式主題-->
    <style name="CustomThemeDark" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/dark_bg</item>
        <item name="colorPrimaryDark">@color/dark_bg</item>
        <item name="colorAccent">@color/dark_bg</item>
        <item name="android:windowBackground">@color/dark_bg</item>
        <item name="textContent">@string/theme1</item>
        <item name="textColorValue">@color/white</item>
        <item name="pupwindowTheme">@style/AppTheme.PopupDark</item>
    </style>

熟悉ToolBar的同學(xué)忆谓,應(yīng)該對上面幾個屬性不陌生裆装。這里首先設(shè)置了colorPrimary,colorPrimaryDark,windowBackground等幾個屬性哨免,首先確定了這個主題整體的色調(diào)勾扭。

接下來就是對自定義屬性的設(shè)置,這里我們可以看到在textColorValue的屬性在日間模式和夜間模式中分別設(shè)置成了黑色和白色铁瞒,這樣就可以和整體的色調(diào)形成反差。

自定義屬性的使用###

接下來桅滋,就是將自定義屬性作用到布局文件中

<RelativeLayout
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:padding="10dp"
            android:text="公開文章"
            android:textColor="?attr/textColorValue"
            android:textSize="16sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dp"
            android:drawablePadding="10dp"
            android:drawableRight="@mipmap/right_arrow"
            android:gravity="center_vertical"
            android:padding="10dp"
            android:text="11"
            android:textColor="?attr/textColorValue" />
    </RelativeLayout>

如上面這段代碼所示慧耍,你可以將應(yīng)用中所有TextView的TextColor的屬性設(shè)置為?attr/textColorValue,這樣他的值就會根據(jù)你在自定義主題中所設(shè)定的值變化丐谋。這樣是不是比通過java代碼寫一大串if-else方便許多呢芍碧。

到這里你應(yīng)該想到了,在自定義屬性時(shí)可以定義各種各樣的內(nèi)容号俐,TextView的大小泌豆,ImageView的大小,LinearLayout的背景等等吏饿。雖然這樣在一開始寫代碼的時(shí)候有些繁瑣踪危,但從長遠(yuǎn)來說,是很有價(jià)值的猪落。

主題切換##

這里首先需要明確一點(diǎn)贞远,setTheme方法必須在setContentView方法之前執(zhí)行,才會有效(這個有點(diǎn)讓人失望笨忌,但想想也是必然的)蓝仲,所以呢,采用這種方式實(shí)現(xiàn)夜間模式官疲,Activity必然需要重啟袱结,因此這里需要考慮到Activity切換的問題,不能讓人覺得換了一個夜間模式途凫,整個應(yīng)用重啟了一遍垢夹,那也太low了。

Activity切換效果###

activity.finish();   
activity.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

這里只需定義兩個動畫效果颖榜,確保Activity切換效果不明顯即可棚饵,采用alpha動畫即可,這個實(shí)現(xiàn)起來應(yīng)該很簡單掩完,這里就不再贅述噪漾。

主題切換實(shí)現(xiàn)###

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        Util.onActivityCreateSetTheme(this);
        setContentView(R.layout.activity_main);       
    }

這里我們在setContentView方法之前調(diào)用setTheme方法

主題切換工具類util###

    public static void onActivityCreateSetTheme(Activity activity) {
        switch (sTheme) {
            case Constants.THEME_DARK:               
activity.setTheme(R.style.CustomThemeDark);
                break;                           
            case Constants.THEME_LIGHT:               
activity.setTheme(R.style.CustomThemeLight);
                break;
            default:
                break;

        }
    }

這樣就為當(dāng)前Activity設(shè)置了相應(yīng)的主題。

調(diào)用下面的方法且蓬,傳入不同的主題id即可實(shí)現(xiàn)主題切換

 public static void changeToTheme(Activity activity, int theme) {
        sTheme = theme;
        activity.finish();
        activity.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
        activity.startActivity(new Intent(activity, activity.getClass()));
    }

好了欣硼,這里就是關(guān)于夜間模式的簡單了解。這種方式恶阴,相對來說比較繁瑣诈胜,但也最容易理解豹障。當(dāng)然,這里只是從最簡單的角度出發(fā)焦匈,沒有考慮Activity重啟前后數(shù)據(jù)保存和恢復(fù)的問題血公,以及對Fragment的影響等問題,實(shí)際問題還是需要根據(jù)實(shí)際項(xiàng)目分析缓熟,這里就不展開來說累魔。

完整代碼已上傳到github,有興趣的同學(xué)可以參考一下够滑。

github代碼地址

這里對于自定義屬性和主題的用法垦写,還是值得借鑒,即便不一定要用到夜間模式彰触,但是通過切換主題實(shí)現(xiàn)UI的更新也是一種考慮梯投。


PS:最近工作較忙,只能在睡前打開簡書看看文章况毅,真心覺得簡書的夜間模式太棒了分蓖,一鍵切換,沒有過場動畫(不像某些瀏覽器)俭茧,太高大上了咆疗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市母债,隨后出現(xiàn)的幾起案子午磁,更是在濱河造成了極大的恐慌,老刑警劉巖毡们,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迅皇,死亡現(xiàn)場離奇詭異,居然都是意外死亡衙熔,警方通過查閱死者的電腦和手機(jī)登颓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來红氯,“玉大人框咙,你說我怎么就攤上這事×「剩” “怎么了喇嘱?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長塞栅。 經(jīng)常有香客問我者铜,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任作烟,我火速辦了婚禮愉粤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拿撩。我一直安慰自己衣厘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布压恒。 她就那樣靜靜地躺著头滔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涎显。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天兴猩,我揣著相機(jī)與錄音期吓,去河邊找鬼。 笑死倾芝,一個胖子當(dāng)著我的面吹牛讨勤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晨另,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼潭千,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了借尿?” 一聲冷哼從身側(cè)響起刨晴,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎路翻,沒想到半個月后狈癞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茂契,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年蝶桶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掉冶。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡真竖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厌小,到底是詐尸還是另有隱情恢共,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布召锈,位于F島的核電站旁振,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拐袜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一吉嚣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹬铺,春花似錦尝哆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至规阀,卻和暖如春恒序,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谁撼。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工歧胁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厉碟。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓喊巍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箍鼓。 傳聞我的和親對象是個殘疾皇子崭参,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容