- 浏览: 924536 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
Android 2.3 对关屏进行了优化,增加了一种类似于关闭电视的效果
Android系统默认使用的关屏效果是fade,要激活旧CRT效果,需要修改以下文件,关闭fade效果。
frameworks/base/core/res/res/values/config.xml
- <!-- If this is true, the screen will fade off. -->
- - < bool name = "config_animateScreenLights" > true </ bool >
- + < bool name = "config_animateScreenLights" > false </ bool >
为啥如此修改就可以激活旧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
- <pre class = "cpp" name= "code" > 131 static void Android_server_PowerManagerService_nativeStartSurfaceFlingerAnimation(JNIEnv* env,
- 132 jobject obj, jint mode) {
- 133 sp<ISurfaceComposer> 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<MessageBase> msg = new MessageTurnElectronBeamOff( this , mode);
- 2406 status_t res = postMessageSync(msg);
- 2407 if (res == NO_ERROR) {
- 2408 res = static_cast<MessageTurnElectronBeamOff*>( 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 // by the power-manager itself
- 2413 mElectronBeamAnimationMode = mode;
- 2414 }
- 2415 return res;
- 2416 }
- 2363 status_t SurfaceFlinger::turnElectronBeamOffImplLocked(int32_t mode)
- 2364 {
- 2365 DisplayHardware& hw(graphicPlane( 0 ).editDisplayHardware());
- 2366 if (!hw.canDraw()) {
- 2367 // we're already off
- 2368 return NO_ERROR;
- 2369 }
- 2370 if (mode & ISurfaceComposer::eElectronBeamAnimationOff) {
- 2371 electronBeamOffAnimationImplLocked();
- 2372 }
- 2373
- 2374 // always clear the whole screen at the end of the animation
- 2375 glClearColor( 0 , 0 , 0 , 1 );
- 2376 glDisable(GL_SCISSOR_TEST);
- 2377 glClear(GL_COLOR_BUFFER_BIT);
- 2378 glEnable(GL_SCISSOR_TEST);
- 2379 hw.flip( Region(hw.bounds()) );
- 2380
- 2381 hw.setCanDraw( false );
- 2382 return NO_ERROR;
- 2383 }
- 2073 status_t SurfaceFlinger::electronBeamOffAnimationImplLocked()
- 2074 {
- 2075 status_t result = PERMISSION_DENIED;
- 2076
- 2077 if (!GLExtensions::getInstance().haveFramebufferObject())
- 2078 return INVALID_OPERATION;
- 2079
- 2080 // get screen geometry
- 2081 const DisplayHardware& hw(graphicPlane( 0 ).displayHardware());
- 2082 const uint32_t hw_w = hw.getWidth();
- 2083 const uint32_t hw_h = hw.getHeight();
- 2084 const Region screenBounds(hw.bounds());
- 2085
- 2086 GLfloat u, v;
- 2087 GLuint tname;
- 2088 result = renderScreenToTextureLocked( 0 , &tname, &u, &v);
- 2089 if (result != NO_ERROR) {
- 2090 return result;
- 2091 }
- 2092
- 2093 GLfloat vtx[ 8 ];
- 2094 const GLfloat texCoords[ 4 ][ 2 ] = { { 0 ,v}, { 0 , 0 }, {u, 0 }, {u,v} };
- 2095 glEnable(GL_TEXTURE_2D);
- 2096 glBindTexture(GL_TEXTURE_2D, tname);
- 2097 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- 2098 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- 2099 glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- 2100 glTexCoordPointer( 2 , GL_FLOAT, 0 , texCoords);
- 2101 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- 2102 glVertexPointer( 2 , GL_FLOAT, 0 , vtx);
- 2103
- 2104 class s_curve_interpolator {
- 2105 const float nbFrames, s, v;
- 2106 public :
- 2107 s_curve_interpolator( int nbFrames, float s)
- 2108 : nbFrames( 1 .0f / (nbFrames- 1 )), s(s),
- 2109 v( 1 .0f + expf(-s + 0 .5f*s)) {
- 2110 }
- 2111 float operator()( int f) {
- 2112 const float x = f * nbFrames;
- 2113 return (( 1 .0f/( 1 .0f + expf(-x*s + 0 .5f*s))) - 0 .5f) * v + 0 .5f;
- 2114 }
- 2115 };
- 2116
- 2117 class v_stretch {
- 2118 const GLfloat hw_w, hw_h;
- 2119 public :
- 2120 v_stretch(uint32_t hw_w, uint32_t hw_h)
- 2121 : hw_w(hw_w), hw_h(hw_h) {
- 2122 }
- 2123 void operator()(GLfloat* vtx, float v) {
- 2124 const GLfloat w = hw_w + (hw_w * v);
- 2125 const GLfloat h = hw_h - (hw_h * v);
- 2126 const GLfloat x = (hw_w - w) * 0 .5f;
- 2127 const GLfloat y = (hw_h - h) * 0 .5f;
- 2128 vtx[ 0 ] = x; vtx[ 1 ] = y;
- 2129 vtx[ 2 ] = x; vtx[ 3 ] = y + h;
- 2130 vtx[ 4 ] = x + w; vtx[ 5 ] = y + h;
- 2131 vtx[ 6 ] = x + w; vtx[ 7 ] = y;
- 2132 }
- 2133 };
- 2134
- 2135 class h_stretch {
- 2136 const GLfloat hw_w, hw_h;
- 2137 public :
- 2138 h_stretch(uint32_t hw_w, uint32_t hw_h)
- 2139 : hw_w(hw_w), hw_h(hw_h) {
- 2140 }
- 2141 void operator()(GLfloat* vtx, float v) {
- 2142 const GLfloat w = hw_w - (hw_w * v);
- 2143 const GLfloat h = 1 .0f;
- 2144 const GLfloat x = (hw_w - w) * 0 .5f;
- 2145 const GLfloat y = (hw_h - h) * 0 .5f;
- 2146 vtx[ 0 ] = x; vtx[ 1 ] = y;
- 2147 vtx[ 2 ] = x; vtx[ 3 ] = y + h;
- 2148 vtx[ 4 ] = x + w; vtx[ 5 ] = y + h;
- 2149 vtx[ 6 ] = x + w; vtx[ 7 ] = y;
- 2150 }
- 2151 };
- 2152
- 2153 // the full animation is 24 frames
- 2154 const int nbFrames = 12 ;
- 2155 s_curve_interpolator itr(nbFrames, 7 .5f);
- 2156 s_curve_interpolator itg(nbFrames, 8 .0f);
- 2157 s_curve_interpolator itb(nbFrames, 8 .5f);
- 2158
- 2159 v_stretch vverts(hw_w, hw_h);
- 2160 glEnable(GL_BLEND);
- 2161 glBlendFunc(GL_ONE, GL_ONE);
- 2162 for ( int i= 0 ; i<nbFrames ; i++) {
- 2163 float x, y, w, h;
- 2164 const float vr = itr(i);
- 2165 const float vg = itg(i);
- 2166 const float vb = itb(i);
- 2167
- 2168 // clear screen
- 2169 glColorMask( 1 , 1 , 1 , 1 );
- 2170 glClear(GL_COLOR_BUFFER_BIT);
- 2171 glEnable(GL_TEXTURE_2D);
- 2172
- 2173 // draw the red plane
- 2174 vverts(vtx, vr);
- 2175 glColorMask( 1 , 0 , 0 , 1 );
- 2176 glDrawArrays(GL_TRIANGLE_FAN, 0 , 4 );
- 2177
- 2178 // draw the green plane
- 2179 vverts(vtx, vg);
- 2180 glColorMask( 0 , 1 , 0 , 1 );
- 2181 glDrawArrays(GL_TRIANGLE_FAN, 0 , 4 );
- 2182
- 2183 // draw the blue plane
- 2184 vverts(vtx, vb);
- 2185 glColorMask( 0 , 0 , 1 , 1 );
- 2186 glDrawArrays(GL_TRIANGLE_FAN, 0 , 4 );
- 2187
- 2188 // draw the white highlight (we use the last vertices)
- 2189 glDisable(GL_TEXTURE_2D);
- 2190 glColorMask( 1 , 1 , 1 , 1 );
- 2191 glColor4f(vg, vg, vg, 1 );
- 2192 glDrawArrays(GL_TRIANGLE_FAN, 0 , 4 );
- 2193 hw.flip(screenBounds);
- 2194 }
- 2195
- 2196 h_stretch hverts(hw_w, hw_h);
- 2197 glDisable(GL_BLEND);
- 2198 glDisable(GL_TEXTURE_2D);
- 2199 glColorMask( 1 , 1 , 1 , 1 );
- 2200 for ( int i= 0 ; i<nbFrames ; i++) {
- 2201 const float v = itg(i);
- 2202 hverts(vtx, v);
- 2203 glClear(GL_COLOR_BUFFER_BIT);
- 2204 glColor4f( 1 -v, 1 -v, 1 -v, 1 );
- 2205 glDrawArrays(GL_TRIANGLE_FAN, 0 , 4 );
- 2206 hw.flip(screenBounds);
- 2207 }
- 2208
- 2209 glColorMask( 1 , 1 , 1 , 1 );
- 2210 glEnable(GL_SCISSOR_TEST);
- 2211 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- 2212 glDeleteTextures( 1 , &tname);
- 2213 return NO_ERROR;
- 2214 }
- 2215
OK,看完代码回来,首先是PowerManagerService.java中
mAnimationSetting如果标记为ANIM_SETTING_OFF,则打开旧CRT动画。
下面关屏动作run()中,因为我们将config_animateScreenLights置为false,因此mAnimateScreenLights为fasle
分支进入else,执行nativeStartSurfaceFlingerAnimation()函数。
nativeStartSurfaceFlingerAnimation()函数是一个JNI调用,在com_Android_server_PowerManagerService.cpp文件中,
对应surfaceflinger的s->turnElectronBeamOff(mode)函数。
好的,现在跳入SurfaceFlinger.cpp函数,具体调用顺序是:
turnElectronBeamOff()
|
turnElectronBeamOffImplLocked()
|
electronBeamOffAnimationImplLocked()
electronBeamOffAnimationImplLocked()函数将调用openGL绘值旧CRT关屏效果,大概有24帧。
当然,该函数有许多限制,不符合就会半途退出,你就看不到动画效果啦。
发表评论
-
Android systrace
2018-09-12 11:13 1039Understanding Systrace Caution: ... -
Android simpleperf
2018-09-12 11:02 1953Introduction of simpleperf What ... -
Android selinux安全策略
2016-06-21 17:16 4112基础知识 SEAndroid在架构和机制上与SELinux完 ... -
Android wifi captive portal 验证
2016-02-23 20:38 5203只要是国内的用户,基本上刷完5.0版本后如果没挂上V P N, ... -
Android CTS windows环境下测试
2015-09-08 11:36 6460Windows下CTS测试步骤 1.获 ... -
Android 之 日期时间 时区同步
2015-05-13 15:47 6376系统设置--日期和时间-- ... -
虚拟按键 振动效果
2015-05-12 11:50 2129[DESCRIPTION] Setting->情景模式- ... -
Android 签名信息读取
2014-08-22 17:32 1386public void getSingInfo() { ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 10004一、一个BUG引发的问题 ... -
Android 多语言 多地区对应表
2014-05-13 17:09 2153Arabic, Egypt (ar_EG) Arabic, ... -
Android emulated sdcard
2013-08-12 21:46 6172如果要添加 emulated sdcard ,需要一下几个 ... -
#if、#ifdef、#if defined之间的区别
2013-05-17 15:19 58475#if的使用说明 #if的后面接的是表达式 #if ( ... -
Android 动态库死机调试方法
2013-03-05 13:54 4877android系统中调试Java非常容易,一般遇到错误都在 ... -
Android sqlite3 详解
2012-09-13 22:13 2409SQLite库包含一个名字叫做sqlite3的命令行,它可以让 ... -
Android 多语言开发
2012-08-16 18:37 2409第一部分 多语言定制的机制 1、ICU4C简介 ICU4 ... -
Android 添加底层核心服务
2012-06-04 10:52 5819为 Android添加底层核 ... -
Android 之响应的系统设置的事件
2012-05-24 18:17 19811、Configuration类专门用于描述手机设备上的配置信 ... -
android编译dex-preopt
2012-05-11 18:48 5444对于android2.3编译时候选择下面的情况,既可以对dex ... -
Android 移动终端camera 防偷*拍设置
2012-04-26 10:35 1897目前市面上的所有移动终端几乎都有camera应用,但andro ... -
Android 浏览器设置中的搜索引擎
2012-04-16 16:37 4682更改浏览器设置中的搜索引擎 1. 需求 将浏览器设 ...
相关推荐
"CRT锁屏效果"是这个ROM的一个特色功能,它模仿了老式阴极射线管(CRT)电视或显示器关闭时的动画效果,为用户带来复古而酷炫的视觉体验。 首先,让我们来了解一下什么是CRT。CRT全称为Cathode Ray Tube,即阴极...
crt.Screen.Synchronous = True do while file1.AtEndOfStream <> True '读取每一行 line = file1.ReadLine '分割IP,用户名,密码 特权密码 型号简写(z m h b) 位置 params = Split (line) ip = ...
《厦华CRT电视机总线数据大全》是一份包含两百多条详细信息的资源集合,主要针对厦华品牌的老式CRT(阴极射线管)电视机。这份资料集的珍贵之处在于它提供了丰富的总线数据,这对于电视维修人员、电子工程师以及对...
【LCD与CRT电视显示器测试方法比较】 LCD(液晶显示器)和CRT(阴极射线管)电视显示器在显示技术和测试方法上有显著的区别。CRT显示器基于电子束扫描技术,利用荫罩选择颜色,通过改变电子枪发射的电子束强度来...
液晶背投电视与CRT背投电视是两种不同的电视技术,它们在显示原理、画质、能耗、体积和寿命等方面有着显著的区别。 首先,CRT(阴极射线管)背投电视的工作原理基于传统的显像管技术,类似于29寸以下的普通CRT电视...
电视产业的发展历程是一个充满技术创新和竞争的领域,从最初的CRT技术到现代的激光电视,每一步都代表着显示技术的进步和人们对视觉体验的追求。本文主要分析了电视技术的几个重要阶段,包括CRT、LCD、等离子、OLED...
在电子行业中,CRT(阴极射线管)投影电视是一种早期的大屏幕显示技术,它利用电子束轰击荧光屏来产生图像。然而,这种技术存在一个常见的问题,即在电视关闭后,屏幕上可能会留下一些亮点,这被称为关机亮点。这个...
【标题】:“CRT电视机显示器切割装置” 在信息技术领域,CRT(Cathode Ray Tube)电视机显示器是一种使用阴极射线管作为显示元件的传统电视技术。这个压缩包文件“CRT电视机显示器切割装置.zip”可能包含了一份...
Crt工具破解版 这个很好的串口 和服务器工具 使用起来方便 免安装版本
在电子行业中,CRT(阴极射线管)背投电视机是一种早期的大屏幕显示技术,它通过将图像投影到一个大型的CRT屏幕上,再反射到观众眼前,以实现大画面显示。这种技术在20世纪90年代至21世纪初非常流行。然而,由于其...
创自CRT-310是一款专业级别的开发工具,主要用于软件开发和系统集成。这个开发文档包含了一系列的关键元素,如动态库、代码示例和详细说明文档,为开发者提供了全面的指导,帮助他们理解和利用CRT-310的功能来构建...
CRT电视和液晶电视作为两种不同技术的电视产品,其工作原理、构造及保养方式各有不同。在日常使用中,注意以下几点,能够帮助延长这两种电视的使用寿命。 对于CRT电视(即阴极射线管电视)而言: 1. 不要让荧光屏...
在 CRT 背投电视机中,这些组件需要与显像管、扫描系统和其他电子部件紧密协同工作,以达到最佳效果。 在 CRT 技术逐渐被 LCD 和 LED 等平板显示技术取代的今天,色度不均匀矫正装置仍然是提高 CRT 显示设备性能的...
CRT电视机,全称为Cathode Ray Tube Television,是传统电视技术的一种,它的核心部分是一个阴极射线管。这种技术自20世纪初发展以来,历经了多次改进,成为电视机历史上的重要里程碑。本文件“行业分类-电子-CRT...
在数字化时代,老式的CRT(阴极射线管)显示器已经成为历史,但它们独特的显示效果仍然受到一部分用户的喜爱。SuperCRT是一款强大的CRT显示器模拟器,它允许用户在现代计算机上重现那些经典的显示器效果。这款软件...
在电子行业中,CRT电视前壳是电视机的重要组成部分,它的设计和功能对于整台电视机的外观、性能以及用户体验都有着显著的影响。 CRT(Cathode Ray Tube)即阴极射线管,是传统电视的核心显示技术。这份名为“行业...
CRT,全称是Cathode Ray Tube,即阴极射线管,是早期电视和电脑显示器中广泛使用的显示技术。在数字设备中,"CRT关屏特效"指的是模拟老式CRT显示器关闭时那种逐渐消失的光线效果,为用户提供一种怀旧的体验。 ...
"CRT批量添加会话" CRT(SecureCRT)是一款功能强大的终端仿真器,可以连接到多种类型的设备和服务器,但是在管理大量设备时,添加会话表的工作变得非常痛苦。为了解决这个问题,本文将介绍如何使用CRT快速添加会话...
《行业资料-电子功用-具有三维全息屏幕和平衡CRT驱动的中心蓝色CRT的投影电视的说明分析》 本文将深入探讨一种先进的投影电视技术,它结合了三维全息屏幕和平衡CRT(阴极射线管)驱动,为观众带来了前所未有的视听...
在电子行业中,CRT(Cathode Ray Tube,阴极射线管)电视机是早期主流的显示设备,其工作原理依赖于一个内部复杂的显像管。本文将深入探讨 CRT 类电视机的显像管保护电路,旨在提供对这一重要系统组件的理解和分析。...