UGUI源码解析(十三)InputField_unity inputfield onselect-程序员宅基地

技术标签: UGUI源码解析  InputField  Unity  

InputField

InputField可以提供文本输入功能,是与用户交互的一个重要手段。我们可以在编辑器里,为OnValueChanged和OnEndEdit两个事件添加监听,这样就可以获得用户输入的文本。

public class InputField : Selectable,IUpdateSelectedHandler,IBeginDragHandler,
IDragHandler,IEndDragHandler,IPointerClickHandler,ISubmitHandler,
ICanvasElement,ILayoutElement

 

OnEnable方法

  • 设置了输入文字绘制开始的位置,结束的位置。
  • m_TextComponent调用了RegisterDirtyVerticesCallback两次,添加MarkGeometryAsDirty和UpdateLabel回调,
  • 调用了RegisterDirtyMaterialCallback,添加UpdateCaretMaterial回调,
  • 最后调用UpdateLabel。

MarkGeometryAsDirty

在CanvasUpdateRegistry里把自己注册到图形重建序列。

UpdateLabel方法

  • 为字符串添加光标,如果是密码类型的输入,用*号代替输入,如果是空的,显示占位符。
  • 如果字符串不为空,先通过GetGenerationSettings方法,获取文本生成设置,
  • 调用cachedInputTextGenerator.PopulateWithErrors方法,生成Mesh的顶点数据和文本字符串数据,
  • 然后调用SetDrawRangeToContainCaretPosition设置包含光标的字符串绘制区域,根据TextGenerator和caretPos(光标位置)来计算m_DrawStart和m_DrawEnd,并根据这两个值取字符串的子字符串,设置光标可见(使用协程闪烁)。
  • 把经过加工的processed赋值给m_TextComponent.text,并调用MarkGeometryAsDirty把自己注册到图形重建序列。

UpdateCaretMaterial方法

  • 调用m_TextComponent.GetModifiedMaterial(Graphic.defaultGraphicMaterial), Texture2D.whiteTexture);创建一个默认的材质
  • 调用m_CachedInputRenderer.SetMaterial把创建的材质赋值给光标,更新光标的材质

OnDisable方法

  • 停止了光标闪烁,调用DeactivateInputField停用InputField
  • 解除了m_TextComponent的三个回调,并把自己从布局重建序列和图形重建序列中移除,
  • 清空m_CachedInputRenderer
  • DestroyImmediate(m_Mesh),并设置m_Mesh为null,也就是清空绘制光标和选中区域的Mesh。

DeactivateInputField方法,停用InputField,以停止处理事件

  • 设置m_Keyboard.active为false,
  • 设置光标位置为0,
  • 如果IsInteractable为true,调用SendOnSubmit,发送onEndEdit事件, onEndEdit.Invoke(m_Text),
  • 最后调用MarkGeometryAsDirty等待重建。

ActivateInputField方法,激活InputField,以开始处理事件

  • 设置m_Keyboard.active为true,
  • 为m_Text赋值给m_Keyboard.text,
  • 设置m_ShouldActivateNextUpdate为true。

 

重写OnPointerDown方法,设置本对象为当前选择对象,如果已经被选中,则设置光标的位置,然后调用UpdateLabel。

重写OnSelect方法,重写OnPointerClick,同样调用ActivateInputField,激活InputField方法

重写OnDeSelect方法,调用DeactivateInputField,停用InputField。

Selectable的DoStateTransition也被重写,会让点击过后的输入区域一直处于高亮状态,直到输入区域被反激活。

OnUpdateSelected方法

继承自IUpdateSelectedHandler接口,输入模块切换到StandaloneInputModule时会被调用。在键盘按下时,执行KeyPressed方法,处理一系列键盘输入的操作,比如退格键,复制粘贴(Ctrl+ c、Ctrl+v)。

OnBeginDrag方法,设置m_UpdateDrag为true。

OnDrag方法

根据鼠标的位置设置选中区域,如果鼠标在边界范围之外,调用协程MouseDragOutsideRect,只是单行时,如果鼠标位置比rect的最小值还小,把选择光标移动到左边,否则往右移动。多行时,会有上下的选中区域移动,然后UpdateLabel更新。当拖拽结束或回到InputField范围内,停止协程。

OnEndDrag方法,设置m_UpdateDrag为false。

OnPointerClick方法,调用ActivateInputField,激活InputField。

OnSubmit方法,如果isFocused为false,设置m_ShouldActivateNextUpdate为true,在LateUpdate里激活输入区域。

Rebuild方法

CanvasUpdateRegistry重建图像是会回调Rebuild方法。方法里调用了UpdateGeometry方法。

UpdateGeometry方法

  • 为InputField添加一个InputField Input Caret对象,在添加的对象上,添加了RectTransform和CanvasRenderer,用于显示光标和选中区域。
  • 添加LayoutElement组件,并设置ignoreLayout为true,调用AssignPositioningIfNeeded设置光标的位置等信息,
  • 调用OnFillVBO方法为CanvasRenderer生成Mesh, m_CachedInputRenderer.SetMesh(mesh)。

OnFillVBO方法

如果没有选择区域,调用GenerateCaret生成光标的Mesh,否则,调用GenerateHightlight生成选中区域的Mesh。然后调用VertexHelper.FillMesh,填充Mesh。

GenerateCaret方法

根据光标位置,计算出四个顶点,调用vbo.AddUIVertexQuad添加四个顶点到VertexHelper。

GenerateHightlight方法

根据选中区域的起始点和结束点,计算出四个顶点,调用vbo.AddVert添加顶点到VertexHelper。

LateUpdate方法

  • 如果m_ShouldActivateNextUpdate为true,调用ActivateInputFieldInternal,激活InputField,
  • 调用AssignPositioningIfNeeded设置光标的位置等信息,
  • 如果m_Keyboard == null或m_Keyboard.done(结束输入),调用OnDeselect,方法里调用DeactivateInputField,停用InputField。
  • 如果m_Keyboard的输入与之前的不同,遍历输入字符, 根据CharacterValidation类型(Integer,Decimal(小数),Alphanumeric(字母数字),Name,EmailAddress)判断输入字符的合法性。
  • 如果characterLimit > 0并且输入字符长度大于characterLimit,截取限制长度的字符串。
  • 调用SendOnValueChangedAndUpdateLabel,发送OnValueChanged事件,并更新。
  • 如果键盘结束输入,调用OnDeselect,方法里调用DeactivateInputField,停用InputField。

ActivateInputFieldInternal方法

  • 设置本对象为选择对象SetSelectedGameObject
  • 如果支持触屏键盘,开启触屏键盘TouchScreenKeyboard.Open,调用MoveTextEnd选中全部
  • 设置光标可见SetCaretVisible
  • 调用UpdateLabel更新
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq826364410/article/details/88139372

智能推荐

Redis 缓存穿透 击穿 雪崩_同类型的key固定时间+随机值间,-程序员宅基地

文章浏览阅读96次。Redis 缓存穿透 击穿 雪崩_同类型的key固定时间+随机值间,

【算法习题】数组中未出现的最小正整数-程序员宅基地

文章浏览阅读1.2k次。题目:给定一个无序整型数组arr,找到数组中未出现的最小正整数。要求时间复杂度为O(N)空间复杂度为O(1)。例如:arr=[-1,2,3,4]。返回1。arr=[1,2,3,4]。返回5。=========================================================分析:这道题要理解最小正整数的意思,最小的正整数就是1,所以考..._最小未出现的正整数

分治算法③-使用分治算法实现二分查找-python_python实现分治法二分搜索从控制台输入-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏6次。如果 target >array[mid] ,令 left=middle+1,继续在数组的后半部分进行搜索;如果 target 判定 left_python实现分治法二分搜索从控制台输入

信息系统项目管理师必背核心考点(二十七)关键路径法(CPM)_关键路径的考点-程序员宅基地

文章浏览阅读1k次。科科过为您带来软考信息系统项目管理师核心重点考点(二十七)关键路径法(CPM),内含思维导图+真题_关键路径的考点

【氧化镓】Ga2O3 MOSFET器件的单SEB机制TCAD研究-程序员宅基地

文章浏览阅读636次,点赞8次,收藏9次。本文是一篇关于氧化镓(Ga2O3)金属氧化物半导体场效应晶体管(MOSFET)在单粒子烧毁(single event burnout, SEB)事件中的机制研究的文章。文章通过使用技术计算机辅助设计(TCAD)模拟来探究侧向耗尽型氧化镓MOSFET设备在SEB中的敏感区域和安全操作电压,并提出了辐射损伤机制。

分享一个关于生鲜电商的竞品分析报告-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏17次。1.行业分析近年来,生鲜电商在资本的加持下迅速发展。2019年随着资本态度趋于保守,加之多数生鲜电商尚未实现规模化盈利,多家生鲜电商平台开始出现危机,生鲜电商行业又迎来新一轮洗牌,与此同时..._电子商务数据分析测试一一家生鲜店铺为进一步占据更多市场份额,需要对其竞争对手

随便推点

Kanzi软件开发与Android的关系_kanzi_on_android_3_9_4_setup-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏6次。随着Android在汽车领域尤其是在车载娱乐系统方向使用的场景越来越多,Kanzi作为Android提高界面效果、提升界面开发效率的优质小伙伴,Android+Kanzi的组合被越来越多的整车厂和供应商采用。那么这对小伙伴是怎样打交道的呢?这一期就来给大家介绍下。一、Kanzi On Android原理我们先来了解下Kanzi On Android应用的基本知识。从Kanzi的kanzi_engine.jar源码中可以看到,KanziActivity继承自Android的Activity,渲染的Ka_kanzi_on_android_3_9_4_setup

【ChatGLM3】(7):在autodl上,使用A50显卡,使用LLaMa-Factory开源项目对ChatGLM3进行训练,非常方便的,也方便可以使用多个数据集_chatglm3 训练-程序员宅基地

文章浏览阅读3.4k次,点赞20次,收藏20次。工具还是非常的简单,可以把机构参数进行设置下。主要就是把参数可视化,同时把结果也可视化。非常的方便。进度也可以看到。_chatglm3 训练

高管内斗或使浆量下滑,海尔集团125亿元战投上海莱士存变数?_上海莱士 海尔-程序员宅基地

文章浏览阅读874次,点赞26次,收藏27次。季某进入血浆事业部后,进行大刀阔斧的改革,降本增效,将有能力的人放到关键岗位上,现在的大化,武宁,兴平、石门、澧县、沂源、白沙等浆站站长都是季某在岗期间挑选的浆站一把手,这些浆站浆量都大幅提升。朱某为了谋求回到浆站,指示浆站内部员工捣乱,对全州新到的站长黄某进行各种骚扰,包括砸车窗,浆站电闸纵火,在车上放纸条威胁,内外勾连故意找体格不达标的浆员进站献浆恶意到卫监所投诉浆站等,半年时间折腾下来,导致全州浆站的浆量从2022年的57.8吨掉到了2023年的50.23吨,降幅达-13%。_上海莱士 海尔

ChatGPT AIGC 办公自动化拆分Excel工作表_ai 拆分excel-程序员宅基地

文章浏览阅读259次。在这样的一份数据源中,我们需要完成将每个人的工资用一个单独的表存放。3.在“移动或复制”对话框中,选择“新工作簿”,然后勾选“将选定工作表复制到新工作簿”选项。chatGPT自动生成的VBA代码就能很轻松的实现工作表拆分,再也不用手动复制与粘贴了。4.点击“确定”,Excel会创建一个新的工作簿,并将您选择的工作表复制到该工作簿中。复制---新建工作表---粘贴,反复这几个步骤进行工作表拆分,即费时又费力。1.打开您的Excel工作簿,选择您要拆分的工作表。5.如果需要拆分多个工作表,请重复上述步骤。_ai 拆分excel

删除一个英文字符串当中所有的字母d C语言学习日志#3_编写程序,删除输入字符串中的字符d-程序员宅基地

文章浏览阅读284次。【代码】删除一个英文字符串当中所有的字母d C语言学习日志#3。_编写程序,删除输入字符串中的字符d

python实现接口上传文件的两种方法_python上传文件-程序员宅基地

文章浏览阅读3.7w次,点赞12次,收藏76次。文件上传:上传图片的类型是file,这里没有用到头部信息import requestsdef sendImg(img_path, img_name, img_type='image/jpeg'): """ :param img_path:图片的路径 :param img_name:图片的名称 :param img_type:图片的类型,这里写的是image/jpeg,也可以是png/..._python上传文件