介绍
在Android中,LayoutParams是一组规定ViewGroup子视图放置方式的类。它定义了子视图如何放置在父容器中,包括宽度、高度和重力等方面的属性。LayoutParams是ViewGroup.LayoutParams类的子类,它的存在使得我们可以将一个View作为子视图添加到另一个ViewGroup中,而且这个子View的放置位置规则会根据LayoutParams中的设置而发生改变。下面我们将对其中的几个常用属性进行详细解释,以及举些例子说明。
属性
(1) width和height:LayoutParams中最常用的两个属性,用来设置子视图的宽度和高度。这两个属性的参数类型必须是整型变量,可通过以下方式进行设置:
```
view.setLayoutParams(new ViewGroup.LayoutParams(width, height));
```
(2) gravity:用于设置布局内子视图的重心。它的值可以是左上角、右上角、左下角、右下角等位置。这个属性的参数类型必须是int型,可通过以下方式设置:
```
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
layoutParams.gravity = Gravity.BOTTOM;
textView.setLayoutParams(layoutParams);
```
(3) weight:设置子视图在特定方向上的分配比例,使得每个子视图分配到的空间不同。这个属性的参数值必须是float类型,负责则当做0进行处理。在这个属性中,权重(height或width)被宽度或高度的总权重取余的值代替,即(weight子视图获取的宽度) = (weight / (LayoutParam权重总和)) * (剩余宽度或高度)。可通过以下方式进行设置:
```
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.weight = 1.0f;
textView.setLayoutParams(layoutParams);
```
(4) leftMargin、topMargin、rightMargin和bottomMargin:用于设置子视图的左、上、右和下边距的宽度。这个属性的参数类型必须是整型变量,可通过以下方式进行设置:
```
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.leftMargin = 10;
layoutParams.topMargin = 20;
textView.setLayoutParams(layoutParams);
```
(5) 参数分析完毕后,还需要提一下从源码角度,LayoutParams包含二个重要的信息值,作用具体如下:
* int width:子View的宽度,固定数值或者MATCH_PARENT / WRAP_CONTENT;
* int height:子View的高度,固定数值或者MATCH_PARENT / WRAP_CONTENT。
同时,还可以有其他的参数。例如,在继承LinearLayout实现自定义View中,LayoutParams即额外包括了int gravity: 子View的重心。按照业务逻辑选用合适的LayoutParams,这一点在多层嵌套布局中会更加重要。只有选用了合适的LayoutParams,才能够保证布局的合理性和显示效果的完美。
案例
为了更好的体现LayoutParams的作用,我们来看下面的例子:
```
android:id="@+id/rootLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> android:layout_height="wrap_content" android:text="First TextView" android:gravity="center" android:textSize="18sp" android:textColor="@android:color/holo_red_dark"/> android:layout_height="wrap_content" android:text="Second TextView" android:gravity="center" android:textSize="16sp" android:textColor="@android:color/holo_blue_dark"/>
```
我们根据这个布局文件创建一个Activity,其中放置了两个TextView作为子视图添加到LinearLayout中。上面的布局文件中LinearLayout的orientation属性为“vertical”,也就是说它的两个子视图在竖直方向上排列。这两个TextView的宽度均为“match_parent”,即填充父容器的宽度,在这种情况下,这两个子视图的宽度应该是一样的。但我们发现这两个TextView的宽度并不相同,原因是没有设置它们的LayoutParams。
这时我们可以将上述代码改为如下形式:
```
LinearLayout rootView = findViewById(R.id.rootLayout);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
TextView textView1 = new TextView(this);
textView1.setText("First TextView");
textView1.setGravity(Gravity.CENTER);
textView1.setTextSize(18);
textView1.setTextColor(ContextCompat.getColor(this, R.color.colorRed));
textView1.setLayoutParams(layoutParams);
rootView.addView(textView1);
LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams1.topMargin = 20;
TextView textView2 = new TextView(this);
textView2.setText("Second TextView");
textView2.setGravity(Gravity.CENTER);
textView2.setTextSize(16);
textView2.setTextColor(ContextCompat.getColor(this, R.color.colorBlue));
textView2.setLayoutParams(layoutParams1);
rootView.addView(textView2);
```
在上述改动中,我们首先获取到LinearLayout的对象,然后使用ViewGroup.LayoutParams设置TextView1的LayoutParams。其中,第一个参数表示宽度为fill_parent并且高度自适应;第二个参数表示TextView1的高度是根据其内容而自适应的。
接下来,我们使用LinearLayout.LayoutParams设置TextView2的LayoutParams。这里需要注意的是,在使用LinearLayout.LayoutParams时需要为其设置topMargin。这是因为,在LinearLayout中只有一个子视图时,因为没有其他视图来填充空白部分,整个容器会被占据。这时我们需要将第二个子视图的上边距设为20px,使得两个TextView产生间隙,从而达到预期的效果。
综上,LayoutParams的作用非常重要,可以让我们通过设置子视图的一些属性值来实现不同的效果。通过本篇文章的介绍,相信大家已经了解了LayoutParams的基本语法及用法,并且使用它们时也能更为得心应手。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复