文档章节

android开发笔记之权重(layout_weight)

Mr_Nice
 Mr_Nice
发布于 2016/05/22 20:01
字数 1554
阅读 5
收藏 0
点赞 2
评论 0

我相信大家在布局文件中都用过权重(layout_weight)吧,当然这只有在线性布局(Linearlayout)中才有的,可是很多人也许都只是简单的理解为比。

其实权重就是:
把屏幕剩余空间按比例分配

大家先记住这句话,这里就来深入理解下权重,这里以水平排列为例(即宽度的权重),懂了水平的,竖直排列的(即高度的权重)自然同理。

①第一种情况(宽度为wrap_content):

a.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.example.weight.MainActivity" >
    <Button  android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn1" />

    <Button  android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn2" />
</LinearLayout>

这里写图片描述

效果:

这里写图片描述

现在两个按钮的宽度都为wrap_content,所以剩下的屏幕宽度为:

math_parent - 2*wrap_content,权重为1:1

则btn1所占宽度为:本身宽度 + 剩下屏幕的宽度的1/2 = wrap_content
+ 1/2(math_parent - 2*wrap_content)

btn2所占的宽度为:本身宽度 + 剩下屏幕的宽度的1/2 = wrap_content
+ 1/2(math_parent - 2*wrap_content)

从上面看到两式相等,所以两个按钮应该是平分整个屏幕宽度

b.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.example.weight.MainActivity" >
    <Button  android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn1" />

    <Button  android:layout_weight="2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn2" />
</LinearLayout>

效果:

这里写图片描述

可以看出,这两个按钮并不是1:2,那是为什么呢,我们来算下,

现在两个按钮的宽度都为wrap_content,所以剩下的屏幕宽度为:

math_parent - 2*wrap_content,权重为1:2

则btn1所占宽度为:本身宽度 + 剩下屏幕的宽度的1/3 = wrap_content
+ 1/3(math_parent - 2*wrap_content)

btn2所占的宽度为:本身宽度 + 剩下屏幕的宽度的2/3 = wrap_content
+ 2/3(math_parent - 2*wrap_content)

看这两个式子好像不能一眼看不出来,我们来个带个数,假设wrap_content = 120dp,math_parent = 900dp

那么btn1所占宽度为:340dp

btn2所占宽度为:560dp

现在知道为什么不是1:2了吧

c.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.example.weight.MainActivity" >
    <Button  android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn1" />

    <Button  android:layout_weight="2000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn2" />
</LinearLayout>

效果:

这里写图片描述

大家可以看到,btn2的权重已经设的很大了,btn1的权重为1,但是btn1仍然能够显示。

继续来算下,现在两个按钮的宽度都为wrap_content,所以剩下的屏幕宽度为:

math_parent - 2*wrap_content,权重为1:2000

则btn1所占宽度为:本身宽度 + 剩下屏幕的宽度的1/2001 = wrap_content
+ 1/2001(math_parent - 2*wrap_content)

btn2所占的宽度为:本身宽度 + 剩下屏幕的宽度的2000/2001 = wrap_content
+ 2000/2001 (math_parent - 2*wrap_content)

现在可以知道为什么权重不管多大,都不能占满全屏的原因了吧。

②第二种情况(宽度为math_parent):

a.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.example.weight.MainActivity" >
    <Button  android:layout_weight="1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="btn1" />

    <Button  android:layout_weight="1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="btn2" />
</LinearLayout>

效果:

这里写图片描述

现在两个按钮的宽度都为match_parent,所以剩下的屏幕宽度为:

math_parent - 2*match_parent = -match_parent,权重为1:1

则btn1所占宽度为:本身宽度 + 剩下屏幕的宽度的1/2 = match_parent
+ 1/2(math_parent - 2*match_parent) = 1/2match_parent

btn2所占的宽度为:本身宽度 + 剩下屏幕的宽度的1/2 = match_parent
+ 1/2(math_parent - 2*match_parent) = 1/2match_parent

从上面看到两式相等,所以两个按钮应该是平分整个屏幕宽度

b.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.example.weight.MainActivity" >
    <Button  android:layout_weight="1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="btn1" />

    <Button  android:layout_weight="2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="btn2" />
</LinearLayout>

效果:

这里写图片描述

大家可以看到一个很奇怪的现象,btn2的权重更大,但是它反而比btn1占的宽度更少了,为什么呢,算一算。

现在两个按钮的宽度都为match_parent,所以剩下的屏幕宽度为:

math_parent - 2*match_parent = -match_parent,权重为1:2

则btn1所占宽度为:本身宽度 + 剩下屏幕的宽度的1/3 = match_parent
+ 1/3(math_parent - 2*match_parent) = 2/3match_parent

btn2所占的宽度为:本身宽度 + 剩下屏幕的宽度的2/3 = match_parent
+ 2/3(math_parent - 2*match_parent) = 1/3match_parent

现在知道为什么了吧。

c.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.example.weight.MainActivity" >
    <Button  android:layout_weight="1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="btn1" />

    <Button  android:layout_weight="2000" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="btn2" />
</LinearLayout>

效果:

这里写图片描述

为什么只看到btn1呢

现在两个按钮的宽度都为match_parent,所以剩下的屏幕宽度为:

math_parent - 2*match_parent = -match_parent,权重为1:2000

则btn1所占宽度为:本身宽度 + 剩下屏幕的宽度的1/2001 = match_parent
+ 1/2001(math_parent - 2*match_parent) = 2000/2001match_parent

btn2所占的宽度为:本身宽度 + 剩下屏幕的宽度的2000/2001= match_parent
+ 2000/2001(math_parent - 2*match_parent) = 1/2001match_parent

这样可以看出btn2的宽度基本可以忽略不计了。

③第三种情况(0dp):

通过上面的示例,大家都应该知道怎么算权重了吧,这里就演示下1:2的情况

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="com.example.weight.MainActivity" >
    <Button  android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:text="btn1" />

    <Button  android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" android:text="btn2" />
</LinearLayout>

效果:

这里写图片描述

现在两个按钮的宽度都为0dp,所以剩下的屏幕宽度为:

math_parent - 2*0 = match_parent,权重为1:2

则btn1所占宽度为:本身宽度 + 剩下屏幕的宽度的1/3 =
0 + 1/3(math_parent - 2*0) = 1/3match_parent

btn2所占的宽度为:本身宽度 + 剩下屏幕的宽度的2/3 =
0+ 2/3(math_parent - 2*0) = 2/3match_parent

可以看出btn1和btn2实际的宽度比就等于它们的权重比。

总结:

①权重是把屏幕剩余空间按比例分配

②如果wrap_content,那么权重越大,位置占的越多,再小小不过wrap_content

③如果match_parent,那么权重越大,位置占的越少,再大大不过match_parent

④如果使用0dp,则实际的宽度比就等于权重比

© 著作权归作者所有

共有 人打赏支持
Mr_Nice
粉丝 0
博文 47
码字总数 39947
作品 0
广州
关于对Layout_weight的理解

最近一段时间,有朋友经常问我关于android布局文件里Layout_weight到底是什么作用,之前我也被困扰,随着知识的增长,也慢慢知道了缘由,并将自己的理解分享如下: layout_weight的权重不是指...

nuke
2013/10/10
0
0
Android 布局详解 -一线性布局以及重要属性

Android 布局详解 Android 布局是开发中非常重要的一个知识部分,它的布局分为以下几种: Linear Layout:线性布局 Relative Layout:相对布局 Table Layout:表格布局 Grid View:网格布局 ...

-天蓬元帅-
2013/12/15
0
0
Android:Layout_weight的深刻理解,个人首发,欢迎转载和顶贴!

分类: Android2012-06-06 00:58 439人阅读 评论(10) 收藏 举报 最近写Demo,突然发现了Layout_weight这个属性,发现网上有很多关于这个属性的有意思的讨论,可是找了好多资料都没有找到一个...

thisiscx
2012/12/27
0
3
Android绘制View的过程研究——计算View的大小

一、android绘制view的过程简单描述 简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw); 下面看看每一步的动作到底是什么, 第一步:当activity启动的...

Kobe_Gong_5
2013/05/20
0
0
Android布局之LinearLayout

LinearLayou(线性布局布局) 一些重要的属性: 一 orientation(朝向) 该属性值有两种一种是垂直朝向(verticle),还有一个是水平朝向(horizontal) [html] view plaincopy <LinearLayout xmlns:an...

二麻子
2012/08/15
0
1
Android 的几种布局方式及实践

我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World!”程序来实践证明了。在继续深入Android开发之旅之前,有必要解决前两篇中没有介绍的遗留问题...

sumpower
2014/02/25
0
0
android:layout_weight属性详解

 在android开发中LinearLayout很常用,LinearLayout的内控件的android:layoutweight在某些场景显得非常重要,比如我们需要按比例显示。android并没用提供table这样的控件,虽然有TableLayo...

墨梅
2014/03/19
0
0
Android 第七课——UI布局

Android布局分为:线性布局、相对布局、表格布局、帧布局、网格布局五种 布局中的距离单位:dp、px、sp。 布局继承关系图: 1)熟悉几个常用属性 <Button android:id="@+id/loginName" andr...

learn_more
2015/01/03
0
0
Android:Layout_weight的深刻理解

2012-12-31 14:59 佚名 OSChina我要评论(0) 字号:T |T 本文详细介绍了Android布局中Layout_weight的属性,它是用来分配属于空间的一个属性,你可以设置他的权重。 AD:2013云计算架构师峰会...

java-苦苦甜甜
2013/07/09
0
3
在使用ListActivity 提示没有R.id.list 这个id

问题如题: 在自己开发使用list 的时候总是不能将这个问题忘掉 解决办法: <ListView android:id="@android :id/list" android:layoutwidth="matchparent" android:layoutheight="matchpare......

andyiac
2013/09/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

流利阅读笔记29-20180718待学习

高等教育未来成谜,前景到底在哪里? Ray 2018-07-18 1.今日导读 在这个信息爆炸的年代,获取知识是一件越来越容易的事情。人们曾经认为,如此的时代进步会给高等教育带来众多便利。但事实的...

aibinxiao
5分钟前
2
0
第15章FTP服务搭建与配置

15.1FTP介绍 FTP多用于Windows传文件到linux rz sz在文件超过4G,就无法使用了——>安装包yum install -y install lrzsz rz把 window 上的文件传输到 linux 上 sz 把 linux 上的文件传输到 ...

Linux学习笔记
13分钟前
0
0
OSChina 周三乱弹 —— 你被我从 osc 老婆们名单中踢出了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小鱼丁:分享五月天的单曲《后来的我们 (电影《后来的我们》片名曲)》: 《后来的我们 (电影《后来的我们》片名曲)》- 五月天 手机党少年们想...

小小编辑
17分钟前
6
1
Spring Boot Admin 2.0开箱体验

概述 在我之前的 《Spring Boot应用监控实战》 一文中,讲述了如何利用 Spring Boot Admin 1.5.X 版本来可视化地监控 Spring Boot 应用。说时迟,那时快,现在 Spring Boot Admin 都更新到 ...

CodeSheep
36分钟前
0
0
Python + Selenium + Chrome 使用代理 auth 的用户名密码授权

米扑代理,全球领导的代理品牌,专注代理行业近十年,提供开放、私密、独享代理,并可免费试用 米扑代理官网:https://proxy.mimvp.com 本文示例,是结合米扑代理的私密、独享、开放代理,专...

sunboy2050
今天
0
0
实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部