Android系统默认使用的关屏效果是fade,要激活旧CRT效果,需要修改以下文件,关闭fade效果。
frameworks/base/core/res/res/values/config.xml
- true
+ false
为啥如此修改就可以激活旧CRT效果,让我们跟踪下代码,先贴上相关代码:
frameworks\base\services\java\com\android\server\PowerManagerService.java
475 mAnimationSetting = 0;
476 if (windowScale > 0.5f) {
477 mAnimationSetting |= ANIM_SETTING_OFF;
478 }
2284 public void run() {
2285 if (mAnimateScreenLights) {
2286 synchronized (mLocks) {
2287 long now = SystemClock.uptimeMillis();
2288 boolean more = mScreenBrightness.stepLocked();
2289 if (more) {
2290 mScreenOffHandler.postAtTime(this, now+(1000/60));
2291 }
2292 }
2293 } else {
2294 synchronized (mLocks) {
2295 // we're turning off
2296 final boolean animate = animating && targetValue == Power.BRIGHTNESS_OFF;
2297 if (animate) {
2298 // It's pretty scary to hold mLocks for this long, and we should
2299 // redesign this, but it works for now.
2300 nativeStartSurfaceFlingerAnimation(
2301 mScreenOffReason == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR
2302 0 : mAnimationSetting);
2303 }
2304 mScreenBrightness.jumpToTargetLocked();
2305 }
2306 }
2307 }
2308 }
frameworks/base/services/jni/com_android_server_PowerManagerService.cpp
131 static void android_server_PowerManagerService_nativeStartSurfaceFlingerAnimation(JNIEnv* env,
132 jobject obj, jint mode) {
133 sp s(ComposerService::getComposerService());
134 s->turnElectronBeamOff(mode);
135 }
frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp
2385 status_t SurfaceFlinger::turnElectronBeamOff(int32_t mode)
2386 {
2387 class MessageTurnElectronBeamOff : public MessageBase {
2388 SurfaceFlinger* flinger;
2389 int32_t mode;
2390 status_t result;
2391 public:
2392 MessageTurnElectronBeamOff(SurfaceFlinger* flinger, int32_t mode)
2393 : flinger(flinger), mode(mode), result(PERMISSION_DENIED) {
2394 }
2395 status_t getResult() const {
2396 return result;
2397 }
2398 virtual bool handler() {
2399 Mutex::Autolock _l(flinger->mStateLock);
2400 result = flinger->turnElectronBeamOffImplLocked(mode);
2401 return true;
2402 }
2403 };
2404
2405 sp msg = new MessageTurnElectronBeamOff(this, mode);
2406 status_t res = postMessageSync(msg);
2407 if (res == NO_ERROR) {
2408 res = static_cast( msg.get() )->getResult();
2409
2410 // work-around: when the power-manager calls us we activate the
2411 // animation. eventually, the "on" animation will be called
2412