OrangeUI

uUIFunction.pas中有在Frame中处理虚拟键盘的相关函数和接口,
这个文件在OrangeUI Samples(示例)\OrangeProjectCommon目录里面,
 
新建一个工程,
把uUIFunction.pas这个单元添加到工程中去,并且在主窗体中引用此单元,

再设置主窗体的虚拟键盘事件
 
在虚拟键盘显示事件OnVirtualKeyboardShown中,
加上用于通知Frame虚拟键盘事件显示的过程,
CallSubFrameVirtualKeyboardShown(Sender,Self,KeyboardVisible,Bounds);
 
虚拟键盘隐藏事件OnVirtualKeyboardHidden事件加上
加上用于通知Frame虚拟键盘事件隐藏的过程,
CallSubFrameVirtualKeyboardHidden(Sender,Self,KeyboardVisible,Bounds);
 
并且在主窗体的OnShow事件中加入修复Android下的虚拟键盘隐藏和显示的代码:GetGlobalVirtualKeyboardFixer.StartSync(Self);

 
新建一个Frame,Name为FrameLogin,单元名为LoginFrame.pas,
我们用它来做为登陆界面,
 
在Frame上放好Panel,取名为pnlVirtualKeyboard,
Align设置为Bottom,
放好ScrollBox,取名为sbClient,Align设置为Client,
ScrollBox上面放好ScrollBoxContent,取名为sbcClient,
 
再在ScrollBoxContent上面放好用户名和密码所需要的Edit控件,
如下图所示:

Frame要想响应虚拟键盘显示和隐藏的事件,
就要实现我在uUIFunction.pas单元中定义的IFrameVirtualKeyboardEvent接口,
 
IFrameVirtualKeyboardEvent=interface
['{3EA28E86-BEC2-432A-A744-C5210B0D3B85}']
//显示虚拟键盘
procedure DoVirtualKeyboardShow(KeyboardVisible: Boolean; const Bounds: TRect);
//隐藏虚拟键盘
procedure DoVirtualKeyboardHide(KeyboardVisible: Boolean; const Bounds: TRect);
end;

在LoginFrame.pas的引用uUIFunction单元,
在FrameLogin的声明中加入IFrameVirtualKeyboardEvent,

再加入接口的两个方法,

并实现这两个方法:
就是在虚拟键盘隐藏的时候,把pnlVirtualKeyboard的高度设置为0,
在虚拟键盘显示的时候,把它的高度设置为虚拟键盘的高度,
这样,ScrollBox的滚动空间就在虚拟键盘上面了,不会被挡住,
再设置ScrollBox.VertScrollBar的滚动位置为刚好显示出来登陆按钮,

 
 
在窗体的FormShow事件中动态创建LoginFrame来显示登陆页面,

var
ALoginFrame:TFrameLogin;
begin
ALoginFrame:=TFrameLogin.Create(Self);
ALoginFrame.Parent:=Self;
ALoginFrame.Align:=TAlignLayout.Client;