有關於Activity做爲dialog全屏顯示,沉浸式狀態欄及屏幕亮度問題的一次總結android
1.彈出一個全屏顯示的Dialog,裏面作了好多的邏輯處理,好比搶紅包,請求接口,好比動畫效果。git
2.經過某一事件改變當前佈局的背景顏色github
使用自定義主題,先看看自定義主題中須要用到的一些屬性設置說明bash
<!-- 在此添加一種顏色值模式ARGB{xxxxxxxx},A{前兩位}表示Appha即透明度,取值爲0-255 -->
<style name="activity_DialogTransparent">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFullscreen">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.2</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item> <!--Activity切換動畫效果-->
</style>複製代碼
定義好主題以後須要在Activity配置中進行對主題的引用!微信
在代碼中對窗體設置透明度灰度的方法
設置透明度(這是窗體自己的透明度,非背景)app
WindowManager.LayoutParams windowLP = getWindow().getAttributes();
windowLP.alpha = 0.5f;
getWindow().setAttributes(windowLP);複製代碼
alpha在0.0f到1.0f之間。1.0徹底不透明,0.0f徹底透明ide
設置灰度佈局
WindowManager.LayoutParams windowLP = getWindow().getAttributes();
windowLP.dimAmount = 0.5f;
getWindow().setAttributes(windowLP);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);複製代碼
dimAmount在0.0f和1.0f之間,0.0f徹底不暗,1.0f全暗學習
這些設置對dialog對話框一樣也有效;動畫
在清單文件中配置Activity時聲明
android:theme="@android:style/Theme.Translucent" 複製代碼
1.在代碼中設置
//無title
requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);
//此兩段代碼必須設置在setContentView()方法以前
setContentView(R.layout.main); 複製代碼
2.在配置文件中設置
在Activity的聲明中設置主題爲全屏
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"複製代碼
從Android4.4開始,才能夠實現狀態欄着色,而且從5.0開始系統更加完善了這一功能,可直接在主題中設置
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>複製代碼
或者
getWindow().setStatusBarColor(color)複製代碼
來實現,但畢竟4.4+的機器還有很大的佔比,因此就有必要尋求其它的解決方案。
一、首先將手機手機狀態欄透明化:
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了。
可見在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" />複製代碼
效果圖下:
在方案一中,咱們沒有使用android:fitsSystemWindows="true"屬性,而是將佈局延伸到狀態欄來處理,此次咱們使用android:fitsSystemWindows="true"屬性,不讓佈局延伸到狀態欄,這時狀態欄就是透明的,而後添加一個和狀態欄高、寬相同的指定顏色View來覆蓋被透明化的狀態欄。咱們一步步來實現。
一、第一步仍是先將狀態欄透明化,方法同上。
二、在佈局文件中添加android:fitsSystemWindows="true"屬性:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:theme="@style/AppTheme.AppBarOverlay"
app:title="第二種方案" />
</LinearLayout>複製代碼
三、建立View並添加到狀態欄:
private void addStatusBarView() {
View view = new View(this);
view.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(this));
ViewGroup decorView = (ViewGroup) findViewById(android.R.id.content);
decorView.addView(view, params);
}複製代碼
原理很簡單,可是要額外寫這些代碼。。。最後看下效果:
和方案二相似,一樣使用android:fitsSystemWindows="true"屬性,再修改佈局文件的根佈局爲須要的狀態欄顏色,因根佈局的顏色被修改,因此你須要在裏邊多嵌套一層佈局,來指定界面的主背景色,好比白色等等,不然就和狀態欄顏色同樣了。提及來有點抽象,仍是看具體的例子吧:
一、先將狀態欄透明化,方法同上。
二、修改佈局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff9900"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff9900"
android:theme="@style/AppTheme.AppBarOverlay"
app:title="第三種方案" />
</LinearLayout>
</RelativeLayout>複製代碼
修改完了,看效果:
若是項目有幾十個界面,這樣的方式修改起來仍是挺累的,你還要考慮各類嵌套問題。
後兩種方案的例子相對簡單,有興趣的話你能夠嘗試更多的場景!
三種方式如何選擇,相信到這裏你應該有答案了吧,我我的更喜歡第一種!
/**
* Android獲取並設置Activity的亮度
* 此API只適合2.1以上版本
*/
public class ActivityUtils {
/**
* 判斷是否開啓了自動亮度調節
*
* @param aContentResolver
* @return
*/
public static boolean isAutoBrightness(ContentResolver aContentResolver) {
boolean automicBrightness = false;
try {
automicBrightness = Settings.System.getInt(aContentResolver,
Settings.System.SCREEN_BRIGHTNESS_MODE) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
return automicBrightness;
}
/**
* 獲取屏幕的亮度
*
* @param activity
* @return
*/
public static int getScreenBrightness(Activity activity) {
int nowBrightnessValue = 0;
ContentResolver resolver = activity.getContentResolver();
try {
nowBrightnessValue = android.provider.Settings.System.getInt(
resolver, Settings.System.SCREEN_BRIGHTNESS);
} catch (Exception e) {
e.printStackTrace();
}
return nowBrightnessValue;
}
/**
* 設置亮度
*
* @param activity
* @param brightness
*/
public static void setBrightness(Activity activity, int brightness) {
// Settings.System.putInt(activity.getContentResolver(),
// Settings.System.SCREEN_BRIGHTNESS_MODE,
// Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
lp.screenBrightness = Float.valueOf(brightness) * (1f / 255f);
activity.getWindow().setAttributes(lp);
}
/**
* 中止自動亮度調節
*
* @param activity
*/
public static void stopAutoBrightness(Activity activity) {
Settings.System.putInt(activity.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
}
/**
* 開啓亮度自動調節
*
* @param activity
*/
public static void startAutoBrightness(Activity activity) {
Settings.System.putInt(activity.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
}
/**
* 保存亮度設置狀態
*
* @param resolver
* @param brightness
*/
public static void saveBrightness(ContentResolver resolver, int brightness) {
Uri uri = android.provider.Settings.System
.getUriFor("screen_brightness");
android.provider.Settings.System.putInt(resolver, "screen_brightness",
brightness);
resolver.notifyChange(uri, null);
}
}複製代碼
注意以上只適用於2.1的版本。
能夠經過seekBar改變其亮度:
/**
* 使用SeekBar進行亮度控制:
*/
private void detalSeekBar() {
sSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
LogUtil.e("yuyahao","progress: "+progress);
if (progress < 10) {
} else {
messageTv.setText("activity當前亮度爲: "+progress);
ActivityUtils.setBrightness(MyShowLightDialog.this, progress);
//ll_contentView.setBackgroundResource(ContextCompat.getColor(MainActivity.this,Color.parseColor("#"+getRandColorCode()));
ll_contentView.setBackgroundColor(Color.parseColor("#"+getRandColorCode()));
}
}
});
//獲取當前亮度的位置
// int a =ActivityUtils.getScreenBrightness(this);
// sSeekBar.setProgress(a);
}複製代碼
效果圖:
github項目的地址:
若是你以爲此文對您有所幫助,歡迎入羣 QQ交流羣 :232203809
微信公衆號:終端研發部
(歡迎關注學習和交流)