由于平板的界面可以自由的旋转,假设默认的lcd是横屏的,旋转到竖屏时,关机动画会先切换到横屏,
然后显示动画。出现了一瞬间界面只有一半的情况,这可能是Android本身的bug。这里的解决方法是当竖
屏的时候,不要切换到横屏显示动画,直接竖屏刷图(并将横屏时的图片旋转90进行显示)。
相应的修改如下
Index: vendor/qcom/proprietary/qrdplus/Extension/apps/PowerOffHandler/PowerOffHandler.cpp
===================================================================
--- vendor/qcom/proprietary/qrdplus/Extension/apps/PowerOffHandler/PowerOffHandler.cpp (revision 103)
+++ vendor/qcom/proprietary/qrdplus/Extension/apps/PowerOffHandler/PowerOffHandler.cpp (working copy)
@@ -22,7 +22,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+//http://blog.csdn.net/baidu_31872269/article/details/53229342
+//http://blog.csdn.net/beibei_hao_csdn/article/details/53259814
#define LOG_NDEBUG 0
#define LOG_TAG "PowerOffHandler"
@@ -209,6 +210,56 @@
return NO_ERROR;
}
+
+// 顺时针 90 度
+static int RotationRight90(unsigned char * src, int srcW, int srcH, int channel)
+{
+ int i = 0;
+ int j = 0;
+ int k = 0;
+ unsigned char * tempSrc = NULL;
+ int mSize = srcW * srcH * channel;
+ tempSrc = (unsigned char *)malloc(sizeof(char) * srcW * srcH * channel);
+ memcpy(tempSrc, src, mSize);
+ for(i = 0; i <=srcH-1 ; i ++)
+ {
+ for(j = 0; j < srcW; j ++)
+ {
+ for(k = 0; k < channel; k ++)
+ {
+ src[((j) * srcH + (srcH - 1 - i)) * channel + k]=tempSrc[(i * srcW + j) * channel + k];
+ }
+ }
+ }
+ free(tempSrc);
+ return 0;
+}
+
+
+// 逆时针90度
+int RotationLeft90(unsigned char * src, int srcW, int srcH, int channel)
+{
+ int i = 0;
+ int j = 0;
+ int k = 0;
+ unsigned char * tempSrc = NULL;
+ int mSize = srcW * srcH * channel;
+ tempSrc = (unsigned char *)malloc(sizeof(char) * srcW * srcH * channel);
+ memcpy(tempSrc, src, mSize);
+ for(i = srcH - 1; i >= 0; i --)
+ {
+ for(j = 0; j < srcW; j ++)
+ {
+ for(k = 0; k < channel; k ++)
+ {
+ src[((srcW-1-j)*srcH + i)* channel + k] = tempSrc[(i * srcW + j) * channel + k];
+ }
+ }
+ }
+ return 0;
+}
+
+
status_t PowerOffHandler::initTexture(const Animation::Frame& frame) {
SkBitmap bitmap;
SkMemoryStream stream(frame.map->getDataPtr(), frame.map->getDataLength());
@@ -229,9 +280,20 @@
// bitmap will go out of scope when we return from this method.
bitmap.lockPixels();
- const int w = bitmap.width();
- const int h = bitmap.height();
+ int w = bitmap.width();
+ int h = bitmap.height();
const void* p = bitmap.getPixels();
+ if((screenstatus==1)||(screenstatus==3))
+ {
+ if(screenstatus==1)
+ RotationLeft90((unsigned char *)p,w,h,4);
+ if(screenstatus==3)
+ RotationRight90((unsigned char *)p,w,h,4);
+ int tmp;
+ tmp=w;
+ w=h;
+ h=tmp;
+ }
GLint crop[4] = { 0, h, w, -h };
int tw = 1 << (31 - __builtin_clz(w));
@@ -270,7 +332,6 @@
}
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
-
return NO_ERROR;
}
@@ -289,13 +350,18 @@
char value[PROPERTY_VALUE_MAX];
property_get("persist.panel.orientation", value, "0");
int orient = atoi(value) / 90;
- if (orient == eOrientation90 || orient == eOrientation270) {
+ //if (orient == eOrientation90 || orient == eOrientation270) {
+ if((dinfo.orientation==1)||(dinfo.orientation==3)){
int temp = dinfo.h;
dinfo.h = dinfo.w;
dinfo.w = temp;
+ screenstatus=dinfo.orientation;
}
+
Rect destRect(dinfo.w, dinfo.h);
- mSession->setDisplayProjection(dtoken, orient, destRect, destRect);
+ if((dinfo.orientation==0)||(dinfo.orientation==2)){
+ mSession->setDisplayProjection(dtoken, orient, destRect, destRect);
+ }
// create the native surface
sp < SurfaceControl > control = session()->createSurface(
String8("BootAnimation"), dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
@@ -344,7 +410,6 @@
// instead of system predefined boot animation files.
bool encryptedAnimation = atoi(decrypt) != 0
|| !strcmp("trigger_restart_min_framework", decrypt);
-
ZipFileRO* zipFile = NULL;
if ((encryptedAnimation
&& (access(getShutDownAnimationFileName(IMG_ENC), R_OK) == 0)
@@ -465,8 +530,16 @@
char pathType;
if (sscanf(l, "%d %d %d", &width, &height, &fps) == 3) {
// ALOGD("> w=%d, h=%d, fps=%d", width, height, fps);
- animation.width = width;
- animation.height = height;
+ if((screenstatus==1)||(screenstatus==3))
+ {
+ animation.width = height;
+ animation.height = width;
+ }
+ else
+ {
+ animation.width = width;
+ animation.height = height;
+ }
animation.fps = fps;
} else if (sscanf(l, " %c %d %d %s #%6s", &pathType, &count, &pause,
path, color) >= 4) {
另外如果关机的过程中,转动屏幕,界面也会相应的翻转过来,这里只需要不响应重力传感器的动作即可。
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
找到updateRotationUncheckedLocked方法,加上
if(SystemService.isRunning("poweroffhandler")) {
return false;
}
这里的关机服务是poweroffhandler,有的是bootanim,注意修改。