今天在学习鸿洋大神的博客的时候看到了相关文章,于是动手实现了一下;
当在特殊的某一个日子,我们会表达我们的悼念之情,APP会在某一日设置成黑灰色:
实现:
//设置整个APP的所有活动页面变为黑白色;屏蔽掉色彩,特殊节日需要用到;
private void initGrayScreen(){
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
paint.setColorFilter(new ColorMatrixColorFilter(cm));
getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE, paint);
}
我想很多的网上提示都是这段代码;那么我也没有必要再来记录这篇博客了;
我们知道把这段代码放在自己定义的基础类BaseActivity里面就OK了,通过一个值进行判断是否显示灰黑色:
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置活动页面的布局;
setContentView(getLayoutId());
//实例化MVP中的P用来连接控制Model与View;
initPresenter();
//初始化控件,一般在BaseActivity中通过ButterKnife来绑定,所以该方法内部一般我们初始化界面相关的操作
initViews();
//获取数据
getDataFromServer();
if(MyApplication.getSpecialDay() != 0){
//所有界面变成灰色
initGrayScreen();
}
}
//设置整个APP的所有活动页面变为黑白色;屏蔽掉色彩,特殊节日需要用到;
private void initGrayScreen(){
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
paint.setColorFilter(new ColorMatrixColorFilter(cm));
getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE, paint);
}
}
可是我们怎么从接口中获取到这个值并在用户打开APP之前完成所有页面的黑灰初始化?
经过多次试验,我把网络请求的接口放在了欢迎页中进行;
或许这样会造成耗时,但是我们只获取一个值,感觉耗时并不会特别严重,而浪费个十几毫秒并不影响用户的体验;
如果说我们在进入页面再进行请求就会发生各种各样的问题;因为如果一旦进入页面了,所有的Activity都已经是继承了BaseActivity的,我们还没有完成里面方法的设置;
public class WelcomeActivity extends AppCompatActivity {
//获取数据的Manager管理类实例 进行请求数据操作
private DataManager dataManager;
//获取到的book数据对象
private Book mBook;
//构造函数,实例化网络请求的单例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
dataManager = DataManager.getInstance();
dataManager.getSpceialDay("11","22")
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(@NonNull Disposable disposable) throws Exception {
//请求加入管理,统一管理订阅,防止内存泄露
//addDisposable(disposable);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Book>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Book book) {
mBook = book;
}
// 此处注意:onComplete和onError只会调用其中一个,不可能同时被触发
@Override
public void onError(@NonNull Throwable e) {
// 在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出
Log.d("22ss", e.toString());
e.printStackTrace();
//getMvpView().onError("请求失败!!");
//getMvpView().hideProgressDialog();
}
@Override
public void onComplete() {
// onComplete方法和onError方法是互斥的,
// RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。
Log.d("22ss", "onComplete");
/*if (mBook != null){setSpecialDay
getMvpView().onSuccess(mBook);
}*/
//这里进行全局值设置,在BaseActivity中进行判断;
MyApplication.setSpecialDay(mBook.getCount());
Logger.e("welecome");
// 隐藏进度
//getMvpView().hideProgressDialog();
}
});
//接受这个APP的广播;
Handler handler = new Handler();
//延迟2000毫秒执行的线程; 启动主页面;
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(WelcomeActivity.this, BookActivity.class);
startActivity(intent);
//防止首页点返回键,跳回到欢迎界面;
finish();
}
}, 2000);
}
}
不知道大厂都是怎么实现的,小白我只能自己摸索了~