一个简单 小型的C#Socket网络通信库 聊天室示例(三)

接下来就是客户端了先讲讲那个动态聊天框怎么实现的把

先上张效果图好了,

动态聊天框演示.gif

说下大概实现过程

TXT.png

首先TXT锚点设置成上面那个,方便我们计算 因为这样的话他的宽度就会随着聊天框增长而增长 我们只需要设置left 和right 两边的距离就行了 ,不懂啥意思看图吧


TXT差距.png

然后就是获取到 txt文字里面宽度最长的那行长度 如果大于自己设置的最大宽度 聊天框就设置宽度最大值就行了 Txt高度靠ContentSizeFitter组件适配垂直高度
所以 聊天框的宽度计算就是 如果没大于自己设置的宽度就是 txt 两边的差距+文字最长的那行,如果这两者加起来超过了设置的宽度,就直接设置最大宽度就好
聊天框长计算的话 就是 原本聊天框的高度+文字的高度
因为 还要匹配一下头像图片高度 所以这里用了父物体来增加这个高度就是Dialogui
聊天框锚点就设置成这样

TXT.png

随着父物体高度增加而增加

可以看下 下面代码 这时候聊天框就动态了
顺便放下计算代码

//Dialogui聊天框的父物体
//DialogBox聊天框
        //DialogTxt文本
        //preferredWidth是获取该文本的文字 最宽的一段的长度   如果超过540长度 就宽度上限了
        if ((int)(DialogTxt.preferredWidth / 540) == 0)
        {

            //没超过设置的540之前,他的宽度是 TXT和聊天框两边的差距+文字的长度   
            DialogBox.sizeDelta = new Vector2(Mathf.Abs(DialogTxt.rectTransform.sizeDelta.x) + DialogTxt.preferredWidth, DialogBox.sizeDelta.y);

        }
        else
        {
            //超过最大宽度540了 就一直设置540就好
            DialogBox.sizeDelta = new Vector2(540, DialogBox.sizeDelta.y);
        }
        //就是原本 是原本100高度+文本高度
        Dialogui.sizeDelta = new Vector2(Dialogui.sizeDelta.x, 100 + DialogTxt.preferredHeight);

聊天框图片九宫格 设置

大概切成这样, 图片拉伸就会值拉伸红色框框那里 ,emmm这张拉起来有点丑 凑合吧


九宫格.png

Pivot UI旋转缩放的中心点

就是UI旋转缩放的中心点,左下角为(0,0)右上角为(1,1)
一般他们默认是0.5,0.5 所以缩放长度高度时候会均匀缩放,而我们的聊天框不允许这样缩放 所以要设置 看下图


Pivot.png

然后就是头像 和父物体的设置了 我直接上图吧没啥好说的

DialogUI 就是整个Panel的
父物体.png

头像 锚点也是设置成这样方便操作

PlayerInfo.png

完整代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DialogUI : MonoBehaviour 
{
    public RectTransform Dialogui;
    public RectTransform DialogBox;
    public RectTransform HeadBG;

    public RawImage HeadImg;

    public Text DialogTxt;
    public Text PlayerNameTxt;

    private void Start()
    {
      //  InitDialog("啊啊啊啊啊啊啊啊啊\n啊啊啊啊啊啊啊啊");
    }

    /// <summary>
    /// 设置我方的对话位置 内容
    /// </summary>
    /// <param name="info"></param>
    /// <returns></returns>
    public DialogUI InitLocalDialog(string playername,string info, Texture2D head)
    {
        //这边是左边的边界离父物体的左边距离635
        HeadBG.offsetMax = new Vector2(627, HeadBG.offsetMax.y);
        HeadBG.offsetMin = new Vector2(0, HeadBG.offsetMin.y);

        InitDialog(playername,info, head);

        DialogBox.anchoredPosition = new Vector2(-DialogBox.anchoredPosition.x, DialogBox.anchoredPosition.y);

        //设置旋转
        DialogBox.transform.localEulerAngles = new Vector3(0, 180, 0);
        DialogTxt.transform.localEulerAngles = new Vector3(0, 180, 0);
        return this;
    }

    /// <summary>
    /// 设置对方的对话位置 内容
    /// </summary>
    /// <param name="info"></param>
    /// <returns></returns>
    public DialogUI InitDialog(string playername, string info,Texture2D head)
    {
        PlayerNameTxt.text = playername;

        DialogTxt.text = info;

        //DialogBox聊天框
        //DialogTxt文本
        //preferredWidth是获取该文本的文字 最宽的一段的长度   如果超过540长度 就宽度上限了
        if ((int)(DialogTxt.preferredWidth / 540) == 0)
        {

            //没超过设置的540之前,他的宽度是 TXT和聊天框两边的差距+文字的长度   
            DialogBox.sizeDelta = new Vector2(Mathf.Abs(DialogTxt.rectTransform.sizeDelta.x) + DialogTxt.preferredWidth, DialogBox.sizeDelta.y);

        }
        else
        {
            //超过最大宽度540了 就一直设置540就好
            DialogBox.sizeDelta = new Vector2(540, DialogBox.sizeDelta.y);
        }
        //就是原本 是原本100高度+文本高度
        Dialogui.sizeDelta = new Vector2(Dialogui.sizeDelta.x, 100 + DialogTxt.preferredHeight);

        HeadImg.texture = head;
        return this;
    }

}

https://github.com/LKaiGuo/KGScriptGenerator 喜欢的给我点个星星啊
u3d萌新QQ群844087555 欢迎进来灌水=。=

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350