LayoutParams通知父容器childView被放置在哪里

2016-11-16 20:20 评论 0 条

摘要:

LayoutParams被views用于通知父容器它们想要如何布局,每个ViewGroup的子类拥有独特的LayoutParams,比如:LinearLayout拥有独立的LinearLayout.LayoutParams,RelativeLayout拥有独立的RelativeLayout.LayoutParams。ViewGroup是各种子容器的父类,ViewGroup.LayoutParams是所有子容器LayoutParams的基类。

一、LinearLayout.LayoutParams指定子控件位置

水平线性布局的LinearLayout,动态添加多个TextView,并指定TextView在LinearLayout布局位置,使用到LinearLayout.LayoutParams。

第一种方式:复制已有的LayoutParams属性

  1. ...  
  2. <TextView  
  3.         android:id="@+id/multiple_properties_tv"  
  4.         android:layout_width="wrap_content"  
  5.         android:layout_height="wrap_content"  
  6.         android:layout_marginTop="@dimen/activity_horizontal_margin"  
  7.         android:layout_weight="1"  
  8.         android:gravity="right"  
  9.         android:paddingRight="@dimen/activity_horizontal_margin"  
  10.         android:text="复制当前TextView的LayoutParams属性" />  
  11. ...  
  1. private LinearLayout mParentView_ll;  
  2. private TextView mMultipleProperties_tv;  
  3. ...  
  4.      while(i<3){  
  5.             tv=new TextView(this);  
  6.             tv.setLayoutParams(mMultipleProperties_tv.getLayoutParams());  
  7.         tv.setText("复制属性:LayoutParams "+i);  
  8.             mParentView_ll.addView(tv);  
  9.             i++;  
  10.         }  
  11. ...  

运行效果:

001-multiple-properties

第二种方式:代码设置LayoutParams参数

  1. LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,1);  
  2.         params.gravity=Gravity.RIGHT;  
  3.         float density=getResources().getDisplayMetrics().density;  
  4.         params.setMargins(0,0,(int) (16*density),0);  
  5.   
  6.     TextView tv=null;  
  7.         int i=0;  
  8.         while(i<3){  
  9.             tv=new TextView(this);  
  10. //            tv.setLayoutParams(mMultipleProperties_tv.getLayoutParams());  
  11.             tv.setLayoutParams(params);  
  12.             tv.setText("复制属性:LayoutParams "+i);  
  13.             mParentView_ll.addView(tv);  
  14.             i++;  
  15.         }  

运行效果:

002-setlayoutparams

二、RelativeLayout.LayoutParams指定子控件位置

相比LinearLayout.LayoutParams,RelativeLayout.LayoutParams设置相差不大,同样有两种方式,第一种方式只需要复制一份RelativeLayout子控件的LayoutParams属性值即可,主要介绍第二种方式:

  1.         /** 
  2.          * 子控件的width:wrap_content,height:wrap_content 
  3.          * 与父控件底部对齐,margin:16dp 
  4.          */  
  5. RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
  6.         params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,R.id.activity_linear_layout_params_rl);  
  7.         float density=getResources().getDisplayMetrics().density;  
  8.         int pixels=(int)(16*density);  
  9.         params.setMargins(pixels,pixels,pixels,pixels);  
  10.         TextView tv=new TextView(this);  
  11.         tv.setText("动态设置RelativeLayout.LayoutParams:margin:16dp");  
  12.         tv.setLayoutParams(params);  
  13.         mParentView_rl.addView(tv);  

运行效果:

003-relativelayout-layoutparams-addrule

PS:LayoutParams被用于通知父容器子控件期待放置的具体位置,如何选择哪个LayoutParams?如果父容器是LinearLayout,选择LinearLayout.LayoutParams;如果父容器是FrameLayout,选择FrameLayout.LayoutParams,每个ViewGroup的子容器有独特的LayoutParams属性,动态添加更方便。

三、MarginLayoutParams的使用

直接继承ViewGroup.LayoutParams,所有继承ViewGroup的布局都支持MarginLayoutParams属性,用于动态设置marginTop、marginBottom、marginLeft、marginRight、marginStar和marginEnd。

1、改变marginLeft大小,实现动画效果:

  1. /** 
  2.  *设置MarginLayoutParams参数 
  3.  */  
  4. float density = getResources().getDisplayMetrics().density;  
  5.         int width=getResources().getDisplayMetrics().widthPixels;//获取当前手机屏幕宽度  
  6.         int pixels = (int) (16 * density);  
  7.         ViewGroup.MarginLayoutParams params=new ViewGroup.MarginLayoutParams(width, width);  
  8.         params.setMargins(pixels,pixels,pixels,pixels);  
  9.         TextView tv = new TextView(this);  
  10.         tv.setText("动态设置RelativeLayout.LayoutParams:margin:16dp");  
  11.         tv.setLayoutParams(params);  
  12.         mParentView_rl.addView(tv);  
  13.           
  14.         tv.setOnClickListener(new View.OnClickListener() {  
  15.             @Override  
  16.             public void onClick(View v) {  
  17.                 performAnimate(v,100,500);  
  18.             }  
  19.         });  
  1. /** 
  2.  *执行动画的方法 
  3.  */  
  4. private void performAnimate(final View target, final int start, final int end) {  
  5.         ValueAnimator valueAnimator = ValueAnimator.ofInt(1100);  
  6.         valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
  7.             private IntEvaluator mEvaluator = new IntEvaluator();  
  8.   
  9.             @Override  
  10.             public void onAnimationUpdate(ValueAnimator animator) {  
  11.                 //获得当前动画的进度值,整型,1~100之间  
  12.                 int currentValue = (Integer) animator.getAnimatedValue();  
  13.                 //获得当前进度占整个动画过程的比例,浮点型,0~1之间  
  14.                 float fraction = animator.getAnimatedFraction();  
  15.                 //直接调用整型估值器,通过比例计算宽度,然后再设给Button  
  16.                 ViewGroup.MarginLayoutParams params=(ViewGroup.MarginLayoutParams)(target.getLayoutParams());  
  17.                 params.leftMargin= mEvaluator.evaluate(fraction, start, end);  
  18.                 target.requestLayout();  
  19.             }  
  20.         });  
  21.   
  22.         valueAnimator.setRepeatMode(ValueAnimator.REVERSE);  
  23.         valueAnimator.setDuration(5000).start();  
  24.     }  

2、改变marginStart大小

android:layout_marginStart指定当前view开始位置边界的额外空间,marginStart的值应是正数。

当前文章价值5.83元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://www.teachcourse.cn/2101.html ,谢谢支持!

资源分享

Genymotion-eclipse-plugin插件安装 Genymotion-eclipse-plugin插件
python删除以发布wordpress文章 python删除以发布wordpress文章
如何快速的搭建自己的第一个网站? 如何快速的搭建自己的第一个网站
harmony初步了解类、函数和变量的定义 harmony初步了解类、函数和变量的