更改代碼如下:
- frameworks\base\policy\src\com\android\internal\policy\impl\KeyguardViewManager.java.
-
- android2.3.4_GB_T34H\frameworks\base\core\java\android\content\res\CompatibilityInfo.java
- diff --git a/phone/com/android/internal/policy/impl/KeyguardViewManager.java b/phone/com/android/internal/policy/impl/KeyguardViewManager.java
- index ba1d7f5..38bf161 100644
- --- a/phone/com/android/internal/policy/impl/KeyguardViewManager.java
- +++ b/phone/com/android/internal/policy/impl/KeyguardViewManager.java
- @@ -28,6 +28,8 @@ import android.view.ViewGroup;
- import android.view.ViewManager;
- import android.view.WindowManager;
- import android.widget.FrameLayout;
- +import android.view.Display;
- +import android.util.DisplayMetrics;
-
- /**
- * Manages creating, showing, hiding and resetting the keyguard. Calls back
- @@ -97,9 +99,21 @@ public class KeyguardViewManager implements KeyguardWindowController {
- if (mKeyguardHost == null) {
- if (DEBUG) Log.d(TAG, "keyguard host is null, creating it...");
-
- + WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
- + DisplayMetrics dm = new DisplayMetrics();
- + wm.getDefaultDisplay().getMetrics(dm);
- + Display display = wm.getDefaultDisplay();
- +
- + int statusBarHeight = (int)Math.ceil( 25 * dm.density);
- + int height = display.getHeight();
- + int width = display.getWidth();
- +
- + Log.i(TAG, "Display width = " + width);
- + Log.i(TAG, "Display height = " + height);
- + Log.i(TAG, "Statusbar height = " + statusBarHeight);
- +
- mKeyguardHost = new KeyguardViewHost(mContext, mCallback);
-
- - final int stretch = ViewGroup.LayoutParams.MATCH_PARENT;
- int flags = WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
- | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER
- | WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING
- @@ -109,7 +123,7 @@ public class KeyguardViewManager implements KeyguardWindowController {
- flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
- }
- WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
- - stretch, stretch, WindowManager.LayoutParams.TYPE_KEYGUARD,
- + width, (height - statusBarHeight), WindowManager.LayoutParams.TYPE_KEYGUARD,
- flags, PixelFormat.TRANSLUCENT);
- lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;
- lp.windowAnimations = com.android.internal.R.style.Animation_LockScreen;
解法二:這個(gè)方法解了我們的問(wèn)題,測試這么長(cháng)時(shí)間還沒(méi)出現問(wèn)題:(推薦)
1,android2.3.4_GB_T34H\frameworks\base\core\java\android\content\res
修改 frameworks/base/core/java/android/content/res/CompatibilityInfo.java中的如下部分:
- public static void updateCompatibleScreenFrame(DisplayMetrics dm, int orientation,
- Rect outRect) {
- int width = dm.widthPixels;
- int portraitHeight = (int) (DEFAULT_PORTRAIT_HEIGHT * dm.density + 0.5f);
- int portraitWidth = (int) (DEFAULT_PORTRAIT_WIDTH * dm.density + 0.5f);
- if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
- int xOffset = (width - portraitHeight) / 2 ;
- outRect.set(xOffset, 0, xOffset + portraitHeight, portraitWidth);
- } else {
- int xOffset = (width - portraitWidth) / 2 ;
- outRect.set(xOffset, 0, xOffset + portraitWidth, portraitHeight);
- }
把上面這段程序改為下面這一段程序:
==》
public static voidupdateCompatibleScreenFrame(DisplayMetrics dm, int orientation,
Rect outRect) {
int width = dm.widthPixels;
int portraitHeight = (int)(DEFAULT_PORTRAIT_HEIGHT * dm.density + 0.5f);
int portraitWidth = (int)(DEFAULT_PORTRAIT_WIDTH * dm.density + 0.5f);
if (orientation ==Configuration.ORIENTATION_LANDSCAPE) {
int xOffset = (width -portraitHeight) / 2 ;
+ outRect.set(0, 0, 0 + dm.widthPixels,dm.heightPixels); //新加入代碼
- outRect.set(xOffset, 0, xOffset +portraitHeight, portraitWidth); //刪除原來(lái)代碼部分
} else
{
int xOffset = (width -portraitWidth) / 2 ;
+ outRect.set(0, 0, 0 +dm.widthPixels, dm.heightPixels); //新加入代碼
- outRect.set(xOffset, 0, xOffset + portraitWidth, portraitHeight); //刪除代碼部分
}
}
紅色部分是我們改動(dòng)的代碼,“-“ 是我們去除原始代碼:
frameworks/base/core/java/android/content/res/CompatibilityInfo.java這里面,DEFAULT_PORTRAIT_HEIGHT /DEFAULT_PORTRAIT_WIDTH 這兩個(gè)值比較重要。
打印出一些值,下面分析:
- dm.density = 1.5
- portraitHeight = 720
- portraitWidth = 480
-
- dm.widthPixels = 1024
- dm.heightPixels= 600
- width = dm.widthPixels
其實(shí)出現偏移的原因是:
假設橫屏:
不正常情況下分析 :
xOffset = (width - portraitHeight) / 2= (1024-720)/ 2 = 152
所在在程序中原來(lái)的代碼是
outRect.set(xOffset, 0, xOffset + portraitHeight, portraitWidth);//原始代碼
outRect.set(152, 0, 152+ 720, 480);
xOffset 所以有了左右的偏移,如下圖所示:
改動(dòng)后,正常情況下分析:
改動(dòng)后計算:
outRect.set(0, 0, 0 + dm.widthPixels, dm.heightPixels);
outRect.set(0, 0, 0 + 1024, 600);