Unity InputField + ScrollRect实现微信聊天输入框功能

1、实现动态高度尺寸的的InputField

通过这两个部件就可以实现inputField的动态改变尺寸。

将inputField放入到scrollview当中作为子类

将scrollview 链接到UIChatInputField脚本中。

2、实现UIChatInputField

//聊天输入框(类似wechat)

RequireComponent(typeof(InputField))

public class UIChatInputField : MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler

{

Header("尺寸设置")

public float maxHeight = 500; // 最大可见高度

public float padding = 10f; // 文本边距

public float sensitivity = 1f;// 滚动灵敏度

public float elasticStrength = 0.2f; // 边界弹性强度

public ScrollRect ScrollRect;

private RectTransform scrollRectCotent;

private RectTransform inputRect;

private ContentSizeFitter contentSizeFitter;

private InputField inputField;

private Vector2 startPos;

private bool isDragging;

public void Awake()

{

inputField = GetComponent<InputField>();

inputField.onValueChanged.AddListener(OnTextValueChanged);

inputRect = GetComponent<RectTransform>();

scrollRectCotent = ScrollRect.content;

contentSizeFitter = GetComponent<ContentSizeFitter>();

}

Vector2 normalizedPos = new Vector2(0, 0);

void OnTextValueChanged(string str)

{

contentSizeFitter.SetLayoutVertical();

Vector2 sizeDelta = inputRect.sizeDelta;

ScrollRect.content.sizeDelta = sizeDelta;

if (inputRect.sizeDelta.y >= maxHeight)

{

sizeDelta.y = maxHeight;

}

RectTransform rectsCroll = ScrollRect.GetComponent<RectTransform>();

rectsCroll.sizeDelta = sizeDelta;

ScrollRect.normalizedPosition = normalizedPos;

}

private float GetScrollRange()

{

return Mathf.Max(0, scrollRectCotent.rect.height - ScrollRect.viewport.rect.height);

}

//坐标转换

public Vector2 ConvertScreenPosition(Vector2 screenPos)

{

Vector2 localPos;

RectTransformUtility.ScreenPointToLocalPointInRectangle(ScrollRect.viewport, screenPos, null, out localPos);

return localPos;

}

public void OnBeginDrag(PointerEventData eventData)

{

isDragging = true;

startPos = ConvertScreenPosition(eventData.position);

ScrollRect.StopMovement();

}

public void OnDrag(PointerEventData eventData)

{

if (!isDragging)

return;

Vector2 currentPos = ConvertScreenPosition(eventData.position);

Vector2 delta = (currentPos - startPos)*sensitivity;

startPos = currentPos;

// 转换为标准化位置

float newNormalizedPos = ScrollRect.verticalNormalizedPosition + delta.y / GetScrollRange();

newNormalizedPos = Mathf.Clamp01(newNormalizedPos); // 基础限制

// 应用弹性边界

if (newNormalizedPos < 0 || newNormalizedPos > 1)

{

newNormalizedPos += (newNormalizedPos > 1 ? -1 : 1) * elasticStrength;

}

// 更新滚动位置

ScrollRect.verticalNormalizedPosition = newNormalizedPos;

}

public void OnEndDrag(PointerEventData eventData)

{

isDragging = false;

}

}

效果如:

相关推荐
qq 1808095110 小时前
从零构建一个多目标多传感器融合跟踪器
unity
平行云11 小时前
实时云渲染支持在网页上运行UE5开发的3A大作Lyra项目
unity·云原生·ue5·webgl·虚拟现实·实时云渲染·像素流送
AA陈超11 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P07-18.生成火球术
c++·游戏·ue5·游戏引擎·虚幻
鹏飞于天11 小时前
Shader compiler initialization error: Failed to read D3DCompiler DLL file
unity
wonder1357913 小时前
UGUI重建流程和优化
unity·游戏开发·ugui
Doc.S15 小时前
多无人机任务自定义(基于ZJU-FAST-Lab / EGO-Planner-v2)
游戏引擎·无人机·cocos2d
那个村的李富贵17 小时前
Unity打包Webgl后 本地运行测试
unity·webgl
nnsix17 小时前
Unity OpenXR开发HTC Vive Cosmos
unity·游戏引擎
nnsix18 小时前
Unity OpenXR,扳机键交互UI时,必须按下扳机才触发
unity·游戏引擎
nnsix18 小时前
Unity XR 编辑器VR设备模拟功能
unity·编辑器·xr