屏蔽安卓7.0屏幕显示大小可调的问题
引言
前一阵子在7.0的机子上调试应用,发现设置中有一个显示大小的选项,这个选项可以改变应用显示的大小,即应用显示缩放功能,会改变机子的dpi,导致应用出现屏幕适配的问题。
当然,国内大部分手机厂商已经把此项设置给屏蔽掉了,此处记录该问题,后期项目若遇到该问题,可直接拿来解决。
注:我的解决方法是需要用到framework包下hide的api,只用该方法需要依赖编译安卓源码得到的framework.jar包。此种方法稍微麻烦,如找到其它简易的解决方法,我会贴上。
问题
在设置中改变应用显示大小。
应用正常情况下:
异常情况下:
分析
这个问题,其实因为在设置中设置该选项后,会改变系统的dpi,通过log信息来看一下吧。
先看看通过adb命令查看到的手机屏幕信息:
设置中改变显示大小,查看输出屏幕分辨率/density信息。
测试代码:
//获取densityDpi(方法一)
int densityDpi = this.getResources().getConfiguration().densityDpi;
LogUtils.d(TAG, "densityDpi " + densityDpi);
WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
//获取densityDpi(方法二)、获取density
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
int densityDpi1 = displayMetrics.densityDpi;
float density = displayMetrics.density;
LogUtils.d(TAG, "densityDpi1 " + densityDpi1);
LogUtils.d(TAG, "density " + density);
//设置显示大小为"小"时:
05-26 12:02:34.934 D/DeskClockDemo(17240): MainActivity -----> densityDpi 204
05-26 12:02:34.937 D/DeskClockDemo(17240): MainActivity -----> densityDpi1 204
05-26 12:02:34.937 D/DeskClockDemo(17240): MainActivity -----> density 1.275
05-26 12:02:34.979 D/DeskClockDemo(17240): MainActivity -----> onPageSelected 1
05-26 12:02:35.020 D/DeskClockDemo(17240): MainActivity -----> topYLimit 77
05-26 12:02:35.020 D/DeskClockDemo(17240): MainActivity -----> bottomYLimit 408
05-26 12:02:35.020 D/DeskClockDemo(17240): MainActivity -----> mTouchSlop 10
//设置显示大小为"默认"时:
05-26 12:03:05.902 D/DeskClockDemo(17240): MainActivity -----> densityDpi 240
05-26 12:03:05.906 D/DeskClockDemo(17240): MainActivity -----> densityDpi1 240
05-26 12:03:05.906 D/DeskClockDemo(17240): MainActivity -----> density 1.5
05-26 12:03:05.955 D/DeskClockDemo(17240): MainActivity -----> onPageSelected 1
05-26 12:03:06.011 D/DeskClockDemo(17240): MainActivity -----> topYLimit 90
05-26 12:03:06.012 D/DeskClockDemo(17240): MainActivity -----> bottomYLimit 480
05-26 12:03:06.012 D/DeskClockDemo(17240): MainActivity -----> mTouchSlop 12
通过log信息可以看到,改变显示大小后,相应的density以及densityDpi都相应的改变了,自然的,我们布局当中使用的dp也会随之改变。那么,屏蔽的方法自然就是,在你的app中,界面形成之前,把dpi手动的改为手机原始的(init)默认的dpi即可。
话不多说,还是直接贴代码,一看了然。
应用中屏蔽该问题的方法
先看方法:
/**
* 获取手机出厂时默认的densityDpi
* @param displayId
* @return
*/
public static int getDefaultDisplayDensity(int displayId) {
try {
final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
return wm.getInitialDisplayDensity(displayId);
} catch (RemoteException exc) {
return -1;
}
}
/**
* 获取手机出厂时默认的densityDpi并设置给手机
* 在需要用到的activity中的onCreate中调用该方法
* @param context
*/
public static void setDefaultDisplay(Context context) {
if(Build.VERSION.SDK_INT > 23) {
Configuration origConfig = context.getResources().getConfiguration();
origConfig.densityDpi = getDefaultDisplayDensity(Display.DEFAULT_DISPLAY);//获取手机出厂时默认的densityDpi
context.getResources().updateConfiguration(origConfig, context.getResources().getDisplayMetrics());
}
}
使用方式,在需要屏蔽的activity的onCreate方法中调用,建议在BaseActivity中调用:
以上,即可。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Andriod界面设计的分辨率和尺寸适配全攻略
- 下一篇: thinkphp getField