[Android] 关于Window Overscan
Overscan的概念
对于电视机,有一个Overscan的概念,如下图,所谓Overscan区域,就是电视机屏幕四周某些不可见的区域,这是电视机的特性。并且,Overscan的具体值也没有一个明确的标准,不同的电视机厂家的Overscan的值也各不相同。
而对于普通的LCD,由于并没有Overscan的概念,所以设想,将一块没有设置Overscan的Framebuffer显示到有Overscan的电视机上,必定四周有一部分Overscan的区域被切除到无法显示出来。
所以在Android 4.3以后,Google加入了Overscan的API,并且提供了wm工具,可以让用户设定Overscan的值,来满足不同的电视机。
上图中,包含了Overscan的整个区域我们称之为Overscan Screen;
去处Overscan区域后称之为 Unrestricted Area,由绿色和紫色区域组成,绿色区域用于显示Status Bar和Navigation Bar;
剩下的紫色区域为 Restricted Area,这里显示的为mContentFrame。
关于WM Tool
Android 4.3之后,加入了Overscan的概念,并且提供了wm工具来设定Overscan的值。(参考git commit:c652de8141f5b8e3c6bcf8916842b6e106413b1a)
代码调用流程:
简单来讲就是,当我们设置了Overscan值后,WindowManagerService、PhoneWindowManager等会对当前显示的View的参数做重新计算,将计算完的数值会传给View,让其重新Layout。
关于输入法的Bug
一个存在的Bug是,当我们设置完Overscan后,google 的虚拟键盘并没有跟着Overscan的变化而缩放,虚拟键盘的一部分会被Overscan的区域遮挡无法显示。
原因:虚拟键盘是通过Canvas绘制到屏幕上,而虚拟键盘上每一个组件的大小是根据屏幕的实际像素和深度来计算的,代码:
packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
final Resources res = mThemeContext.getResources(); builder.setScreenGeometry(res.getInteger(R.integer.config_device_form_factor),res.getConfiguration().orientation, res.getDisplayMetrics().widthPixels);
所以,Keyboard会撑满Overscan Screen,而我们期望的是让Keyboard撑满Unrestricted Area,故我们做以下修改:
1. 让Display.java中的getWidth方法返回除去Overscan长度后的值。
frameworks/base/core/java/android/view/Display.java
public int getWidth() { synchronized (this) {updateCachedAppSizeIfNeededLocked();updateDisplayInfoLocked();return mCachedAppWidthCompat - mDisplayInfo.overscanLeft - mDisplayInfo.overscanRight ;}}
2. 在LatinIME中添加mWidth变量,用于存放Keyboard宽度。
packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/SettingsValues.java
public static int mWidth; public SettingsValues(final SharedPreferences prefs, final InputAttributes inputAttributes, final Context context) { if(mWidth == 0){ mWidth = res.getDisplayMetrics().widthPixels; } }
3. 每次虚拟键盘弹出前,比较当前的Width和设定Width是否相同,不同和替代,并重新初始化Keyboard。注,此处InputManagerService的getMaxWidth方法最终会调用Step1的getWidth方法。
packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/LatinIME.java
private void onStartInputViewInternal(final EditorInfo editorInfo, final boolean restarting) {super.onStartInputView(editorInfo, restarting); // Deal with overscan areaif(mCurrentSettings.mWidth != getMaxWidth()){mCurrentSettings.mWidth = getMaxWidth();loadKeyboard();}}
4.将初始化键盘宽度的值从res.getDisplayMetrics().widthPixels改成settingsValues.mWidth。
packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
public void loadKeyboard(EditorInfo editorInfo, SettingsValues settingsValues) {final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(mThemeContext, editorInfo);final Resources res = mThemeContext.getResources(); // builder.setScreenGeometry(res.getInteger(R.integer.config_device_form_factor), // res.getConfiguration().orientation, res.getDisplayMetrics().widthPixels); builder.setScreenGeometry(res.getInteger(R.integer.config_device_form_factor),res.getConfiguration().orientation, settingsValues.mWidth);}
参考
http://blog.csdn.net/cjj7905150/article/details/17888377
转载于:https://www.cnblogs.com/all-for-fiona/p/4054527.html
[Android] 关于Window Overscan相关推荐
- 【错误记录】布局组件加载错误 ( Attempt to invoke virtual method ‘xxx$Callback android.view.Window.getCallback()‘ )
文章目录 一.报错信息 二.解决方案 一.报错信息 使用环境 : Kotlin 编写的 Activity 使用了 kotlin-android-extensions 扩展插件 , 在 build.gr ...
- import android.view.window;,尝试在空对象引用上调用虚拟方法‘android.view.Window$回调...
尝试在空对象引用上调用虚拟方法'android.view.Window$回调-android.view.Window.getCallback()' 当我SplashActivity打开LoginAct ...
- android 添加子view,Android基于Window.ID_ANDROID_CONTENT给定id添加子View
Android基于Window.ID_ANDROID_CONTENT给定id添加子View 这一技术特点在一些视频播放器中比较有用. 例如代码: package zhangphil.demo; imp ...
- Android的Window类详解
Android的Window类(一) Android的GUI层并不复杂.它的复杂度类似于WGUI这类基于布局和对话框的GUI,与MFC.Qt等大型框架没有可比性,甚至飞漫魏永明的MiniGUI都比它复 ...
- Android之Window与WindowManager
Window表示一个窗口的概念,在日常开发中直接接触Window的机会并不多,但却会经常用到Window,activity.toast.dialog.PopupWindow.状态栏等都是Window ...
- Android解析Window机制
一.window介绍 什么是window 什么是view树?例如你在布局中给Activity设置了一个布局xml,那么最顶层的布局如LinearLayout就是view树的根,他包含的所有view就都 ...
- Android之window机制token验证
文章已授权『郭霖』公众号发布 前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Andr ...
- android设置window背景颜色,android – 设置标题背景颜色
这个 thread将让你开始在xml文件中建立自己的标题栏,并在你的活动中使用它 编辑 这里是上面链接的内容的简要摘要 – 这只是设置文本的颜色和标题栏的背景 – 没有调整大小,没有按钮,只是最简单的 ...
- [转]Android 之 Window、WindowManager 与窗口管理
这篇是对前两天研究的悬浮窗的内容的一个小小的资料整理吧.首先是转载一篇介绍Android窗口的内容,觉得写得不错:http://blog.csdn.net/xieqibao/article/detai ...
最新文章
- python-selenum3 第五天定位——不常用定位与css定位详
- XML Programming with C# and .NET
- eclipse 的help没有Eclipse Marketplace
- 从武侠门派的角度去解释域、域树、林的含义(下)
- mysql 服务账号_MySql 账号管理
- ffmpeg 结合 ASS字幕制作+特效制作
- PicGo: image not found in clipboard
- css宋体代码_css怎么设置字体为宋体
- VUE项目学习(三):win10版nginx部署vue项目
- 计算机屏幕一直闪,如何解决电脑显示器一直闪的问题
- 神奇的计算机作文400字,人工智能作文400字十篇
- 南加州大学计算机科学案例,南加州大学计算机科学录取案例
- 2021度小满9.20编程笔试
- 总结前端三剑客之一(HTML基础)
- 越过越好的人,都戒掉了这个习惯
- 火热IT认证CISP
- CS231N课程作业Assignment1--SVM
- 京东面试题(JAVA)
- 魅蓝note2android8,魅蓝Note2支持扩展储存卡吗?支持多大的储存卡?
- 【追踪】山东曲阜孔林附近女子被斩首续:系凶手女友