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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值