经常玩喜马拉雅FM的app,看到它的夜间模式的实现和其他的都不一样,仅仅是通过改变屏幕的亮度来实现。感觉这种方式比起换肤来说更加简洁。
实现思路:
1.在程序入口后的第一个Activity中:
(1)获取系统当前的亮度
(2)保存系统当前的亮度
(3)如果系统打开了自动调节亮度则关闭,并记录
2.在有夜间模式开关的界面中:
(1)初始化开关后,先判断之前开关的状态,修改对应的UI
(2)处理点击开关的逻辑,如果是开的状态(夜间模式),设置系统亮度为夜间亮度(具体值自己看情况设置,一般25左右),之后保存开关状态;如果是关闭状态(白天模式),取出之前保存的系统亮度,并删除保存的夜间模式状态。
3.必须有一个BaseActivity,在onstart方法中,判断夜间模式是否被选中,如果被选中则设置为夜间模式的亮度值。
4.在退出App的时候,还原系统之前的亮度设置。
注意:
必须要加权限 <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
(Android6.0以上需要加动态权限)
UI界面:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#fff"
android:id="@+id/rl_jump"
>
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="20dp"
android:src="@mipmap/icon_night"
/>
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="20dp"
android:layout_toEndOf="@id/iv_icon"
android:text="夜间模式"
/>
<Switch
android:id="@+id/switch_night_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="10dp"
/>
</RelativeLayout>
BaseActivity
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
//判断夜间模式是否被选中
boolean isChecked = PrefUtil.getBoolean(this, "isChecked", false);
//如果被选中
if (isChecked) {
//设置为夜间模式的亮度值
ScreenUtils.setBrightness(this, Constants.BRIGHT_VALUE);
}
}
}
SplashActivity
public class SplashActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
@Override
protected void onStart() {
super.onStart();
//获取系统当前的亮度
int systemBrightness = ScreenUtils.getSystemBrightness(this);
//保存系统当前的亮度
PrefUtil.putInt(this, "systemBrightness", systemBrightness);
//如果系统打开了自动调节亮度则关闭
if (ScreenUtils.isAutoBrightness(getContentResolver())) {
//记录系统打开了自动亮度
PrefUtil.putBoolean(this,"isAuto",true);
//关闭
ScreenUtils.closeAutoBrightness(this);
}
}
}
MainActivity
public class MainActivity extends BaseActivity implements CompoundButton.OnCheckedChangeListener {
private Switch mSwitch;
@Override
public void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView() {
mSwitch = (Switch) findViewById(R.id.switch_night_mode);
//先判断一下是否是夜间模式,如果是,修改ui为夜间
boolean isChecked = PrefUtil.getBoolean(this, "isChecked", false);
if (isChecked) {
mSwitch.setChecked(true);
}
mSwitch.setOnCheckedChangeListener(this);
RelativeLayout rlJump = (RelativeLayout) findViewById(R.id.rl_jump);
rlJump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this,SecondActivity.class));
finish();
}
});
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if (isChecked) {
ScreenUtils.setBrightness(this, Constants.BRIGHT_VALUE);
//如果为夜间模式,则保存状态
PrefUtil.putBoolean(this, "isChecked", isChecked);
} else {
//白天模式需要取出系统的亮度
ScreenUtils.setBrightness(this, PrefUtil.getInt(this, "systemBrightness", 124));
//如果为白天模式,则删除保存的夜间模式
PrefUtil.remove(this, "isChecked");
}
}
}
SecondActivity(里面只有一个退出程序的按钮,用来退出app)
public class SecondActivity extends BaseActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
public void loginOut(View view) {
//如果进入app之前系统是自动调节亮度模式
if (PrefUtil.getBoolean(this, "isAuto", false)) {
//打开
ScreenUtils.openAutoBrightness(this);
} else {
//如果之前不是自动调节亮度模式,则调节为之前的亮度
ScreenUtils.setBrightness(this, PrefUtil.getInt(this, "systemBrightness", 124));
}
android.os.Process.killProcess(android.os.Process.myPid());
}
}
ScreenUtil(重要的工具类)
public class ScreenUtils {
/**
* 获取当前系统亮度
* <br>获取失败返回-1,获取成功返回正常非负数<br>
* @param context
* @return
*/
public static int getSystemBrightness(Context context) {
int brightnessValue = -1;
try {
brightnessValue = Settings.System.
getInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
} catch (Exception e) {
e.printStackTrace();
}
return brightnessValue;
}
/**
* 是否打开自动调节亮度
* @param contentResolver
* @return
*/
public static boolean isAutoBrightness(ContentResolver contentResolver) {
boolean autoBrightness = false;
try {
autoBrightness
= Settings.System.getInt(contentResolver,
Settings.System.SCREEN_BRIGHTNESS_MODE)
== Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
} catch (Exception e) {
e.printStackTrace();
}
return autoBrightness;
}
/**
* 停止自动调节亮度
* @param activity
*/
public static void closeAutoBrightness(Activity activity) {
Settings.System.putInt(activity.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
}
/**
* 开启自动调节亮度
* @param activity
*/
public static void openAutoBrightness(Activity activity) {
Settings.System.putInt(activity.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
}
// 改变屏幕亮度
public static void setBrightness(Activity activity, int brightValue) {
WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
lp.screenBrightness = (brightValue <= 0 ? -1.0f : brightValue / 255f);
activity.getWindow().setAttributes(lp);
}
}
PrefUtil(sp工具类)
public class PrefUtil {
public static final String PREF_NAME = "config";
public static void putBoolean(Context ctx, String key, boolean value) {
SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
sp.edit().putBoolean(key, value).commit();
}
public static boolean getBoolean(Context ctx, String key, boolean defValue) {
SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
return sp.getBoolean(key, defValue);
}
public static void putInt(Context ctx, String key, int value) {
SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
sp.edit().putInt(key, value).commit();
}
public static int getInt(Context ctx, String key, int defValue) {
SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
return sp.getInt(key, defValue);
}
//删除某个key
public static void remove(Context ctx, String key) {
SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
sp.edit().remove(key).commit();
}
}
Constants(全局的常量)
public class Constants {
public static final int BRIGHT_VALUE =20;
}