android 7 keyguard,android keyguard锁屏程序不能全屏显示

本文探讨了在Android 2.3.4版本中针对KeyguardViewManager.java和CompatibilityInfo.java的代码更改,以解决屏幕适配问题。主要修改涉及计算状态栏高度、屏幕宽度和高度,以及调整布局参数,避免横屏显示时的偏移。通过对比原始代码和修改后的代码,分析了问题的原因并提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更改代码如下:

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;

解法二:这个方法解了我们的问题,测试这么长时间还没出现问题:(推荐)

1,android2.3.4_GB_T34H\frameworks\base\core\java\android\content\res

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);   //删除原来代码部分

} else

{

int xOffset = (width -portraitWidth) / 2 ;

+ outRect.set(0, 0, 0 +dm.widthPixels, dm.heightPixels);     //新加入代码

- outRect.set(xOffset, 0, xOffset + portraitWidth, portraitHeight);   //删除代码部分

}

}

红色部分是我们改动的代码,“-“ 是我们去除原始代码:

frameworks/base/core/java/android/content/res/CompatibilityInfo.java这里面,DEFAULT_PORTRAIT_HEIGHT /DEFAULT_PORTRAIT_WIDTH 这两个值比较重要。

打印出一些值,下面分析:

dm.density = 1.5

portraitHeight = 720

portraitWidth = 480

dm.widthPixels = 1024

dm.heightPixels= 600

width = dm.widthPixels

其实出现偏移的原因是:

假设横屏:

不正常情况下分析 :

xOffset = (width - portraitHeight) / 2= (1024-720)/ 2 = 152

所在在程序中原来的代码是

outRect.set(xOffset, 0, xOffset + portraitHeight, portraitWidth);//原始代码

outRect.set(152, 0,152+ 720, 480);

xOffset 所以有了左右的偏移,如下图所示:

55603954_1.gif

改动后,正常情况下分析:

改动后计算:

outRect.set(0,

0, 0 + dm.widthPixels, dm.heightPixels);

outRect.set(0, 0, 0 +1024, 600);

55603954_2.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值