摘要:
LayoutParams被views用于通知父容器它们想要如何布局,每个ViewGroup的子类拥有独特的LayoutParams,比如:LinearLayout拥有独立的LinearLayout.LayoutParams,RelativeLayout拥有独立的RelativeLayout.LayoutParams。ViewGroup是各种子容器的父类,ViewGroup.LayoutParams是所有子容器LayoutParams的基类。
一、LinearLayout.LayoutParams指定子控件位置
水平线性布局的LinearLayout,动态添加多个TextView,并指定TextView在LinearLayout布局位置,使用到LinearLayout.LayoutParams。
第一种方式:复制已有的LayoutParams属性
- ...
- <TextView
- android:id="@+id/multiple_properties_tv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/activity_horizontal_margin"
- android:layout_weight="1"
- android:gravity="right"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:text="复制当前TextView的LayoutParams属性" />
- ...
- private LinearLayout mParentView_ll;
- private TextView mMultipleProperties_tv;
- ...
- while(i<3){
- tv=new TextView(this);
- tv.setLayoutParams(mMultipleProperties_tv.getLayoutParams());
- tv.setText("复制属性:LayoutParams "+i);
- mParentView_ll.addView(tv);
- i++;
- }
- ...
运行效果:
第二种方式:代码设置LayoutParams参数
- LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,1);
- params.gravity=Gravity.RIGHT;
- float density=getResources().getDisplayMetrics().density;
- params.setMargins(0,0,(int) (16*density),0);
- TextView tv=null;
- int i=0;
- while(i<3){
- tv=new TextView(this);
- // tv.setLayoutParams(mMultipleProperties_tv.getLayoutParams());
- tv.setLayoutParams(params);
- tv.setText("复制属性:LayoutParams "+i);
- mParentView_ll.addView(tv);
- i++;
- }
运行效果:
二、RelativeLayout.LayoutParams指定子控件位置
相比LinearLayout.LayoutParams,RelativeLayout.LayoutParams设置相差不大,同样有两种方式,第一种方式只需要复制一份RelativeLayout子控件的LayoutParams属性值即可,主要介绍第二种方式:
- /**
- * 子控件的width:wrap_content,height:wrap_content
- * 与父控件底部对齐,margin:16dp
- */
- RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
- params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,R.id.activity_linear_layout_params_rl);
- float density=getResources().getDisplayMetrics().density;
- int pixels=(int)(16*density);
- params.setMargins(pixels,pixels,pixels,pixels);
- TextView tv=new TextView(this);
- tv.setText("动态设置RelativeLayout.LayoutParams:margin:16dp");
- tv.setLayoutParams(params);
- mParentView_rl.addView(tv);
运行效果:
PS:LayoutParams被用于通知父容器子控件期待放置的具体位置,如何选择哪个LayoutParams?如果父容器是LinearLayout,选择LinearLayout.LayoutParams;如果父容器是FrameLayout,选择FrameLayout.LayoutParams,每个ViewGroup的子容器有独特的LayoutParams属性,动态添加更方便。
三、MarginLayoutParams的使用
直接继承ViewGroup.LayoutParams,所有继承ViewGroup的布局都支持MarginLayoutParams属性,用于动态设置marginTop、marginBottom、marginLeft、marginRight、marginStar和marginEnd。
1、改变marginLeft大小,实现动画效果:
- /**
- *设置MarginLayoutParams参数
- */
- float density = getResources().getDisplayMetrics().density;
- int width=getResources().getDisplayMetrics().widthPixels;//获取当前手机屏幕宽度
- int pixels = (int) (16 * density);
- ViewGroup.MarginLayoutParams params=new ViewGroup.MarginLayoutParams(width, width);
- params.setMargins(pixels,pixels,pixels,pixels);
- TextView tv = new TextView(this);
- tv.setText("动态设置RelativeLayout.LayoutParams:margin:16dp");
- tv.setLayoutParams(params);
- mParentView_rl.addView(tv);
- tv.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- performAnimate(v,100,500);
- }
- });
- /**
- *执行动画的方法
- */
- private void performAnimate(final View target, final int start, final int end) {
- ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);
- valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- private IntEvaluator mEvaluator = new IntEvaluator();
- @Override
- public void onAnimationUpdate(ValueAnimator animator) {
- //获得当前动画的进度值,整型,1~100之间
- int currentValue = (Integer) animator.getAnimatedValue();
- //获得当前进度占整个动画过程的比例,浮点型,0~1之间
- float fraction = animator.getAnimatedFraction();
- //直接调用整型估值器,通过比例计算宽度,然后再设给Button
- ViewGroup.MarginLayoutParams params=(ViewGroup.MarginLayoutParams)(target.getLayoutParams());
- params.leftMargin= mEvaluator.evaluate(fraction, start, end);
- target.requestLayout();
- }
- });
- valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
- valueAnimator.setDuration(5000).start();
- }
2、改变marginStart大小
android:layout_marginStart指定当前view开始位置边界的额外空间,marginStart的值应是正数。
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/2101.html ,谢谢支持!