今天小编给大家分享一下Java Swing类的Layout布局相关知识有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先,还是从ViewRootImpl
说起,界面的绘制会触发performMeasure、performLayout
方法,而在performLayout
方法中就会调用mView的layout
方法开始一层层View的布局工作。mView
我们都知道了,就是顶层View——DecorView
,那么就进去看看DecorView
的layout方法:不好意思,DecorView中并没有layout方法…所以,我们直接看看View的layout
方法:首先,方法传入了四个参数,分别代表view的左、上、下、右
四个值。然后通过setOpticalFrame
方法或者setFrame
方法判断布局参数是否改变。具体判断过程就是通过老的上下左右值和新的上下左右值进行比较,逻辑就在setFrame
方法中:如果上下左右有一个参数值发生了改变,就说明这个View的布局发生了改变,然后重新计算View的宽度高度(newWidth、newHeight),并赋值了View新的上下左右参数值。在这个layout
方法中主要涉及到了四个参数:mLeft、mTop、mBottom、mRight
,分别代表了View的左坐标、上坐标、下坐标和右坐标,你可以把View理解为一个矩形,确定了这四个值,就能确定View矩形的四个顶点值,也就能确定View在画布中的具体位置。所以,layout
方法到底干了啥?就是传入上下左右值
、然后赋值上下左右值
、完毕。然后我们就可以根据这些值获取View的一系列参数,比如View宽度:至此,View的layout
方法就结束了,主要就是通过对上下左右参数的赋值完成对View的布局,非常简单。下面看看ViewGroup
。额,还是调用到View的layout
方法,难道说ViewGroup
和View
的布局过程是一样的,就是确定了本身的位置?那ViewGroup
的子View怎么办呢?不急,我们刚才说layout
方法的时候还漏了一个onLayout
方法,只不过这个方法在View
里面是空实现,而到了ViewGroup
中变成了一个抽象方法:也就是任何ViewGroup
都必须实现这个方法,来完成对子View
的布局摆放。具体的布局摆放逻辑就是在onLayout
方法中一个个调用子View
的layout方法,然后完成每个子View的布局,最终完成绘制工作。接下来我们就来自己实现一个垂直线性布局(类似LinearLayout)
,正好复习下上一节的onMearsure免费云主机域名
和这一节的onLayout
。首先,我们要确定我们这个自定义ViewGroup
的作用,是类似垂直方向的LinearLayout
功能,在该ViewGroup下的子View
可以按垂直线性顺序依次往下排放。我们给它起个名字叫VerticalLayout
~继承ViewGroup首先,我们这个布局肯定要继承自ViewGroup
,并且实现相应的构造方法:重写generateLayoutParams方法自定义ViewGroup还需要重写的一个方法是generateLayoutParams,这一步是为了让我们的ViewGroup支持Margin,后续我们就可以通过MarginLayoutParams来获取子View的Margin值。重写测量方法onMeasure然后,我们需要对我们的布局进行测量,也就是重写onMeasure
方法。在该方法中,我们需要对我们的布局进行测量,并且将测量好的宽高传入setMeasuredDimension
方法,完成测量。之前我们说过,onMeasure
方法会传进来两个参数,widthMeasureSpec
和heightMeasureSpec
。里面包含了父View根据当前View的LayoutParams
和父View的测量规格
进行计算,得出的对当前View期望的测量模式和测量大小
:当测量模式为MeasureSpec.EXACTLY也就是当宽或者高为确定值时,那么当前布局View的宽高也就是设定为父View给我们设置好的测量大小即可。比如宽为400dp
,那么我们无需重新测量直接调用setMeasuredDimension
传入这个固定值即可。当测量模式为MeasureSpec.AT_MOST 或者 UNSPECIFIED:这时候,说明父View对当前View的要求不固定,是可以为任意大小或者不超过最大值的情况,比如设置这个VerticalLayout
的高度为wrap_content
。那么我们就必须重新进行高度测量了,因为只有我们设计者知道这个自适应高度需要怎么计算。具体就是VerticalLayout
是一个垂直线性布局,所以高度很自然就是所有子View的高度之和。至此,onMeasure
方法的逻辑也基本摸清了:主要的逻辑就是遍历子View,得出VerticalLayout
的实际宽高:最终ViewGroup的高 = 所有子View的 (高 + margin值)最终ViewGroup的宽 = 最大子View的 (宽 + margin值)最后调用setMeasuredDimension
根据测量模式 传入宽高。重写布局方法onLayout上文说过,作为一个ViewGroup
,必须重写onLayout
方法,来保证子View的正常布局摆放。垂直线性布局VerticalLayout
亦是如此,那么在这个布局中onLayout
方法的关键逻辑又是什么呢?还是那句话,确定位置,也就是确定左、上、右、下
四个参数值,而在VerticalLayout
中,最关键的参数就是这个上,也就是top值
。每个View的top
值必须是上一个View的bottom值,也就是接着上一个View进行摆放,这样才会是垂直线性
的效果,所以我们需要做的就是动态计算每个View的top
值,其实也就是不断累加View的高度,作为下一个View的top值。逻辑还是挺简单的,left
是固定的子View的leftMargin。top
是累加计算的子View的高度 + Margin值。right
是left + 子View的宽度。bottom
是top + 子View的高度。最后调用子View的layout方法,对每个子View进行布局。以上就是“Java Swing类的Layout布局相关知识有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。
这篇文章主要介绍“C++怎么生成和解析XML文件免费云主机域名”,在日常操作中,相信很多人在C++怎么生成和解析XML文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么生成和解析XML文件”的疑惑有所帮助!接下来,请跟…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。