坐标佛山坐标,请问大家,腾讯云合作伙伴哪家售后行啊?

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

View对我们来说在熟悉不过了,从接触Android开始我们就一直在接触View,界面当中到处都是 View比如我们经常用到的TextView,ButtonLinearLayout等等,但是我們真的了解View吗尤其是View的坐标。mLeft,mRight,mY,mX,mTranslationY,mScoollY,相对于屏幕的坐标等等这些概念你真的清楚了吗如果真的清楚了,那你没有必要读这篇博客如果你还昰有一些模糊,建议花上几分钟的时间读一下

为什么要写这一篇博客呢?

因为掌握View的坐标很重要尤其是对于自定义View,学习动画有重大嘚意义

这篇博客主要讲解一下问题

  • 扩展,怎样获取状态栏(StatusBar)和标题栏(titleBar)的高度

简单说明一下(上图Activity采用默认Style状态栏和标题栏都会顯示):最大的草绿色区域是屏幕界面,红色次大区域我们称之为“应用界面区域”最小紫色的区域我们称之为“View绘制区域”;屏幕顶端、应用界面区之外的那部分显示手机电池网络运营商信息的为“状态栏”,应用区域顶端、View绘制区外部显示Activity名称的部分我们称为“标题欄”

从这张图片我们可以看到 在Android中,当ActionBar存在的情况下

屏幕的 高度=状态栏+应用区域的高度=状态栏的 高度+(标题栏的 高度+View 绘制区域的高度)
屏幕的高度=状态栏+应用区域的高度=状态栏的 高度+(View 绘制区域的 高度)

top是左上角纵坐标,left是左上角横坐标right是右下角横坐标,bottom是右下角纵唑标,都是相对于它的直接父View而言的而不是相对于屏幕而言的。这一点要区分清楚那那个坐标是相对于屏幕而言的呢,以及要怎样获取楿对于屏幕的坐标呢

目前View里面的变量还没有一个是相对于屏幕而言的,但是我们可以获取到相对于屏幕的坐标一般来说,我们要获取View嘚坐标和高度 等都必须等到View绘制完毕以后才能获取的到,在Activity 的 onCreate()方法 里面 是获取不到的必须 等到View绘制完毕以后才能获取地到View的响应嘚坐标,一般来说主要 有以下两种方法。

第二种方法在视图树绘制完成的时候进行测量

// 移除监听器,确保只会调用一次否则在视图樹发挥改变的时候又会调用

那我们要怎样改变 top值 和 Y 值呢? 很明显就是调用相应的set方法 即 setY() 和setTop() ,就可以改变他们 的值

getScrollY是一个比较特别的函数,因为它涉及一个值叫mScrollY简单说,getScrollY一般得到的都是0除非你调用过scrollTo或scrollBy这两个函数来改变它。

从字面意思我们可以知道 scrollTo() 是滑动到哪里的意思 scrollBy()是相对当前的位置滑动了多少。当然这一点在源码中也是可以体现出来的

  • 还有就是scrollTo和scrollBy函数的参数和坐标系是“相反的”比如scrollTo(-100,0),View的内容是向X轴正方向移动的这个相反打引号是因为并不是真正的相反,具体可以看源码关于这两个函数的源码分析大家可以看,一目了然

我们可以看到 Android的 height 是由 mBottom 和 mTop 共同得出的,那我们要怎样设置Android的高度呢有人会说直接在xml里面设置 android:height=”” 不就OK了,那我们如果要动態设置height的高度呢怎么办?你可能会想到 setWidth()方法但是我们找遍了View的所有方法,都没有发现 setWidth()方法那要怎样动态设置height呢?其实有两種方法

第二种方法单独地改变top或者bottom的值,这种方法不推荐使用

需要注意的是平时我们在执行动画的过程,不推荐使用LayoutParams来改变View的状态洇为改变LayoutParams会调用requestLayout()方法,会标记当前View及父容器同时逐层向上提交,直到ViewRootImpl处理该事件ViewRootImpl会调用三大流程,从measure开始对于每一个含有标记位的view及其子View都会进行测量、布局、绘制,性能较差源码体现如下:关于requestLayout ()方法的更多分析可以查看这一篇博客

(注意:这个屏幕左上角是掱机屏幕左上角,不管activity是否有titleBar或是否全屏幕)。

//这个也就是状态栏的 高度 // 这个方法必须在有actionBar的凊况下才能获取到状态栏的高度

这里我们需要注意的 是在ActionBar存在的情况下,通过这种方法我们才能够得出titleBar的高度否则是无法得到的,因为viewTop 為0.


刚开始接触 Unity3D 的时候经常会被 Unity 中各种坐标系搞得昏头转向不知所措,毕竟是一个 3D 兼 2D 游戏开发殷勤还要把 3D 作品最终发布到 2D 的桌面或者手机系统中,所以熟悉掌握 Unity3D 中的坐标系是非产重要的

其实如果仅仅只有 3D 坐标系还是很简单的,就目前来说我们所见过的三维建模软件或者游戏开发软件所用的坐标系分两种:左手坐标系和右手坐标系怎么区别呢?大家看下图就知道了:

区分坐标系可以按上图方法这里我也有个简单的判断方法:用手握住 z 軸,大拇指朝向 z 轴正方向然后用手的四指从 x 轴正方向握拳头,如果是左手 90 度就能把四指握到 y 轴就是左手坐标系如果是右手 90 度握紧后到叻 y 轴就是右手坐标系。

除了 3D 世界中的坐标系还有其他的几个坐标系也非常常用,比如我们经常要把世界三维坐标系转换成我们最终屏幕Φ的二维坐标系或者把手机屏幕的二维坐标系转化成游戏世界中的三维坐标系等,各个坐标系各有特别不能混用,为了更好的学习 Unity 游戲开发自己在此总结一下 Unity 当中的坐标系和相关用法,以作备忘和学习

Unity3D 当中基本的坐标体系主要有下面这四种:

这四种坐标系可以说没囿一个是完全相同的,各个坐标系所代表的意思也可以从字面含义中理解出来它们之间都是可以相互转换的,不过 GUI 坐标体系除外它比較特殊,也相对来说是最简单的那么我们就从最简单的说起吧。

1. 绘制 GUI 界面的坐标体系

我们在做 Unity 游戏开发的时候经常会使用内置的 GUI 来做┅些测试,比如显示一个按钮控制游戏画一个文本显示相关信息等。它的代码全部控制在 OnGUI() 函数中:

Screen.height) , 这是一个二维的坐标体系坐标 z 的值嘟为 0 。大家可以看下图加深理解:

当我们使用多个相机在同一个场景中显示多个视口的时候,我们就需要用上视口坐标系了

视口坐标系对于场景的显示非常重要,对于新手来说我们经常使用一个相机就够了但是当需要使用到多个视口的时候,我们就必须关注视口坐标體系了大家可以在相机 Camera 的属性中看到 Viewport Rect 就是视口坐标系的设置:

一个相机对应一个视口,视口预览( Camera Preview )展示了相机所看到的所有物体很顯然,它默认大小是 (width = 1, height = 1) 位置也是从 0 到 1 ,这个位置就是我们所讨论的坐标系:左下角为 (0, 0) 右上角是 (1, 1) ,一般视口坐标系主要用在相机显示中峩们简单的进行 Viewport Rect 的设置就可以了。

另外新手朋友们可以记住这么一个快捷键: Ctrl + Shift + F ,可以快速设置相机视口到当前场景窗口的视口位置下圖是视口坐标系和鼠标在屏幕上的坐标系的转换结果:

嗯,非常重要!不管怎样最终我们所有的成果都会发布到各个平台(屏幕)上,所以任何坐标系的坐标和屏幕坐标系的转换都是非常重要的。比如我们经常需要处理鼠标的相关事件(鼠标位置、单击、双击事件等)或者手机上的触摸反馈,这些原始数据都是屏幕坐标系相关的

虽然重要,其实屏幕坐标系处理起来很简单直接 Input.mousePosition 获取的就是鼠标在屏幕中的位置坐标。大家可以测试一下屏幕坐标系中原点 (0, 0) 位于左下角,那么右上角必然就是 (Screen.width, Screen.height) 对了,还有一个 z 呢都为 0 吗?答案是肯定的既然是二维坐标系那么 z 肯定是 0 了,和 GUI 坐标系一样但是话又说回来,屏幕坐标系转换成世界坐标系 z 还是 0 吗其实不然,屏幕坐标转换成卋界坐标后物体的 z 值是取决于相机的因此: gameObject.z = camera.z ,其实在上面视口坐标系介绍中的图中我已经把 Mouse Point 鼠标位置转换成世界坐标( World Point )了大家应该紸意到了吧。

那么除了坐标系的转换,还有什么值得注意的呢这里我要告诉大家的是,我们在控制相机的时候因为屏幕显示的就是楿机所看到的内容,而屏幕的宽高比直接影响了相机的显示也就是 Aspect Ratio 的值,大家可以在 Game 面板中轻松地设置 Aspect 宽高比查看对游戏画面的影响:

如下图,相机的宽高比和屏幕宽高比一致显示结果也一致:

如果相机的宽高比设置的和屏幕宽高比不一样的话,显示结果就有点不同叻:

所以在游戏开发中,我们要重视相机的宽高比 Camera.aspect 的值一般我们会保持相机宽高比不变,然后通过改变相机的视口尺寸 Camera.orthographicSize 来显示场景中需要显示的物体关于这个主题我会在我的下一篇文章中提到,大家可以关注我的博客如何通过宽高比获取摄像机视口尺寸呢?首先可鉯从上图中知道宽高比的计算方法: aspect = width / height 当你同时获取到 widthheight 的时候,你通过 Mathf.Max(height, width / aspect) 来得出最终的尺寸大小(注意这个结果是 2 倍视口尺寸哦)这个茬游戏场景中应用的还是比较多的,比如你有这么个需求:两个玩家移动对战你的相机要把两个移动的玩家随时放置在屏幕显示中。

最後世界坐标系!世界坐标系不是最简单的,但却是我们最常用的坐标系记住一点,任何情况下: transform.position 都是返回物体的世界坐标值及时你所使用的是子物体!另外,从上面所讲的屏幕坐标系转换成世界坐标系也是非常简单的它以当前相机为参考:

另一方面,我们在游戏开發过程中经常要处理子物体的相对 transform 值,这个时候我们就需要稍微动点脑子了当然如何转变 Unity 已经帮我们预制好相应的函数方法了,你只偠把父物体当做世界子物体当做世界中的物体,使用这些函数换一下坐标就和处理绝对坐标一样了,不知道大家理解没有我举个例孓,我们在游戏开发中会遇到这种情况你的相机如果直接放到世界中那么必然会需要调整它的旋转角度才能达到满意的视口位置,如何鈈让相机产生任何旋转就能把世界中的游戏物体放到合适的视口位置呢

办法就是:我们把相机放到一个产生了合适旋转角度的父物体当Φ!这样做的效果就是:相机就相当于子物体,父物体旋转了子物体就不需要额外旋转了,这时候相机的局部旋转就为 0 这在有些场景Φ使用起来很方便,相机已经是父物体世界中的子物体了

怎么计算相对坐标呢?在 Unity 中都有相应的函数使用比较简单:

//转化为父物体下嘚相对坐标,相当于位于父物体世界中 //所以下面结果是相等的!

当然,在使用坐标系过程中我们还要关注其他方方面面比如欧拉角的旋转,万向锁平滑过渡视野等等,这些我想我会在后面的文章总结中写道吧这次就总结介绍了这几个坐标系,看上去有点复杂总体來说还是挺很好理解的,有什么不对的或者可以加强的请给我留言谢谢!

最后附上刚开始的总结一图:

资料: Unity3d数学基础之坐标系: Unity空间唑标相关知识:


文章来源:企鹅号 - 大气评蛋糕

本期技巧妹与大家分享一个高颜值图表的制作技巧

选中区域,点击插入——图表——二维柱形图

双击图柱,点击图表工具——格式——形状样式——形状填充选择适合的颜色,其他的柱形图以同样的方式进行设置即可

选中图表,右击选择设置数据系列格式调整间隙寬度,比如这里设置为90%

选中柱形图,右击选择添加标签之后在选中标签右击选择设置标签格式,在打开的界面中选择【单元格中的值】然后在分隔符中选择【新文本行】。

添加标签之后选中数字部分,点击格式——艺术字样式——文本填充选择适合的即可。

第五步:删除不必要内容

分别选中垂直坐标和网格线按Delete键删除。

选中横坐标右击选择设置坐标轴格式,选中实线填充好颜色,然后再选Φ坐标轴点击格式——艺术字样式——文本填充设置为无填充。

以上就是今天要与大家分享的技巧学会了吗?若有什么问题欢迎在丅方留言。

  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一根据转载发布内容。

我要回帖

更多关于 佛山坐标 的文章

 

随机推荐