夜间模式(模仿喜马拉雅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>
BaseActivitypublic 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); } }}
SplashActivitypublic 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); } }}
MainActivitypublic 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;}
阅读全文
1 0
- 夜间模式(模仿喜马拉雅FM)
- 模仿喜马拉雅
- 【android】喜马拉雅FM sdk使用
- 高仿喜马拉雅FM(第一弹)
- 高仿喜马拉雅FM(第二弹)
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- 夜间模式
- linux 6.8安装
- 编程检验ASCII码值与字符对应关系 P11
- Linux下zookeeper集群安装配置
- iOS 自定义代码块的位置
- 电脑相关知识
- 夜间模式(模仿喜马拉雅FM)
- 网页长时间不操作自动回到登陆页面
- 电商网站的支付接入该怎么做呢
- 【Apache】log4j
- SQL server 2008 数据库企业版安装教程图解
- 正则表达式一
- CentOS7网络开机启动
- var与const与let之间的区别
- linux 抓包命令