沉浸式狀態欄-高仿QQ

QuentinGrah 7年前發布 | 9K 次閱讀 安卓開發 Android開發 移動開發

前言:在進入今天正題前,還是老樣子先談談感想吧,最近感覺整個都失去了方向感,好迷茫!找工作又失敗了,難道Android真的飽和了?這兩天我一直沒出門,除了下樓哪外賣就是宅宿舍了,靜想了許久,我還是不能忘了初心,我相信我找不到工作的原因有很多,最關鍵的還是要技術夠硬才行啊,奔跑吧孩子!接下來我就給大家介紹怎樣快速打造沉浸式狀態欄吧,雖然感覺有點相見恨晚,但其實不完! 一:何為沉浸式狀態欄? 沉浸式狀態欄是Google從Android 4.4開始,給我們開發者提供的一套能透明的系統ui樣式,這樣樣式是給狀態欄和導航欄的,這樣的話就不用向以前那樣每天面對著黑乎乎的上下兩條黑欄了,還可以調成跟Activity一樣的樣式,形成一個完整的主題,和IOS7.0以上系統一樣了。先給你們來對比一下加了沉浸式和沒加沉浸式的樣式效果圖吧,如下圖所示:

(非沉浸式)

(沉浸式)

在此相信大家都了解什么是沉浸式狀態欄了;目前打開很多APP都會有這種效果,可想而知,沉浸式狀態欄還是挺實用的! 二、使用沉浸式狀態欄高仿QQ: 實現沉浸式狀態欄的步驟灰常簡單:因為沉浸式狀態欄是Android4.4后才推出的,所以首先在程序中加上判斷,即:當系統版本為4.4或者4.4以上時可以使用沉浸式狀態欄,接著在語句中設置狀態欄和導航欄為透明即可:

//當系統版本為4.4或者4.4以上時可以使用沉浸式狀態欄

if (Build.VERSION.*SDK_INT *>= Build.VERSION_CODES.*KITKAT*) { 
    //透明狀態欄 
     getWindow().addFlags(WindowManager.LayoutParams.*FLAG_TRANSLUCENT_STATUS*); 

    //透明導航欄 
      getWindow().addFlags(WindowManager.LayoutParams.*FLAG_TRANSLUCENT_NAVIGATION*);}

最后在布局文件中加上、、、

android:fitsSystemWindows="true"android:clipToPadding="true"

這樣就實現沉浸式狀態欄了!就是這么簡單,就是這么耐使!源碼是最好的導師,快看看整體代碼吧:

xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent"
 android:background="#ffffff"
 android:orientation="vertical"
 tools:context=".MainActivity">

 <RelativeLayout android:fitsSystemWindows="true" 
android:clipToPadding="true"
 android:layout_width="match_parent"
 android:layout_height="80dp"
 android:background="#0099cc"> 

<de.hdodenhof.circleimageview.CircleImageView 
android:id="@+id/img_head"
 android:layout_width="40dp"
 android:layout_height="40dp"
 android:layout_gravity="center_horizontal"
 android:layout_marginTop="13dp"
 android:layout_marginLeft="15dp"
 app:civ_border_width="2dp"
 app:civ_border_color="#FFFFFF"
 android:src="@mipmap/meinv"> 
</de.hdodenhof.circleimageview.CircleImageView>

 <TextView
 android:id="@+id/tv_title"
 android:layout_width="wrap_content" 
android:layout_height="wrap_content"
 android:layout_marginTop="26dp"
 android:layout_centerHorizontal="true"
 android:text="聯系人"
 android:textColor="@android:color/white"
 android:textSize="18sp" />

 <TextView
 android:id="@+id/tv_right_add"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_marginTop="26dp"
 android:layout_marginRight="15dp"
 android:layout_alignParentRight="true"
 android:text="添加"
 android:textColor="@android:color/white"
 android:textSize="18sp" />
 </RelativeLayout>

 <TextView
 android:layout_width="match_parent" 
android:layout_height="match_parent"
 android:gravity="center"
 android:text="沉浸式狀態欄"
 android:textSize="22sp"
 android:background="#E0FFFF"/>

 </LinearLayout>

MainActivity中:

package com.zsml.chaotranstintbar;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity{
 @Override
 protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        this.requestWindowFeature(Window.*FEATURE_NO_TITLE*); 
        setContentView(R.layout.*activity_main*); 

        //當系統版本為4.4或者4.4以上時可以使用沉浸式狀態欄
        if (Build.VERSION.*SDK_INT *>= Build.VERSION_CODES.*KITKAT*) {
  `           //透明狀態欄 
              getWindow().addFlags(WindowManager.LayoutParams.*FLAG_TRANSLUCENT_STATUS*);

             //透明導航欄 
              getWindow().addFlags(WindowManager.LayoutParams.*FLAG_TRANSLUCENT_NAVIGATION*);
         }
   }

}

實現沉浸式狀態欄的其他方法:動態加入、第三方庫。

1、動態實現:

動態實現也是比較簡單的,首先是隱藏布局,最后動態計算狀態欄高度并設置,都是在MainActivity中操作的,布局文件也就不用加上

android:clipToPadding="true" 
 android:fitsSystemWindows="true"

這兩句了!

所以直接給源碼吧:

MainActivity中:

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import java.lang.reflect.Field;
public class TwoActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState); //去掉標題 
this.requestWindowFeature(Window.*FEATURE_NO_TITLE*);
 setContentView(R.layout.*activity_two*);

 //當系統版本為4.4或者4.4以上時可以使用沉浸式狀態欄
 if (Build.VERSION.*SDK_INT *>= Build.VERSION_CODES.*KITKAT*) {

 //透明狀態欄 getWindow().addFlags(WindowManager.LayoutParams.*FLAG_TRANSLUCENT_STATUS*);

 //透明導航欄 getWindow().addFlags(WindowManager.LayoutParams.*FLAG_TRANSLUCENT_NAVIGATION*);
 LinearLayout linear_bar=(LinearLayout)findViewById(R.id.*linear_bar*); 
linear_bar.setVisibility(View.*VISIBLE*);
 int statusHeight=getStatusBarHeight();
 LinearLayout.LayoutParams params=(LinearLayout.LayoutParams )
linear_bar.getLayoutParams();
 params.height=statusHeight;
 linear_bar.setLayoutParams(params);
 }
}

//獲取狀態欄的高度
private int getStatusBarHeight(){
 try {
 Class<?> c=Class.forName("com.android.internal.R$dimen");
 Object obj=c.newInstance();
 Field field=c.getField("status_bar_height");
 int x=Integer.parseInt(field.get(obj).toString());
 return getResources().getDimensionPixelSize(x);
 }catch(Exception e){
      e.printStackTrace();
 }
 return 0;
 }
}

這樣就完事了,是不是一樣那么簡單、、、

2、第三方庫實現(SystemBarTint):

SystemBarTint是開源到github上的一個開源庫來的;

地址: https://github.com/jgilfelt/SystemBarTint

使用步驟:

關聯庫: compile'com.readystatesoftware.systembartint:systembartint:1.0.3'

xml布局中添加:

android:fitsSystemWindows="true"android:clipToPadding="true"

MainActivity中實現:

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import com.readystatesoftware.systembartint.SystemBarTintManager;

public class ThreeActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState); 
this.requestWindowFeature(Window.*FEATURE_NO_TITLE*);

setContentView(R.layout.*activity_three*);

 //當系統版本為4.4或者4.4以上時可以使用沉浸式狀態欄
 if (Build.VERSION.*SDK_INT *>= Build.VERSION_CODES.*KITKAT*) {

 //透明狀態欄 
getWindow().addFlags(WindowManager.LayoutParams.*FLAG_TRANSLUCENT_STATUS*);

 //透明導航欄
 getWindow().addFlags(WindowManager.LayoutParams.*FLAG_TRANSLUCENT_NAVIGATION*);
 SystemBarTintManager tintManager = new SystemBarTintManager(this);
 // 激活狀態欄
 tintManager.setStatusBarTintEnabled(true);
 // enable navigation bar tint 激活導航欄
 tintManager.setNavigationBarTintEnabled(true);
 //設置系統欄設置顏色
 //tintManager.setTintColor(R.color.red); //給狀態欄設置顏色 tintManager.setStatusBarTintResource(R.color.*middle_color*);
 // 設置導航欄設置資源 tintManager.setNavigationBarTintResource(R.color.*androidColorE*);
 }
 }
}

都是大同小異來的,我個人覺得第一種方法是最好實現和理解的,大家都可以嘗試一下,希望對你們有所幫助!最后貼出沉浸式狀態欄-高仿QQ的效果圖如下:

 

 

來自:http://www.jianshu.com/p/cbfc12d18bc1

 

 本文由用戶 QuentinGrah 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!