2

layoutparams(layoutparams改变会有过渡)

1. 简介

LayoutParams是一种ViewGroup.LayoutParams子类,用于描述View在其父容器中的布局参数。

在Android开发中,我们可以通过LayoutParams来设置每个View在布局中的位置和大小,同时也可以设置ViewGroup的布局属性,以达到最佳的布局效果。

2. LayoutParams的基本概念

LayoutParams是一种用来描述View在一个ViewGroup中的最重要属性之一,LayoutParams使用一个特定的布局模型来描述View在父容器中的位置和大小。

LayoutParams提供了一种机制,以便在父容器的不同布局中,使用不同的LayoutParams来处理间距,重心和位置等细节,因此LayoutParams为实现不同布局的ViewGroup提供了支持。

LayoutParams可用于确定视图的:

•宽度和高度;

•左右和上下的间距;

•重心和位置等;

3. LayoutParams的分类

Android中的LayoutParmas分为以下四种类型:

•LayoutParams:一般由View的父容器使用,描述View在其父容器中的布局参数(即ViewGroup.LayoutParams)。

•LinearLayout.LayoutParams:用于线性布局,包含了线性布局流程中需要考虑的参数,例如权重(layout_weight)等。

•FrameLayout.LayoutParams:用于帧布局,包含了帧布局流程中需要考虑的参数,例如重心(gravity)等。

•RelativeLayout.LayoutParams:用于相对布局,包含了相对布局流程中需要考虑的参数,例如依赖关系(layout_above, layout_below)等。

4. LinearLayout.LayoutParams

LinearLayout是Android自带的布局管理器之一,同时它也是最易用的布局管理器之一。

LinearLayout.LayoutParams可以定义以下属性:

•android:layout_width:设置布局的宽度,默认情况下为wrap_content。

•android:layout_height:设置布局的高度,默认情况下为wrap_content。

•android:layout_weight:当将此属性设置在子View上时,会将子View的大小比例设置为相对于其它View的比例。

•android:layout_margin:设置视图周围的间距。

•android:gravity:设置视图的重心(居中,左对齐,右对齐等)。

5. FrameLayout.LayoutParams

FrameLayout是Android的另一个布局管理器,它允许子View在框架上重叠并可以有所有方向的宽高布局。

FrameLayout.LayoutParams可以定义以下属性:

•android:layout_width:设置布局的宽度,默认情况下为wrap_content。

•android:layout_height:设置布局的高度,默认情况下为wrap_content。

•android:layout_gravity:设置视图的重心(居中,左对齐,右对齐等)。

6. RelativeLayout.LayoutParams

相对布局是Android的另一种常用布局管理器,它基于子View之间的相对位置来布置布局。

RelativeLayout.LayoutParams可以定义以下属性:

•android:layout_width:设置布局的宽度,默认情况下为wrap_content。

•android:layout_height:设置布局的高度,默认情况下为wrap_content。

•android:layout_below:设置子View的布局与另一个子View的布局相对。

•android:layout_above:设置子View的布局与另一个子View的布局相对。

•android:layout_alignLeft:当子View允许嵌套在RelativeLayout内时,设置子View最左端是相对于布局的最左端还是相对于其他View的右侧。

7. LinearLayout实例

下面是一个LinearLayout的例子,在这个例子中我们将会为这个ViewGroup添加不同的LayoutParams,并在布局中作出相应的修改。

在这个篇文章的下面,您可以看到这个例子的结果。

```xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal"

android:background="#000000">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/app_title"

android:textSize="24dp"

android:textColor="#FFFFFF"

android:padding="10dp"

android:layout_margin="10dp">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Go to next page"

android:textSize="24dp"

android:textColor="#FFFFFF"

android:padding="10dp"

android:layout_margin="10dp"

android:id="@+id/next_page_button"

android:onClick="openNextPage">

```

在上面的代码中,我们创建了一个水平LinearLayout,并在其中创建了两个TextView元素,其中第一个TextView用于标题,第二个TextView用于跳转到下一页,我们还针对这两个元素添加了一些布局属性,以自定义它们在布局中的大小和位置等。

8. RelativeLayout实例

下面是一个展示RelativeLayout的例子,在这个例子中我们将在RelativeLayout中添加三个TextView元素,并使用不同的布局属性以自定义它们在布局中的缩放、重心和位置等。

在这个页面的底部,您可以查看这个例子的结果。

```xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#000000">

android:id="@+id/title"

android:layout_width="match_parent"

android:layout_height="40dp"

android:text="@string/app_title"

android:textSize="24sp"

android:textColor="#FFFFFF"

android:gravity="center_vertical"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:layout_marginTop="10dp"

android:layout_alignParentTop="true"

android:layout_alignParentStart="true"

android:layout_alignParentLeft="true"

android:layout_alignParentEnd="true"

android:layout_alignParentRight="true" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/app_description"

android:textSize="18sp"

android:textColor="#FFFFFF"

android:layout_below="@+id/title"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:layout_marginTop="10dp"

android:layout_marginBottom="10dp"

android:layout_centerHorizontal="true" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="@string/contact_info"

android:textSize="16sp"

android:textColor="#FFFFFF"

android:gravity="center_vertical"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:layout_marginTop="10dp"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true" />

```

在上面的代码中,我们使用RelativeLayout创建了一个布局,并在其中添加了三个TextView元素,其中第一个TextView元素用于标题,第二个TextView元素用于描述,第三个TextView元素用于联系方式。我们还为这三个元素添加了不同的布局属性,以自定义它们在布局中的大小和位置等。

9. 总结

在Android开发中,LayoutParams是一种很重要的属性,它用于描述View在其父容器中的布局参数。

在实际开发中,如果我们希望实现一个好的UI布局,我们需要使用不同的LayoutParams来使视图适应不同的布局。

本文主要介绍了Android中四种LayoutParams类型,它们分别是LayoutParams、LinearLayout.LayoutParams、FrameLayout.LayoutParams和RelativeLayout.LayoutParams,在开发中需要格外注意。

记得,在使用LayoutParams设置布局的高度和宽度时,应该使用合适的单位,比如dp,sp等,这样可以使我们的布局更适合不同大小的屏幕并有一个好的用户体验。

Layout参数是Android中重要的一部分,它用于控制View的位置和大小。而LayoutParams是ViewGroup的一个内部类,继承自ViewGroup.LayoutParams。它用于设置子View在父View中的布局参数,如宽、高、边距等。

2. LayoutParams的作用

LayoutParams主要用于以下几个方面:

(1)确定子View在父View中的位置

LayoutParams可以确定子View在父View中应该放置在哪个位置。例如,设置一个Button在RelativeLayout中的位置:

```

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(

RelativeLayout.LayoutParams.WRAP_CONTENT,

RelativeLayout.LayoutParams.WRAP_CONTENT);

layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);

Button button = new Button(this);

button.setLayoutParams(layoutParams);

```

(2)确定子View的大小

LayoutParams可以确定子View的大小,如宽、高等。例如,设置一个ImageView的宽度和高度:

```

FrameLayout.LayoutParams layoutParams =

new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.MATCH_PARENT);

imageView.setLayoutParams(layoutParams);

```

这里使用了FrameLayout作为ImageView的父容器。

(3)确定子View之间的边距和布局方式

LayoutParams可以确定子View之间的边距和布局方式。例如,在LinearLayout中设置两个Button之间的垂直间距:

```

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.MATCH_PARENT,

LinearLayout.LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(0, 0, 0, 20);

button1.setLayoutParams(layoutParams);

button2.setLayoutParams(layoutParams);

```

这里为button1和button2都设置了LayoutParams,设置了它们之间的间距为20dp。

3. LayoutParams对应的过渡效果

当LayoutParams发生改变时,Android系统会根据LayoutTransition的设置,执行相应的过渡动画。LayoutTransition是一个类,用于控制容器内子View的添加、删除和属性改变带来的动画效果。它可以在setLayoutTransition()方法中设置,如下所示:

```

LayoutTransition transition = new LayoutTransition();

viewGroup.setLayoutTransition(transition);

```

修改子View的LayoutParams属性,会触发以下几种过渡效果:

(1)APPEARING

新增一个View到ViewGroup中时,该View的过渡效果。

(2)DISAPPEARING

从ViewGroup中删除一个View时,该View的过渡效果。

(3)CHANGE_APPEARING

当一个ChildView的LayoutParams改变后,该View的过渡效果。

(4)CHANGE_DISAPPEARING

删除一个ChildView时,其他ChildView的LayoutParams改变后,该View的过渡效果。

这四种过渡效果可以通过LayoutTransition对象的API设置:

```

transition.setAnimator(LayoutTransition.APPEARING, appearAnimation);

transition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimation);

transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAppearAnimation);

transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeDisappearAnimation);

```

其中,appearAnimation、disappearAnimation、changeAppearAnimation和changeDisappearAnimation是自定义的Animator,用于实现过渡动画。

4. 代码示例

下面展示一个使用LayoutTransition的示例:

```

private void addView() {

LinearLayout layout = findViewById(R.id.layout);

Button button = new Button(this);

button.setText("新加按钮");

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.WRAP_CONTENT,

LinearLayout.LayoutParams.WRAP_CONTENT);

layout.addView(button, lp);

}

private void removeView() {

LinearLayout layout = findViewById(R.id.layout);

int childCount = layout.getChildCount();

if (childCount > 1) {

layout.removeViewAt(childCount - 1);

}

}

/**

* 设置ViewGroup的自动动画

*/

private void setupLayoutAnimation() {

LayoutTransition transition = new LayoutTransition();

Animator appearAnimator = ObjectAnimator.ofFloat(null, "translationY",

0, 1).setDuration(transition.getDuration(LayoutTransition.APPEARING));

transition.setAnimator(LayoutTransition.APPEARING, appearAnimator);

Animator disappearAnimator = ObjectAnimator.ofFloat(null, "translationX",

0, 1).setDuration(transition.getDuration(LayoutTransition.DISAPPEARING));

transition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator);

Animator changeAppearAnimator = ObjectAnimator.ofFloat(null, "alpha",

0, 1).setDuration(transition.getDuration(LayoutTransition.CHANGE_APPEARING));

transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAppearAnimator);

Animator changeDisappearAnimator = ObjectAnimator.ofFloat(null, "alpha",

1, 0).setDuration(transition.getDuration(LayoutTransition.CHANGE_DISAPPEARING));

transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeDisappearAnimator);

ViewGroup layout = findViewById(R.id.layout);

layout.setLayoutTransition(transition);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

addView();

}

});

findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

removeView();

}

});

setupLayoutAnimation();

}

```

该示例使用一个LinearLayout作为ViewGroup,点击“新增按钮”按钮,将会向LinearLayout中新增一个Button;点击“删除按钮”按钮,会删除LinearLayout中的最后一个Button。点击添加或删除按钮时,使用setLayoutTransition()方法设置LayoutTransition,并自定义Animator来实现过渡动画。

5. 总结

在Android应用中使用LayoutParams和LayoutTransition可以很好地控制View的布局效果,同时还能给用户带来流畅的体验。在使用过程中,需要特别注意过渡效果的设置,以实现预期的动效。

本文来自网络,不代表本站立场。转载请注明出处: https://tj.jiuquan.cc/a-2226450/
1
上一篇手机突然很费电(手机突然很费电是怎么回事)
下一篇 ibooks store不可用(iphone books不可用)

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: alzn66@foxmail.com

关注微信

微信扫一扫关注我们

返回顶部