天天看点

自定义view的LayoutParam gravity layout_gravity

  1.  gravity和layout_gravity的区别

       android:gravity 属性是对该view中内容的限定.        android:layout_gravity是用来设置该view相对与父view 的位置.

  1. 在代码中如何设置

       android:gravity  对应的是  setGravity()

        android:layout_gravity 对应的是   LayoutParam.gravity  The gravity to apply with the View to which these layout parameters

* are associated.         也就是属于 LayoutParam的作用区域(对父view)

实例:

public class TestViewActivity  extends AppCompatActivity {

    @Override

    protected void  onCreate( @Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState) ;

        LinearLayout picContainer= new LinearLayout( this) ;

        picContainer.setLayoutParams( new ViewGroup.LayoutParams(ViewGroup.LayoutParams. MATCH_PARENT , DPIUtil. getWidthByDesignValue720( 236))) ;

        picContainer.setBackgroundColor(Color. parseColor( "#ffffff")) ;

        addView(picContainer) ;

        setContentView(picContainer) ;

    }

    private void  addView(LinearLayout picContainer){

        for ( int i= 0 ;i< 3 ;++i){

            LinearLayout.LayoutParams picOuterParams= new LinearLayout.LayoutParams(DPIUtil. getWidthByDesignValue720( 236) ,DPIUtil. getWidthByDesignValue720( 236)) ;

            FrameLayout.LayoutParams picParams= new FrameLayout.LayoutParams(DPIUtil. getWidthByDesignValue720( 210) ,DPIUtil. getWidthByDesignValue720( 210)) ;

            picParams. gravity= Gravity. CENTER ;  //设置图片居中

            FrameLayout picOuter= new FrameLayout( this) ;

            picOuter.setBackgroundColor(Color. parseColor( "#00ff00")) ;        //for test

            if ( 0==i){

                picOuterParams. leftMargin=DPIUtil. getWidthByDesignValue720( 0) ;

            } else {

                picOuterParams. leftMargin=DPIUtil. getWidthByDesignValue720( 6) ;

            }

//            picOuter.setLayoutParams(picOuterParams);

            ImageView picView= new ImageView( this) ;

//            picView.setLayoutParams(picParams);

            picView.setImageResource(R.mipmap. pic0) ;

            picView.setScaleType(ImageView.ScaleType. CENTER) ;

            picOuter.addView(picView ,picParams) ;

            picContainer.addView(picOuter ,picOuterParams) ;

        }

    }

}

自定义view的LayoutParam gravity layout_gravity

注意:易错点   错误使用引用 picOuterParams  在第一个和其他商品图片处  值是不同的    第一个的左margin为0,其他的左margin为6;   此时 picOuterParams  必须写在循环体里面,否则效果如下:

private void  addView(LinearLayout picContainer){

    //移到循环体外面,是一个引用,所以会被后面赋值覆盖

    LinearLayout.LayoutParams picOuterParams= new LinearLayout.LayoutParams(DPIUtil. getWidthByDesignValue720( 236) ,DPIUtil. getWidthByDesignValue720( 236)) ;

    for ( int i= 0 ;i< 3 ;++i){

        FrameLayout.LayoutParams picParams= new FrameLayout.LayoutParams(DPIUtil. getWidthByDesignValue720( 210) ,DPIUtil. getWidthByDesignValue720( 210)) ;

        picParams. gravity= Gravity. CENTER ;

        FrameLayout picOuter= new FrameLayout( this) ;

        picOuter.setBackgroundColor(Color. parseColor( "#00ff00")) ;

        if ( 0==i){

            picOuterParams. leftMargin=DPIUtil. getWidthByDesignValue720( 0) ;  //被覆盖了

        } else {

            picOuterParams. leftMargin=DPIUtil. getWidthByDesignValue720( 6) ;

        }

        ImageView picView= new ImageView( this) ;

        picView.setImageResource(R.mipmap. pic0) ;

        picView.setScaleType(ImageView.ScaleType. CENTER) ;

        picOuter.addView(picView ,picParams) ;

        picContainer.addView(picOuter ,picOuterParams) ;

    }

}

效果:

自定义view的LayoutParam gravity layout_gravity

可见第一项的左边也是6的边距(代码里不是设置0了吗),原因在于param用的是一个引用!  第一个商品的被后续的覆盖了。。