UE4中对移动端键盘弹出/监听的处理

这篇具有很好参考价值的文章主要介绍了UE4中对移动端键盘弹出/监听的处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.简述

背景:现有UE4的EditableText控件实现了输入文本并发送的基本功能。但是,点击输入框才可以弹出系统键盘,如果需要达到比如微信朋友圈的功能,比如自定义时机弹出,或对键盘弹出时监听等操作,则还需要一定的改造。可以发散思路,对可任意编辑文本框的控件进行改造,实现对获取文本、文本修改、键盘弹出、弹出监听等的功能来达到以上效果。

UE4中支持使用标准弹出对话框输入框或操作系统的虚拟键盘,启用方式可以参考
UE4Android虚拟键盘

2.处理方法

继承和调用关系:
UChatWidget(项目实际使用的Widget,访问公开API接口)— XXXInputPanel(包含输入框的面板)—SEditableText(输入框)— 基类SWidget

需要注意的是:
UWidget:是Widget Blueprint里面的可视化编辑控件,解决了SWidget编辑困难的问题,在运行时会转换为SWidget
SWidget:是UE运行时的真正控件,我们可以直接通过代码New进行创建

如果迷惑改哪个类,为何改,可以参考这篇科普文章:Slate/UMG/UWidget/SWidget的差别

具体实现:

以下实现对获取文本、文本修改、键盘弹出、弹出监听等的功能新增部分(可参考注释理解):

UChatWidget.h 声明委托和定义委托变量/函数

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FTextFocus);

class EMOTIONPLUGIN_API UChatWidget: public UWidget
{
public:
	UPROPERTY(BlueprintAssignable, Category="InputBox|Event")
	FTextFocus TextFocusEvent;
	...//函数定义略
}

UChatWidget.cpp 主要处理对外接口

TSharedRef<SWidget> UChatWidget::RebuildWidget()
{
	SAssignNew(InputPanel, XXXInputPanel)
	.OnSend(BIND_UOBJECT_DELEGATE(FOnSend, OnInputPanelSend))//发送的绑定委托
	.OnTextFocus(BIND_UOBJECT_DELEGATE(FOnTextFocus, OnTextFocus))//键盘弹出的绑定委托
	return InputPanel.ToSharedRef();
}

//键盘弹出监听
void UChatWidget::OnTextFocus() const
{
   TextFocusEvent.Broadcast();
}
//设置键盘主动弹出
void UChatWidget::SetInputFocus()
{
   if (InputPanel.IsValid())
   {
      InputPanel->SetInputFocus();
   }
}
//设置编辑框内文本
void UChatWidget::SetInputText(FText InText)
{
   if ( InputPanel.IsValid() )
   {
      //与 Slate数据绑定
      const TAttribute<FText> TextBinding = TAttribute<FText>(InText);
      InputPanel->SetInputText(TextBinding);
   }
}
//获取编辑框内文本
FString UChatWidget::GetInputText()
{
   if (InputPanel.IsValid())
   {
      return InputPanel->GetInputText();
   }
   else
   {
      return "";
   }
}

XXXInputPanel.h

DECLARE_DELEGATE(FOnTextFocus)

class XXX_API XXXInputPanel: public SXXWidget
{
	SLATE_EVENT(FOnTextFocus, OnTextFocus)
public: //定义func,略
	...
private:
	FOnTextFocus OnTextFocusEvent;
}

XXXInputPanel.cpp 主要在输入框构造函数内做如下处理

void XXXInputPanel::Construct(const FArguments& InArgs)
{
OnTextFocusEvent = InArgs._OnTextFocus;
...
ChildSlot
[
SAssignNew(InputBox, SEditableText)
.ReturnKeyType(EReturnKeyType::ReturnKey_Go)
.VirtualKeyboardTrigger(EVirtualKeyboardTrigger::OnAllFocusEvents)  //将键盘触发方式改成所有,只有这样才可以接收我们代码控制的SetFocus事件,默认只接收点击事件
.VirtualKeyboardDismissAction(EVirtualKeyboardDismissAction::TextCommitOnAccept)
.HintText(InArgs._HintText)
.OnTextChanged(this, &XXXInputPanel::OnInputTextChange)
.OnTextCommitted(this, &XXXInputPanel::OnInputTextCommitted)
.OnEditableTextFocus(this, &XXXInputPanel::HandleOnFocus) //这里绑定处理键盘打开后的广播,后由Lua处建立监听
]
...
}

//执行委托触发相应的对象的函数
void XXXInputPanel::HandleOnFocus()
{
   OnTextFocusEvent.ExecuteIfBound();
}

//主动打开键盘
void XXXInputPanel::SetInputFocus()
{
   FSlateApplication::Get().SetKeyboardFocus(InputBox, EFocusCause::SetDirectly);
   FSlateApplication::Get().SetUserFocus(0, InputBox, EFocusCause::SetDirectly);
}

//设置编辑框内文本
void XXXInputPanel::SetInputText(TAttribute<FText> Text)
{
   InputBox.Get()->SetText(Text);
}

//获取编辑框内文本
FString XXXInputPanel::GetInputText()
{
   SEditableText* EditableTextPtr = InputBox.Get();
   return EditableTextPtr->GetText().ToString();
}

SEditableText.cpp :需监听键盘打开时,在父类SEditableText添加绑定文章来源地址https://www.toymoban.com/news/detail-497274.html

//这里由 Slate 事件返回给系统,通知并处理接收到事件Focus
FReply SEditableText::OnFocusReceived( const FGeometry& MyGeometry, const FFocusEvent& InFocusEvent )
{
   EditableTextLayout->HandleFocusReceived(InFocusEvent);
   OnEditableTextFocus(); //这里添加调用委托,与上文使用套路一致
   return FReply::Handled();
}

void SEditableText::OnEditableTextFocus()
{
   OnEditableTextFocusCallback.ExecuteIfBound();
}

到了这里,关于UE4中对移动端键盘弹出/监听的处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用inputmode改变移动端键盘弹出的类型

    使用原因:需求是同时兼容移动端和PC端的输入,输入框数量多且绑定不同的对象,原本考虑使用vantUI的数字键盘,但是实际使用起来问题比较多,偶然间发现了inputmode这个属性,它可以改变移动端唤起拟态键盘的方式。 可以直接查看官网说明 提示:以下是本篇文章正文内容

    2024年02月16日
    浏览(42)
  • 【虚幻引擎】UE4/UE5鼠标点击事件实现物体移动

     在UE4/UE5中,引擎有它自己的一套框架体系,虚幻就是基于这一个框架体系来实现的。其中就有PlayerController(玩家控制器),玩家控制器中就有对鼠标的一系列设置,包括显示鼠标,允许点击事件等。  1.创建PlayerController,命名为MyPlayerController 2.打开MyPlayerController,勾选参数

    2024年02月10日
    浏览(115)
  • UE4蓝图学习篇(八)-- 角色基础移动

    在C++学习篇中有介绍如何使用UE4C++去处理角色的基础移动,那么本篇介绍使用蓝图去处理角色的基础移动。 1、创建Character类; 添加一个SpringArmComponent组件,在其下方添加一个CameraComponent组件能够看到角色,SpringArmComponent的添加是为了更加顺滑的处理角色和场景之间有遮挡时

    2024年02月06日
    浏览(67)
  • UE4移动端最小包优化实践

    移动端对于包大小有着严苛的要求,然而UE哪怕是一个空工程打出来也有90+M,本文以一个复杂的工程为例,探索怎么把包大小降低到最小,我这里从200M+减少到了86M 工程包含代码、插件、资源、iOS原生库工程。 官方文档 1、勾选Use Pak File和Create compressed cooked packages

    2024年02月03日
    浏览(31)
  • 【UE5/UE4】超详细教程接入科大讯飞语音唤醒SDK并初始持久监听(10102错误码解决)

    Windows环境下 **UE版本为UE4.27及以下 你需要具备一定的C++基础,或全程一对一对照我的代码编写你的代码 使用Offline Voice Recognition插件作为录音插件(仅做录音插件使用) 基于https://github.com/zhangmei126/XunFei二次开发 语音识别部分参考CSDNUE4如何接入科大讯飞的语音识别 在此基础

    2024年04月09日
    浏览(68)
  • UE4样条线移动,玩家只需要控制旋转

    1.创建Actor并命名为“A_Spline” 2.创建Pawn并命名为“P1” 3以上创建的蓝图类可以使用自己的命名!!!!! 第二步:给P1写上蓝图 1.我们首先给P1写蓝图 2.在输入映射中设置一个事件Yaw 3.为鼠标的X轴,数值为1 4.如图写上刚刚设置的输入事件 第三步:给A_Spline写上蓝图 1.添加一

    2023年04月09日
    浏览(61)
  • UE4: Niagara系统实现雨天效果,并跟随人物移动

    1.创建一个Niagara系统 选择Fountain选项,点一下加号,再点完成: 命名一下打开: 先从粒子生成的方向入手,在Niagara的界面中删掉“Add Velocity in Cone”,并添加“Add Velocity”,这样预览效果中的粒子就从椎体向上喷发,变成向下发射。 删掉之后: 然后将sphere location也删除,因

    2024年02月07日
    浏览(55)
  • UE4/UE5 虚幻引擎,Pawn的碰撞,怎么防止Pawn移动的时候穿透物体。

    前言:在UE项目开发中,有些我们需要自己新建一个Pawn来控制视角,但是如果我们没有设置Pawn的碰撞,那么Pawn在移动的过程中,很容易穿到Actor里面。而有的时候我们并不需要Pawn穿过物体,就必须要给Pawn增加碰撞。 1、新建一个Pawn类。 2、 添加FloatingPawnMovement(必须添加这

    2023年04月12日
    浏览(75)
  • 在UE4虚幻引擎中加入导航网格体边界体积后丧尸不能移动和发现玩家

    最近使用ue4做第一人称视角射击游戏发现问题,加入导航网格体边界体积后丧尸不能移动和发现玩家。下图是出现的问题图片 1.行为树:控制并显示AI的决策制定过程 2.黑板:可以看做是行为树的创建一些公有变量,外部可以修改行为树黑板的变量值,达到修改行为树状态的

    2024年02月05日
    浏览(112)
  • UE4动作游戏实例RPG Action解析一:角色移动,旋转,动画创建,创建武器,及武器配置

    1.1、官方RPGAction Demo下载地址: ​ 1.2、在场景中创建一个空的角色 创建一个Character蓝图和一个PlayerController蓝图,添加弹簧臂组件和摄像机,并为网格体添加上一个骨骼网格体 ​ 1.3、如何让这个角色出现在场景中, 创建一个GameMode蓝图,把默认Pawn类设置成我们创建的角色,

    2024年02月03日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包