android局部,Android开发(4)——手动实现界面局部

本节内容

1.添加容器

2.修改代码为kotlin风格

3.屏幕密度和像素的转换

4.为LinearLayout添加子控件

5.使用RelativeLayout实现布局

6.使用ConstraintLayout实现布局

在之前,我们都是直接在xml中布局,但是我们也可以不用xml,直接在MainActivity中用代码布局。本节内容就主要为用代码布局。

一、添加容器

1.先添加一个容器

val linearLayout = LinearLayout(this)

2.给容器设置宽高

linearLayout.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,

LinearLayout.LayoutParams.MATCH_PARENT)

3.设置布局方向,为了显示明显一点,还可以添加一个背景颜色

linearLayout.orientation = LinearLayout.VERTICAL

linearLayout.background = getDrawable(R.color.colorAccent)

4.添加容器到Activity上

setContentView(linearLayout)

二、修改代码为kotlin风格

1.可以直接使用apply函数,然后在里面设置相应的属性,这样就不需要用到临时变量了。

2.在添加容器到Activity上的时候,可以再用also函数,传入的参数就为it。

//创建容器

val container = LinearLayout(this).apply {

layoutParams = LinearLayout.LayoutParams(

LinearLayout.LayoutParams.MATCH_PARENT,

LinearLayout.LayoutParams.MATCH_PARENT

)

orientation = LinearLayout.VERTICAL

background = getDrawable(R.color.colorAccent)

}.also {

setContentView(it)

}

三、屏幕密度和像素的转换

1.默认情况下,在代码中写的尺寸都是px,像素。如果在代码中写的100 = 100px,但是在手机上运行起来后显示的也是100px。但是手机有不同的分辨率density。

2.如果density = 1,则对应的像素就是100px.如果density= 2,则对应的值为50dp。

3.根据密度值不同,显示出来的dp值也不同。

4.写一个函数,将dp转换为px

fun dp2px(dp:Int):Int{

return (resources.displayMetrics.density*dp).toInt()

}

四、为LinearLayout添加子控件

1.创建第一个子控件

//创建第一个子控件,为横向布局的LinearLayout

LinearLayout(this).apply {

layoutParams = LinearLayout.LayoutParams(

LinearLayout.LayoutParams.MATCH_PARENT,dp2px(100)

)

orientation = LinearLayout.HORIZONTAL

background = getDrawable(R.color.colorPrimaryDark)

//将当前子控件添加到父容器中

container.addView(this)

}

2.创建第二个子控件TextView

//创建第二个人子控件

TextView(this).apply {

layoutParams = LinearLayout.LayoutParams(

LinearLayout.LayoutParams.MATCH_PARENT,

LinearLayout.LayoutParams.MATCH_PARENT

)

background = getDrawable(R.color.colorPrimary)

container.addView(this)

}

3.为第一个子控件再添加几个控件,直接在后面.apply即可

.apply {

ImageView(this@MainActivity).apply {

layoutParams = LinearLayout.LayoutParams(

dp2px(120),

LinearLayout.LayoutParams.MATCH_PARENT

)

//设置图片资源

setImageResource(R.drawable.hm)

//设置填充模式

scaleType = ImageView.ScaleType.CENTER_CROP

//添加到容器中

addView(this)

}

}

4.再添加一个TextView在这个.apply里面

TextView(this@MainActivity).apply {

layoutParams = LinearLayout.LayoutParams(

0 ,

LinearLayout.LayoutParams.MATCH_PARENT

).apply {

weight = 1f

setMargins(dp2px(10),dp2px(10),dp2px(10),dp2px(10))

}

text = "加油,干饭人!!"

setTextColor(getColor(R.color.ColorWhite))

textSize = 20f

addView(this)

}

5.给第二个子控件再添加一些内容

TextView(this).apply {

layoutParams = LinearLayout.LayoutParams(

LinearLayout.LayoutParams.MATCH_PARENT,

LinearLayout.LayoutParams.MATCH_PARENT

).apply {

weight = 1f

setMargins(dp2px(10), dp2px(10), dp2px(10), dp2px(10))

}

text = "干饭人,起来干饭了!!!"

setTextColor(getColor(R.color.ColorWhite))

textSize = 20f

container.addView(this)

}

五、使用RelativeLayout实现布局

1.大部分和前面基本相似,首先创建一个容器

//创建Relative容器

val relativeLayout = RelativeLayout(this).apply {

//添加id

id = R.id.mContainer

//宽高

layoutParams = RelativeLayout.LayoutParams(

RelativeLayout.LayoutParams.MATCH_PARENT,

RelativeLayout.LayoutParams.MATCH_PARENT

)

//设置背景颜色

background = getDrawable(R.color.colorAccent)

//将这个视图添加到Activity对应的容器界面中

setContentView(this)

}

2.添加一张图片

//添加图片

ImageView(this).apply {

//给控件添加id

id = R.id.mHeader

//宽高

layoutParams = RelativeLayout.LayoutParams(dp2px(120),dp2px(90)).apply {

setMargins(dp2px(10),dp2px(10),0,0)

}

setImageResource(R.drawable.hm)

scaleType = ImageView.ScaleType.CENTER_CROP

relativeLayout.addView(this)

}

3.添加一个标题,addRule()函数有两个参数,一个是关系,一个是另外一个控件或容器的id。

//添加标题

TextView(this).apply {

layoutParams = RelativeLayout.LayoutParams(0,0).apply {

//设置和其他控件的相对关系

//和头像的相对关系

addRule(RelativeLayout.RIGHT_OF,R.id.mHeader)

//和父容器右边对齐

addRule(RelativeLayout.ALIGN_PARENT_END,R.id.mContainer)

//和头像顶部对齐

addRule(RelativeLayout.ALIGN_TOP,R.id.mHeader)

//和头像的底部对齐

addRule(RelativeLayout.ALIGN_BOTTOM,R.id.mHeader)

marginStart = dp2px(10)

}

text="有哪一些别人认为是神颜你却get不到的明星?"

setTextColor(getColor(R.color.colorPrimary))

textSize = 20f

relativeLayout.addView(this)

}

4.为图片和文本设置id,在resource资源里面的values里再添加一个ids.xml,并在里面存放我们所有的id值,什么样的name对应什么样的值。

六、使用ConstraintLayout实现布局

1.先添加一个容器

val constraintLayout = ConstraintLayout(this).apply {

id = R.id.mContainer

layoutParams = ConstraintLayout.LayoutParams(

ConstraintLayout.LayoutParams.MATCH_PARENT,

ConstraintLayout.LayoutParams.MATCH_PARENT

)

setContentView(this)

background = getDrawable(R.color.colorPrimaryDark)

}

2.添加一张图片

ImageView(this).apply {

id =R.id.mHeader

layoutParams = ConstraintLayout.LayoutParams(

dp2px(120), dp2px(90)

).apply {

//左边和父容器对齐

leftToLeft = R.id.mContainer

//顶部和父容器对齐

topToTop = R.id.mContainer

setMargins(dp2px(10),dp2px(10),0,0)

}

setImageResource(R.drawable.hm)

scaleType = ImageView.ScaleType.CENTER_CROP

constraintLayout.addView(this)

}

3.添加一个TextView

TextView(this).apply {

id = R.id.mTitle

layoutParams = ConstraintLayout.LayoutParams(

ConstraintLayout.LayoutParams.MATCH_PARENT,

ConstraintLayout.LayoutParams.MATCH_PARENT

).apply {

leftToRight = R.id.mHeader

rightToRight = R.id.mContainer

topToTop = R.id.mHeader

bottomToBottom=R.id.mHeader

setMargins(dp2px(10),dp2px(10),dp2px(10),0)

}

text= "有哪些比较冷门用完却真香的宝藏国货?"

setTextColor(getColor(R.color.colorAccent))

textSize= 20f

constraintLayout.addView(this)

}

4.再添加一个TextView

TextView(this).apply {

layoutParams = ConstraintLayout.LayoutParams(

ConstraintLayout.LayoutParams.MATCH_PARENT,

ConstraintLayout.LayoutParams.MATCH_PARENT

).apply {

leftToLeft = R.id.mContainer

rightToRight = R.id.mContainer

topToBottom = R.id.mHeader

bottomToBottom=R.id.mContainer

setMargins(0,dp2px(10),0,0)

}

text= "你穿到一个修仙文变成了一个试图勾引男主的恶毒女配怎么办"

setTextColor(getColor(R.color.colorPrimary))

textSize= 20f

constraintLayout.addView(this)

}

以上就是今天的全部内容了,再见!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值