夜间模式(模仿喜马拉雅FM)

来源:互联网 发布:批量检测未注册域名 编辑:程序博客网 时间:2024/05/16 06:10

经常玩喜马拉雅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;}