-
Unity UGUI图文混排(五) -- 一张图集对应多个Text
2016-10-14 19:54:34继上一篇说的更新了一张图集对应多个Text的功能,为了节省资源嘛 这里,但是也没有舍弃之前的一个Text一个图集,因为我感觉应该两个都有用,于是我重新写了一个脚本 1.其实大体跟前面的都没变,解析标签,获取表情...继上一篇说的更新了一张图集对应多个Text的功能,为了节省资源嘛
这里,但是也没有舍弃之前的一个Text一个图集,因为我感觉应该两个都有用,于是我重新写了一个脚本
1.其实大体跟前面的都没变,解析标签,获取表情的相关数据,这里只是将绘制图片的功能,移植到SpriteGraphic上,本地增加了一个刷新图片绘制信息的函数。
麻烦的是去找到SpriteGraphic绘制图片,也是因为这个感觉有很大的潜在问题,不过基本能用,具体看脚本
2.这里新写了一个SpriteGraphicManager脚本用来管理SpriteGraphic的图片绘制,和获取InlieSpriteText传来的相关绘制图片的信息,SpriteGraphicManager就是绑定在SpriteGraphic上的,因为UGUI的渲染顺序是从上到下,SpriteGraphic的放置位置就显得比较尴尬了,应该可以用shader更改渲染层级,没去试,先这样吧,我这里将SpriteGraphic放在最下面的using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; using System.Text.RegularExpressions; public class InlieSpriteText : Text { /// <summary> /// 用正则取标签属性 名称-大小-宽度比例 /// </summary> private static readonly Regex m_spriteTagRegex = new Regex(@"<quad name=(.+?) size=(\d*\.?\d+%?) width=(\d*\.?\d+%?) />", RegexOptions.Singleline); /// <summary> /// 图片资源 /// </summary> private SpriteAsset m_spriteAsset; /// <summary> /// 图片渲染组件 /// </summary> private SpriteGraphic m_spriteGraphic; /// <summary> /// CanvasRenderer /// </summary> private CanvasRenderer m_spriteCanvasRenderer; /// <summary> /// 图片渲染管理 /// </summary> private SpriteGraphicManager m_SGManager; #region 动画标签解析 //最多动态表情数量 int AnimNum = 8; // List<int> m_AnimIndex; List<SpriteTagInfor[]> m_AnimSpiteTag; public List<InlineSpriteInfor[]> m_AnimSpriteInfor; #endregion /// <summary> /// 初始化 /// </summary> protected override void OnEnable() { //在编辑器中,可能在最开始会出现一张图片,就是因为没有激活文本,在运行中是正常的。可根据需求在编辑器中选择激活... base.OnEnable(); //对齐几何 alignByGeometry = true; #region 为了将SpriteGraphicManager显示到最上级,这里的SpriteGraphicManager可能会放在最下面,所以需要从全局去找 if (m_SGManager == null) m_SGManager = GameObject.FindObjectOfType<SpriteGraphicManager>(); #endregion if (m_SGManager != null) { m_spriteGraphic = m_SGManager.GetComponent<SpriteGraphic>(); m_spriteCanvasRenderer = m_SGManager.GetComponent<CanvasRenderer>(); m_spriteAsset = m_spriteGraphic.m_spriteAsset; } //初始化 调用顶点绘制 SetVerticesDirty(); } /// <summary> /// 在设置顶点时调用 /// </summary> public override void SetVerticesDirty() { base.SetVerticesDirty(); // m_AnimIndex = new List<int>(); m_AnimSpiteTag = new List<SpriteTagInfor[]>(); foreach (Match match in m_spriteTagRegex.Matches(text)) { if (m_spriteAsset == null) return; #region 解析动画标签 List<string> tempListName = new List<string>(); for (int i = 0; i < m_spriteAsset.listSpriteInfor.Count; i++) { // Debug.Log((m_spriteAsset.listSpriteInfor[i].name)); if (m_spriteAsset.listSpriteInfor[i].name.Contains(match.Groups[1].Value)) { tempListName.Add(m_spriteAsset.listSpriteInfor[i].name); } } if (tempListName.Count > 0) { SpriteTagInfor[] tempArrayTag = new SpriteTagInfor[tempListName.Count]; for (int i = 0; i < tempArrayTag.Length; i++) { tempArrayTag[i] = new SpriteTagInfor(); tempArrayTag[i].name = tempListName[i]; tempArrayTag[i].index = match.Index; tempArrayTag[i].size = new Vector2(float.Parse(match.Groups[2].Value) * float.Parse(match.Groups[3].Value), float.Parse(match.Groups[2].Value)); tempArrayTag[i].Length = match.Length; } m_AnimSpiteTag.Add(tempArrayTag); } #endregion } } readonly UIVertex[] m_TempVerts = new UIVertex[4]; /// <summary> /// 绘制模型 /// </summary> /// <param name="toFill"></param> protected override void OnPopulateMesh(VertexHelper toFill) { // base.OnPopulateMesh(toFill); if (font == null) return; // We don't care if we the font Texture changes while we are doing our Update. // The end result of cachedTextGenerator will be valid for this instance. // Otherwise we can get issues like Case 619238. m_DisableFontTextureRebuiltCallback = true; Vector2 extents = rectTransform.rect.size; var settings = GetGenerationSettings(extents); cachedTextGenerator.Populate(text, settings); Rect inputRect = rectTransform.rect; // get the text alignment anchor point for the text in local space Vector2 textAnchorPivot = GetTextAnchorPivot(alignment); Vector2 refPoint = Vector2.zero; refPoint.x = (textAnchorPivot.x == 1 ? inputRect.xMax : inputRect.xMin); refPoint.y = (textAnchorPivot.y == 0 ? inputRect.yMin : inputRect.yMax); // Determine fraction of pixel to offset text mesh. Vector2 roundingOffset = PixelAdjustPoint(refPoint) - refPoint; // Apply the offset to the vertices IList<UIVertex> verts = cachedTextGenerator.verts; float unitsPerPixel = 1 / pixelsPerUnit; //Last 4 verts are always a new line... int vertCount = verts.Count - 4; toFill.Clear(); //清楚乱码 for (int i = 0; i < m_AnimSpiteTag.Count; i++) { if (m_AnimSpiteTag[i].Length > 0) { //UGUIText不支持<quad/>标签,表现为乱码,我这里将他的uv全设置为0,清除乱码 for (int m = m_AnimSpiteTag[i][0].index * 4; m < m_AnimSpiteTag[i][0].index * 4 + 4; m++) { UIVertex tempVertex = verts[m]; tempVertex.uv0 = Vector2.zero; verts[m] = tempVertex; } } } //计算标签 其实应该计算偏移值后 再计算标签的值 算了 后面再继续改吧 // CalcQuadTag(verts); if (roundingOffset != Vector2.zero) { for (int i = 0; i < vertCount; ++i) { int tempVertsIndex = i & 3; m_TempVerts[tempVertsIndex] = verts[i]; m_TempVerts[tempVertsIndex].position *= unitsPerPixel; m_TempVerts[tempVertsIndex].position.x += roundingOffset.x; m_TempVerts[tempVertsIndex].position.y += roundingOffset.y; if (tempVertsIndex == 3) toFill.AddUIVertexQuad(m_TempVerts); } } else { for (int i = 0; i < vertCount; ++i) { int tempVertsIndex = i & 3; m_TempVerts[tempVertsIndex] = verts[i]; m_TempVerts[tempVertsIndex].position *= unitsPerPixel; if (tempVertsIndex == 3) toFill.AddUIVertexQuad(m_TempVerts); } } //计算标签 计算偏移值后 再计算标签的值 List<UIVertex> vertsTemp = new List<UIVertex>(); for (int i = 0; i < vertCount; i++) { UIVertex tempVer=new UIVertex(); toFill.PopulateUIVertex(ref tempVer,i); vertsTemp.Add(tempVer); } CalcQuadTag(vertsTemp); m_DisableFontTextureRebuiltCallback = false; //更新绘制图片信息 if(m_SGManager!=null) m_SGManager.UpdateSpriteInfor(); //DrawSprite(); } private IList<UIVertex> _OldVerts; #region 计算标签 /// <summary> /// 解析quad标签 主要清除quad乱码 获取表情的位置 /// </summary> /// <param name="verts"></param> void CalcQuadTag(IList<UIVertex> verts) { m_AnimSpriteInfor = new List<InlineSpriteInfor[]>(); Vector3 _TempStartPos = Vector3.zero; if(m_SGManager!=null) _TempStartPos = transform.position - m_SGManager.transform.position; for (int i = 0; i < m_AnimSpiteTag.Count; i++) { SpriteTagInfor[] tempTagInfor = m_AnimSpiteTag[i]; InlineSpriteInfor[] tempSpriteInfor = new InlineSpriteInfor[tempTagInfor.Length]; for (int j = 0; j < tempTagInfor.Length; j++) { tempSpriteInfor[j] = new InlineSpriteInfor(); tempSpriteInfor[j].textpos = _TempStartPos + verts[((tempTagInfor[j].index + 1) * 4) - 1].position; //设置图片的位置 tempSpriteInfor[j].vertices = new Vector3[4]; tempSpriteInfor[j].vertices[0] = new Vector3(0, 0, 0) + tempSpriteInfor[j].textpos; tempSpriteInfor[j].vertices[1] = new Vector3(tempTagInfor[j].size.x, tempTagInfor[j].size.y, 0) + tempSpriteInfor[j].textpos; tempSpriteInfor[j].vertices[2] = new Vector3(tempTagInfor[j].size.x, 0, 0) + tempSpriteInfor[j].textpos; tempSpriteInfor[j].vertices[3] = new Vector3(0, tempTagInfor[j].size.y, 0) + tempSpriteInfor[j].textpos; //计算其uv Rect newSpriteRect = m_spriteAsset.listSpriteInfor[0].rect; for (int m = 0; m < m_spriteAsset.listSpriteInfor.Count; m++) { //通过标签的名称去索引spriteAsset里所对应的sprite的名称 if (tempTagInfor[j].name == m_spriteAsset.listSpriteInfor[m].name) newSpriteRect = m_spriteAsset.listSpriteInfor[m].rect; } Vector2 newTexSize = new Vector2(m_spriteAsset.texSource.width, m_spriteAsset.texSource.height); tempSpriteInfor[j].uv = new Vector2[4]; tempSpriteInfor[j].uv[0] = new Vector2(newSpriteRect.x / newTexSize.x, newSpriteRect.y / newTexSize.y); tempSpriteInfor[j].uv[1] = new Vector2((newSpriteRect.x + newSpriteRect.width) / newTexSize.x, (newSpriteRect.y + newSpriteRect.height) / newTexSize.y); tempSpriteInfor[j].uv[2] = new Vector2((newSpriteRect.x + newSpriteRect.width) / newTexSize.x, newSpriteRect.y / newTexSize.y); tempSpriteInfor[j].uv[3] = new Vector2(newSpriteRect.x / newTexSize.x, (newSpriteRect.y + newSpriteRect.height) / newTexSize.y); //声明三角顶点所需要的数组 tempSpriteInfor[j].triangles = new int[6]; } m_AnimSpriteInfor.Add(tempSpriteInfor); _OldVerts = verts; } } #endregion #region 更新图片的信息 public void UpdateSpriteInfor() { if (_OldVerts == null) return; CalcQuadTag(_OldVerts); } #endregion }
3.差不多一张图集对应多个Text的功能就完了,看一下截图,因为这都是根据之前的更新的,看了之前工程的同学都应该能看明白,我架设你们都看过了using UnityEngine; using System.Collections; using System.Collections.Generic; /******** 为了图片渲染在最上面 需要将他放砸canvas的最下层 应该可以改shader的渲染顺序 没去试 就这样写吧 *********/ [RequireComponent(typeof(SpriteGraphic))] public class SpriteGraphicManager : MonoBehaviour { /// <summary> /// 需要渲染的图片信息列表 /// </summary> private List<InlineSpriteInfor> listSprite; #region 动画标签解析 //最多动态表情数量 int AnimNum = 8; List<InlineSpriteInfor[]> m_AnimSpriteInfor; #endregion #region 更新图片信息 public void UpdateSpriteInfor() { listSprite = new List<InlineSpriteInfor>(); m_AnimSpriteInfor = new List<InlineSpriteInfor[]>(); // inline // InlieSpriteText[] AllInlieSpriteText = GetComponentsInChildren<InlieSpriteText>(); // 找到所有InlieSpriteText的物体 ---- 这里隐藏问题蛮大的 他搜索的所有的InlieSpriteText // 包括InlieSpriteText也是全局搜索的SpriteGraphicManager,意思SpriteGraphicManager最好只有一个 // 当然 可以自定义根据功能 自己改了 我这里是这么定义的 InlieSpriteText[] AllInlieSpriteText = GameObject.FindObjectsOfType<InlieSpriteText>(); for (int i = 0; i < AllInlieSpriteText.Length; i++) { if (AllInlieSpriteText[i].m_AnimSpriteInfor != null) { AllInlieSpriteText[i].UpdateSpriteInfor(); for (int j = 0; j < AllInlieSpriteText[i].m_AnimSpriteInfor.Count; j++) { m_AnimSpriteInfor.Add(AllInlieSpriteText[i].m_AnimSpriteInfor[j]); listSprite.Add(AllInlieSpriteText[i].m_AnimSpriteInfor[j][0]); } } } DrawSprite(); } #endregion #region update刷新动画 float fTime = 0.0f; int iIndex = 0; void Update() { if (m_AnimSpriteInfor == null) return; fTime += Time.deltaTime; if (fTime >= 0.1f) { //刷新一次 更新绘制图片的相关信息 UpdateSpriteInfor(); for (int i = 0; i < m_AnimSpriteInfor.Count; i++) { if (iIndex >= m_AnimSpriteInfor[i].Length) { listSprite[i] = m_AnimSpriteInfor[i][0]; } else { listSprite[i] = m_AnimSpriteInfor[i][iIndex]; } } DrawSprite(); iIndex++; if (iIndex >= AnimNum) { iIndex = 0; } fTime = 0.0f; } } #endregion #region 绘制图片 /// <summary> /// 绘制图片 /// </summary> void DrawSprite() { Mesh m_spriteMesh = new Mesh(); List<Vector3> tempVertices = new List<Vector3>(); List<Vector2> tempUv = new List<Vector2>(); List<int> tempTriangles = new List<int>(); for (int i = 0; i < listSprite.Count; i++) { for (int j = 0; j < listSprite[i].vertices.Length; j++) { tempVertices.Add(listSprite[i].vertices[j]); } for (int j = 0; j < listSprite[i].uv.Length; j++) { tempUv.Add(listSprite[i].uv[j]); } for (int j = 0; j < listSprite[i].triangles.Length; j++) { tempTriangles.Add(listSprite[i].triangles[j]); } } //计算顶点绘制顺序 for (int i = 0; i < tempTriangles.Count; i++) { if (i % 6 == 0) { int num = i / 6; tempTriangles[i] = 0 + 4 * num; tempTriangles[i + 1] = 1 + 4 * num; tempTriangles[i + 2] = 2 + 4 * num; tempTriangles[i + 3] = 1 + 4 * num; tempTriangles[i + 4] = 0 + 4 * num; tempTriangles[i + 5] = 3 + 4 * num; } } m_spriteMesh.vertices = tempVertices.ToArray(); m_spriteMesh.uv = tempUv.ToArray(); m_spriteMesh.triangles = tempTriangles.ToArray(); if (m_spriteMesh == null) return; GetComponent<CanvasRenderer>().SetMesh(m_spriteMesh); GetComponent<SpriteGraphic>().UpdateMaterial(); } #endregion }
4.这里还更新了一个小东西,就是做聊天demo的时候感觉之前的标签太长,比如<quad name=meat size=20 width=1 />,确实有点长,本来应该表情也绘制在输入框的,一是自己也没去测试,二是有同学已经测试,但是发现不少问题,我暂时也就将标签缩短了<#meat>
5.之前的工程的基本功能都是基本完善的,最新的基本都是一些功能和逻辑上的扩展: 工程链接
-
五大浏览器对应的内核
2018-07-07 17:31:03写这个文章是为了让自己容易快速找到。简单粗暴 ^3^ 晴天雨天不如前端在身边 各浏览器对应的内核 谷歌:Webkit–&gt;blink(现在是blink啦) FireFox:Gecko safari:webkit opera: presto IE:Trident...写这个文章是为了让自己容易快速找到。简单粗暴 ^3^ 晴天雨天不如前端在身边
各浏览器对应的内核
谷歌:Webkit–>blink(现在是blink啦)
FireFox:Gecko
safari:webkit
opera: presto
IE:Trident
-
五个温度带的分界线_我国六个温度带名称及其所对应的分界线
2021-01-14 10:27:22满意答案 jinxin9877 2013.04.28 采纳率:41% 等级:12 已...根据积温的分布,中国划分了5个温度带和一个特殊的青藏高原区。不同的温度带内热量不同,生长期长短不一,耕作制度和作物种类也有明显差别。 22分享举报满意答案
jinxin9877
2013.04.28
采纳率:41% 等级:12
已帮助:10114人
热带,亚热带,暖温带,中温带,寒温带,青藏高原区
=====================================================
热带 >8000℃
365
海南全省和滇、粤、台三省南部
水稻一年三熟
水稻、甘蔗、天然橡胶等
亚热带
4500℃
秦岭—淮河以南,青藏高原以东
一年二至三熟
水稻、冬麦、棉花、油菜等
暖温带
3400°—4500℃
171—218
黄河中下游大部分地区及南疆
一年一熟至两年三熟
冬麦、玉米、棉花、花生等
中温带
1600°—3400℃
100—171
东北、内蒙古大部分及北疆
一年一熟
春麦、玉米、亚麻、大豆、甜菜等
寒温带
<1600℃
<100
黑龙江省北部及内蒙古东北部
一年一熟
春麦、马铃薯等
青藏高原区
<2000℃
(大部分地区)
0—100
青藏高原
部分地区一年一熟
青稞等
中国的温度带 中国采用积温来划分温度带,当日平均气温稳定升到10℃以上时,大多数农作物才能活跃生长,所以通常把日平均气温连续≥10℃的天数叫生长期。把生长期内每天平均气温累加起来的温度总和叫积温。一个地区的积温,反映了该地区的热量状况。根据积温的分布,中国划分了5个温度带和一个特殊的青藏高原区。不同的温度带内热量不同,生长期长短不一,耕作制度和作物种类也有明显差别。
22分享举报
-
网络五层协议与每层对应的协议
2020-09-13 23:19:02五层协议 物理层–数据链路层–网络层–传输层–应用层 (会话层、表示层) 物理层 为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成。 包括的协议: 1000BASE-SX、1000...五层协议
物理层–数据链路层–网络层–传输层–应用层 (会话层、表示层)
物理层
为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成。
- 包括的协议:
1000BASE-SX、1000BASE-LX、1000BASE-CX
数据链路层
- 数据链路层:
为网络层提供数据传送服务 - 包括的协议:
点对点协议 PPP:
CSMA/CD 协议:具有冲突检测的载波监听多点接入协议,特点是:发送前先监听、边发送边监听,一旦发现总线上出现了碰撞就立即停止发送,然后按退避算法等待一段随机时间后再次发送
Frame Relay, HDLC, PPP, IEEE 802.3/802.2, FDDI, ATM, IEEE 802.5/802.2
网络层
-
网络层:
路由选择和中继.
激活,终止网络连接.
在一条数据链路上复用多条网络连接,多采取分时复用技术 .
差错检测与恢复.
排序,流量控制.
服务选择.
网络管理 -
包括的协议:
网际协议 IP
地址解析协议 ARP
网际控制报文协议 ICMPIP、ICMP、ARP、RARP、IGMP
传输层
- 传输层:
传输层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用 - 包括的协议: -
TCP UDP SPX
应用层
- 应用层:
应用层向应用程序提供服务 - 包括的协议: -
HTTP, DNS, SMTP,FTP ,Telnet ,SNMP,POP3
- 包括的协议:
-
JSP提供了八个内部对象,而其中的五个内部对象对应于Servlet API中的七个对象
2015-10-19 09:36:11JSP提供了八个内部对象,而其中的五个内部对象对应于Servlet API中的七个对象,这也就使得我们正常理解并熟练使用Servlet中的这七个对象显得尤其重要。这五个JSP的内部对象和Servlet API中的对象的对应关系是: ... -
一、OSI七层模型 功能 对应的网络协议 TCPIP五层模型
2020-10-19 14:08:46一、OSI七层模型 功能 对应的网络协议 TCPIP五层模型 OSI七层模型 功能 对应的网络协议 TCP/IP五层概念模型 应用层 网络服务与最终用户的一个接口,人机交互窗口,把人的语言输入到计算机当中。例如,在QQ的... -
怎样让一个按钮对应一个滚板
2011-07-26 01:14:29碰到一个难题:我用空布局创建了五个按钮,这五个按钮分别对应五个滚板,怎样给这五个按钮添加事件,每单击一个按钮,显示对应的滚板 -
网络五层协议-与每层对应的协议
2016-11-11 09:43:15五层协议物理层--数据链路层--网络层--传输层--应用层 (会话层、表示层) 1.物理层- 物理层: - 为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成。 - 包括的协议: - ... -
python如何输入一个整数逆序输出_输入一个不大于五位的正整数,输出对应位数的数字和逆序的数字...
2021-01-07 10:37:29输入一个不大于五位的正整数,输出对应位数的数字和逆序的数字#include<stdio.h>void main(){int x;printf("请您输入一个不大于五位的正整数x:");scanf("%d",&x);if(x>=0){if(x<10){printf("一位... -
输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V~Z, 则转换为对应...
2018-04-26 22:24:57输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V~Z, 则转换为对应小写字母的值减21。其他字符不变,输出转换.#include<stdio.h> #include<string.h&... -
5号字对应的数字字号_我想要个字号对照表,就比如五号字对应10.5磅,更详细一点的更好...
2020-12-20 13:52:01满意答案ABCwsm推荐于 2018.05.11采纳率:45%等级:12已帮助:13128人中文版Word中使用“字号”,如五号、小四……但事实上Word是基于英文的软件,在Word内部处理字号大小用的是“磅数”,比如12磅、10.5磅等等,... -
英文十二个月对应
2020-06-01 17:49:41五月-- --May – --May. 六月-- --June – --Jun. 七月-- --July – --Jul. 八月-- --August – --Aug. 九月-- --September – --Sept. 十月-- --October – --Oct. 十一月-- --November – --Nov. 十 -
PMBOK第六版和汪博士解读PMP考试第五版(对应PMBOK6)
2018-08-08 22:37:05PMBOK第六版以及对应PMP考试的解读。这两个都是当前最新的资源。 -
UML类图五种关系与代码的对应关系
2017-11-17 16:26:23五种关系的耦合强弱比较:依赖关联聚合组合继承 一、依赖关系: 1.说明:虚线+剪头,可描述为Use a 依赖是类的5种关系中耦合最小的一种关系,因为在生成代码的时候,这两个关系类都不会增加属性 2.依赖... -
HEVC学习之琐事(五):pcPicYuvOrg与getPicYuvOrg()的对应关系
2015-01-07 09:28:01这两天一直纠结于pcPicYuvOrg与getPicYuvOrg()的对应关系,这是因为我自定义了一个pcPicYuvBgf与getPicYuvBgf(),初衷是实现类似于pcPicYuvOrg与getPicYuvOrg()的对应关系,以便于我后面的处理。调试了两天,最后才... -
找出第 N 个数对应的数字
2017-05-31 00:05:17在这个序列中第 1 位 是 0 ,第五位是 4 , 第 11 位是 1 ,我们现在要求第 n 位对应的数字。 思路: 最简单的方法是从 0 开始,累加数字,最终刚好得到第 n 位数字,或者刚好比 n 多的数字,再求对应数字。但是... -
实验4.2三个学生、五门课程的成绩分别存放在4×6矩阵的前3×5列,计算出每个学生的平均成绩存放在该数组的...
2019-02-14 18:15:06三个学生、五门课程的成绩分别存放在4×6矩阵的前3×5列,计算出每个学生的平均成绩存放在该数组的最后一列的对应行上。 计算单科的成绩总和存放在最后一行的对应列上,并输出单科成绩的平均分。 要求: (1)数组... -
Redis:基础篇——五种数据类型及分别对应的命令详解
2018-12-11 18:38:20Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset...特征:一个 key 对应一个 value。 string 类型是二进制安全的,可进行位运算。 string 类型的值最大能存储 5... -
七升七降调号_巧识五线谱08:如何记住七个“降号调”的调号与调的对应关系?...
2020-12-23 22:26:59提要:高音谱表中七个降号调的调号如何根据五线谱的调号判断曲谱是什么调的?调号中的变音记号应该标在谱表的哪些线或间上?F调的调号、F调音阶在键盘和谱表中的位置1.高音谱表中七个降号调的调号七个含有降号的调号... -
C语言编程题 输入一个百分制成绩,输出对应的五级制成绩“优秀”、“良好“、”中等“、”及格“、”不及格...
2020-03-09 17:36:51输入一个百分制成绩,输出对应的五级制成绩“优秀”、“良好“、”中等“、”及格“、”不及格“,对应关系如下: 优秀:90-100分; 良好:80-89分; 中等:70-79分; 及格:60-69分 不及格:分数低于60分。 -
怎样写这样一个事件,让一个按钮对应一个滚板,单击按钮显示对应的滚板
2011-07-26 11:16:08// 为五个功能按钮设置事件监听器btn_linkman.addMouseListener(new MouseListener(){@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated me -
【设计模式系列】之《UML五种关系与代码的对应关系》
2013-05-06 14:25:52五种关系的耦合强弱比较:依赖关联聚合组合...因为在生成代码的时候,这两个关系类都不会增加属性。 (二)依赖关系图与代码的对应关系 (PS:依赖关系:Animal依赖于Water(动物依赖于水)) Public class Animal -
数字形式转换,输入0123456789对应输出“一二三四五六七八九”
2019-09-27 16:12:07获得用户输入的一个正整数输入,输出该数字对应的中文字符表示。... -
Qt原理分析(五):Qt中信号与槽的对应关系
2019-07-16 10:11:11Qt中信号与槽的对应关系 到目前为止,我们已经可以吧信号与槽连接在一起了。但我们还需要考虑一些其他的可能性。例如下图所示: 一个信号连接多个槽(一对多) 如signal5连接了slot2和slot3。 void one_to_multi() ... -
C语言编程>第二十五周 ② 下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,...
2021-01-24 17:22:09例题:下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,若为小写字母为v~z,使小写字母的值减21,转换后的小写字母作为函数值返回。 例如,若形参是字母A,则转换为小写字母f;若形参... -
【五角星】上机练习之字符串与数字对应
2014-02-11 12:42:32需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入格式 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出. ...
-
linux c uart 串口通信 应用层代码
-
Git&GitHub入门(MAC)
-
js浅拷贝、深拷贝的实现
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
PPT大神之路高清教程
-
信息安全体系风险评估.ppt
-
MySQL Router 实现高可用、负载均衡、读写分离
-
FTP 文件传输服务
-
华为1+X认证——网络系统建设与运维(初级)
-
【花式GIS】QGIS加地图服务
-
MySQL 主从复制 Replication 详解(Linux 和 W
-
华为1+X——网络系统建设与运维(高级)
-
linux c 通过http 协议 ,上传文件到服务器 源码
-
【福尔摩斯探案集】数据库和应用程序时间出现14小时时差之迷
-
ubuntu20.04上搭建linux内核驱动调试环境
-
2020年Java面试208题 009-String类的常用方法有哪些
-
伊顿穆勒.rar电气设备选型资料大全 (适合刚刚入行的电气工程师对设备进行选型规划)详解 报价
-
【硬核】一线Python程序员实战经验分享(1)
-
朱老师鸿蒙系列课程第1期-2鸿蒙系统Harmonyos源码架构分析
-
(超详细笔记记录)从头开始学Spring 其二