用「抽屉故事」理解 Android 输入法窗口:屏幕底部的「键盘抽屉」解析

117 阅读4分钟

场景延续:Android大厦里的「隐藏抽屉」

继 Music 的「登录房间」后,现在我们来看看大厦里一个特殊的房间 ——输入法键盘抽屉(InputMethod Window)。它平时藏在屏幕底部,需要输入文字时才会滑出来:

1. 抽屉的基本身份:为输入而生的「工具间」

plaintext

Window #3 Window{abeb675 u0 InputMethod}
mOwnerUid=10030(房主ID:车载键盘应用)
package=com.car.keyboard(抽屉所属品牌:车载键盘App)
mIsImWindow=true(这是专门放输入法的抽屉)
mBaseLayer=151000(楼层号:151000层,比普通房间高)

类比
这是编号 3 的「键盘抽屉」,属于车载键盘 App,专门用来放输入文字的键盘。它住在 151000 层,比 Music 的房间(21000 层)高很多,这样滑出来时能盖住其他房间的底部。

2. 抽屉的「设计图纸」:透明、底部弹出的特殊结构

plaintext

mAttrs={(0,0)(fillxwrap) gr=BOTTOM CENTER_VERTICAL(底部居中)
ty=INPUT_METHOD(类型:输入法专用) fmt=TRANSPARENT(材质:透明)
fl=NOT_FOCUSABLE(不能单独点击) LAYOUT_IN_SCREEN(铺满屏幕宽度)
sim={adjust=pan}(滑动方式:平移)
Requested w=1920 h=524(抽屉尺寸:宽1920px,高524px)

类比

  • 抽屉设计成「底部居中弹出」,宽度和屏幕一样宽(1920px),高度 524px(大概是屏幕高度的 2/3)。
  • 材质是透明的,这样滑出来时不会完全挡住下面的房间(比如 Music 的登录界面)。
  • 设计成「不能单独点击」,因为它的作用是配合其他房间使用(比如用户点击登录界面的输入框时,抽屉才会弹出)。

3. 抽屉的「可见性」:现在是关着的

plaintext

mViewVisibility=0x8(状态:隐藏) mObscured=false(没被挡住)
isVisible=false(抽屉门是关着的)
mHasSurface=false(抽屉内部没开灯) isReadyForDisplay()=false(没准备好展示)

类比
现在这个键盘抽屉是关着的,藏在屏幕底部,你看不到里面的键盘。抽屉内部没开灯(没有 Surface),所以即使打开也看不到内容 —— 这说明当前输入法键盘并没有真正显示出来,可能因为用户还没点击输入框。

4. 抽屉的「位置边界」:底部 196px 到 720px

plaintext

Frames: content=[0,196][1920,610](抽屉内容区:底部196px开始)
mFrame=[0,196][1920,720](抽屉整体位置:从196px到屏幕底部720px)
touchable region=SkRegion((0,196,1920,720))(可触摸区域:底部196px以下)

类比

  • 屏幕总高度是 720px,抽屉的位置是从 196px 到 720px,也就是底部的 524px(720-196)高度,正好对应它申请的 524px 高度。
  • 可触摸区域是底部 196px 以下,这意味着当抽屉弹出时,用户只能点击键盘区域,上面的 196px 是其他应用的内容(比如 Music 的登录框)。

5. 抽屉与「其他家具」的关系:避开状态栏和导航栏

plaintext

fitTypes=STATUS_BARS NAVIGATION_BARS(适配状态栏和导航栏)
Cur insets: content=[0,0][0,110](底部有110px的导航栏柜子)

类比
抽屉设计时会避开顶部的状态栏架子(70px)和底部的导航栏柜子(110px)。比如当抽屉弹出时,不会盖住导航栏的返回键,而是停在导航栏上方 —— 就像床头柜不会压到床尾的柜子一样。

6. 抽屉的「动画状态」:准备随时滑出来

plaintext

ContainerAnimator: mAnimationType=32(抽屉滑动动画)
mDrawState=NO_SURFACE(还没画出键盘)

类比
抽屉配有滑动动画装置(比如导轨),但现在动画还没启动,抽屉内部也没画出键盘图案。当用户点击输入框时,动画会触发,抽屉滑出并显示键盘(就像拉开抽屉时,内部的键盘布局才会可见)。

总结:这个抽屉什么时候会派上用场?

这是车载键盘 App 的输入法窗口,目前处于隐藏状态,就像屏幕底部一个关着的抽屉:

  • 它设计成透明的、底部弹出的结构,不会完全挡住其他应用;

  • 楼层号很高(151000 层),确保弹出时能覆盖在其他窗口之上;

  • 当用户点击 Music 登录界面的密码输入框时,这个抽屉会通过动画滑出,显示键盘让用户输入 —— 此时 mHasSurface 会变成 true,抽屉内部开灯,键盘图案就会显示出来啦~

通过「抽屉」的类比,可以理解输入法窗口如何作为辅助工具,在需要时动态出现在屏幕底部,而不影响主要应用的显示~