OrangeUI

新建一个工程,
把uUIFunction.pas这个单元添加到工程中去,并且在主窗体中引用此单元,
在主窗体中引用OrangeUI的uComponentType这个单元,
在主窗体上放置一个模拟虚拟键盘显示的Panel控件,
在虚拟键盘弹出的时候,会把这个Panel的高度设置为虚拟键盘的高度,

再设置主窗体的虚拟键盘事件:
 
在虚拟键盘显示事件OnVirtualKeyboardShown中,
加上用于通知Frame虚拟键盘事件显示的过程,
CallSubFrameVirtualKeyboardShown(Sender,Self,KeyboardVisible,Bounds);
 
虚拟键盘隐藏事件OnVirtualKeyboardHidden事件加上
加上用于通知Frame虚拟键盘事件隐藏的过程,
CallSubFrameVirtualKeyboardHidden(Sender,Self,KeyboardVisible,Bounds);
 
 
并且在主窗体的OnShow事件中加入
启用模拟虚拟键盘、指定虚拟键盘模拟控件的代码,
修复Android下的虚拟键盘的代码,
以及处理虚拟键盘隐藏和显示的代码
如下图所示:

//在Windows平台下的模拟虚拟键盘控件
IsSimulateVirtualKeyboardOnWindows:=True;
//模拟虚拟键盘控件的高度
SimulateWindowsVirtualKeyboardHeight:=160;
GlobalAutoProcessVirtualKeyboardControlClass:=TSkinFMXPanel;
GlobalAutoProcessVirtualKeyboardControl:=pnlVirtualKeyBoard;
GlobalAutoProcessVirtualKeyboardControl.Visible:=False;
 
 
{$IFNDEF MSWINDOWS}
//在模拟器下设置为透明
pnlVirtualKeyBoard.SelfOwnMaterialToDefault.IsTransparent:=True;
pnlVirtualKeyBoard.Caption:='';
{$ENDIF}
 
 
//修复Android下的虚拟键盘隐藏和显示
GetGlobalVirtualKeyboardFixer.StartSync(Self);

 
 
再新建一个Frame,Name为FrameLogin,单元名为LoginFrame.pas,
我们用它来做为登陆界面,
 
放好ScrollBox,取名为sbClient,Align设置为Client,
ScrollBox上面放好ScrollBoxContent,取名为sbcClient,
 
再在ScrollBoxContent上面放好用户名和密码所需要的控件,
edtPassword和edtUserName的控件类型必须是TSkinFMXEdit,

 
就要实现在uUIFunction.pas单元中定义的IFrameVirtualKeyboardEvent接口,
 
IFrameVirtualKeyboardAutoProcessEvent=interface
['{D25150F4-EB4C-4097-93FE-51BFD19FF29D}']
//当前需要处理的控件
function GetCurrentPorcessControl(AFocusedControl:TControl):TControl;
//虚拟键盘放在哪里
function GetVirtualKeyboardControlParent:TControl;
end;

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

 
 
再加入接口的两个方法,并实现它们,


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

var
ALoginFrame:TFrameLogin;
begin
ALoginFrame:=TFrameLogin.Create(Self);
ALoginFrame.Parent:=Self;
ALoginFrame.Align:=TAlignLayout.Client;
 
 
可以直接在Windows平台下点击SkinFMXEdit来模拟的虚拟键盘弹出的效果: