Java Swing类的Layout布局相关知识有哪些


今天小编给大家分享一下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方法,难道说ViewGroupView的布局过程是一样的,就是确定了本身的位置?那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方法会传进来两个参数,widthMeasureSpecheightMeasureSpec。里面包含了父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文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么生成和解析XML文件”的疑惑有所帮助!接下来,请跟…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/20 12:45
下一篇 08/20 12:46

相关推荐