跟layout_weight说88,轻松搞定百分比布局

小到控件布局,大到整个app的屏幕适配,百分比布局都是很重要的。可惜、可恨的是android的百分比布局先天支持的不太好。举个例子,如果说要使两个按钮按照1:2铺满父容器,该怎么办,这个大家会说,很容易啊:

(1)      先把按钮都放进LinearLayout容器。

(2)      修改按钮的layout_weight,分别赋值为1和2。

正如所说,效果还不错!

但是如果按钮的内容太多了,就不行了。

原来,layout_weight的意思是在布局(没有layout_weight)后,把剩余空间按照比例再次分配给控件,并不是真的百分比布局。OK,忍忍吧,把按钮的layout_width直接设置为0,不就行了。的确,搞定。

但是,如果两个按钮不是很规矩,按钮2顶部偏要和按钮1的底部对齐(有各种设计需求,大家懂得),该怎么办?

还可以继续忍:创建两个LinearLayout容器,一个在上,一个在下,把按钮1放在上面的LinearLayout,后面加入Space, 设置 layout_weight,分别为1和2。在下面的LinearLayout容器中,先加入Space,layout_weight设置为1,最后放入按钮2,layout_weight设置为2。复杂是复杂了点,不过也算OK。代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
  >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
         android:layout_margin="0dp"
         android:padding="0dp">
        <Button
            android:id="@+id/button1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Button 1"
            android:layout_weight="1"/>

        <Space
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_weight="2" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <Space
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_weight="1" />

       <Button
            android:id="@+id/button2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Button 2"
            android:layout_weight="2"/>
    </LinearLayout>
</LinearLayout>

接着看下面的,这个怎么办?

按钮1和按钮2的宽度比例仍然是1:2,但是按钮1是右挨着中间位置,两个按钮左对齐。

不容置疑,大家还是有各种办法的。但是,我是受不了,不能再忍了!layout_weight, 去你的!那不用layout_weight,该怎么办呢?先看代码:

<?xml version="1.0" encoding="utf-8"?>
<com.lanbitou.components.TagRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button 1 "
        android:tag="l:50w%p-100w%;w:33w%p"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button 2"
        android:tag="l:100l%button1;w:67w%p"/>
</com.lanbitou.components.TagRelativeLayout>

更复杂的布局,但是代码很简洁,是不是?怎么办到的?就如大家看到了,我引入了一个新布局器TagRelativeLayout。它支持在视图tag里面用简单的表达式来定义位置和大小属性。水平位置、垂直位置、宽度、高度属性分别用l、t、w、h表示,也就是left、top、width、height的首字母。属性和值作为一个属性对,用冒号分开。属性值可以是绝对值,比如: 20,单位不用写,默认是dp;也可以是百分比,比如上面例子中的按钮1,它的宽度是这样指定的:33w%p。是什么意思呢?%前面的字母(w、h、l、t)代表相对视图的属性,数字就是百分比例。%后面代表的是相对视图的id,有两种特殊情况:如果没有写id就是相对于自己,p代表父视图。所以w:33w%p的意思就是按钮1的宽度是父视图宽度的33%。

此外,属性值支持加减运算。比如上面按钮1的水平位置是这样指定的: l:50w%p-100w%。首先,我们来分解下,50w%p代表父亲宽度的一半,也就是水平中间位置;100w%就是自己的宽度。连起来就是水平中间位置减去自身的宽度。换句话说,按钮1右对齐水平中央位置。

现在来看看一些表达式的例子。

水平、垂直居中:

 android:tag="l:50w%p-50w%;t:50h%p-50h%"

上图:

等宽:

  android:tag="t:100t%button1+100h%button1;w:100w%button1" //按钮2的tag,主要看w的属性值

效果是这样的:

垂直居中:


android:tag="l:60w%p;t:100t%button1+50h%button1-50h%"//按钮2的tag,主要看t的属性值

更多的?留给大家写吧。

TagRelativeLayout布局简单、灵活。再也不需要为了布局,构建复杂的视图层次了,一个TagRelativeLayout全部搞定,让RelativeLayout和LinearLayout见鬼去吧!

TagRelativeLayout 代码下载

跟layout_weight说88,轻松搞定百分比布局

时间: 2024-10-09 07:39:32

跟layout_weight说88,轻松搞定百分比布局的相关文章

轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解析),但吃的时候还是一口一口的吃(JS逐行执行)! OK,解决下面五个问题,JS预解析就算过了~~(前提:对JS变量作用域有清晰理解) 一.JS预解析是什么? 其实就是对程序要用到的材料(变量,函数)给一个初始值,并存到一个表中(我自己虚构的),当程序运行到那一行时,就来这个表看有没有初始值,没有就

六步轻松搞定,自建APP不求人

随着互联网浪潮的席卷,越来越多的传统企业开始涉足互联网领域.无论是出于企业转型升级考虑,还是受市场整体环境的驱动,很多企业凭借某一领域的绝对优势,浩浩荡荡进军移动互联网领域,通过自建APP的方式,推出属于自己的移动端应用产品. 不少企业在探寻如何自建APP的过程中,遇到的第一个决策性难题就是:自建APP开发团队还是外包APP建设?其实对于大多数企业而言,由于企业内部组织架构设置问题,尚没有配备完善的自建APP开发团队,同时财政预算有限,难以承担整体自建APP工作.对于这类中小型企业而言,如何能够

centos下yum安装lamp和lnmp轻松搞定

centos下yum安装lamp和lnmp轻松搞定,到底多轻松你看就知道了,妈妈再也不担心不会装lamp了. 很辛苦整理的安装方法,会持续更新下去.凡无法安装的在评论里贴出问题来,会尽快解决.共同维护一个可用yum可用更新. 软件列表:php5.4 apache2.2 mysql5.5 nginx1.8 centos6.x rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ng

Webcast / 技术小视频制作方法——自己动手录制video轻松搞定

Webcast / 技术小视频制作方法——自己动手录制video轻松搞定 http://blog.sina.com.cn/s/blog_67d387490100wdnh.html 最近申请加入MSP的童鞋应该发现了一个新的要求——制作简短的视频!视频的内容要求是与微软技术相关~我们希望通过使用这种方法,简化申请流程,加强对创意.微软相关技术的考察~关于MSP项目以及申请流程的细则近期也会出台,请童鞋们耐心等待~ 首先呢,就跟广大的童鞋们介绍一款简单使用的录屏软件~而通过简单的安装,便可以轻松.便

轻松搞定javascript原型链 _proto_

//如有错误或不同观点,欢迎批评与讨论!首先,prototype出现的目的,是为了解决 代码重用 的问题 , prototype 相当于是在内存上划分出一个公共的区域, 专用于存放 实例化对象 的相同方法或属性, 一份代码,人人可用:为方便理解,我们可以先把prototype 当作是CSS中的 class,在prototype上加方法和属性,那么其它对象就会拥有这些方法和属性, 但这些代码紧有一份!<script>function Person(){this.name = '张三'; this

12步轻松搞定python装饰器

12步轻松搞定python装饰器 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语法的一些特点. 我没法让装饰器变得简单,但是通过一步步的剖析,我也许能够让你在理解装饰器的时候更自信一点.因为装饰器很复杂,这篇文章将会很长(自己都说很长,还敢这么多废话blablabla...前戏就不继续翻译直接省略了) 1. 函数 在python中,函数通

写文章赚钱34期:用100个问答轻松搞定1个领域!

很多人听说做自媒体很赚钱,在网络上只要一部手机.一台电脑就可以轻松赚钱,纷纷跑到网络上去尝试做. 他们选择了一个领域就开始写文章,但是写了一段时间后,却发现写得文章没人看,吸引不到精准粉丝,根本没有粉丝可以成交,非常痛苦,就觉得做自媒体根本不能赚钱,是骗人的. 俊哥说:只有先搞定一个领域,把你变成专家,你才能轻松赚钱.用100个问答文章轻松搞定1个领域! 任何一个行业.一个领域,问题整合起来最多不超过100个,你只要把这100个问题用文章写出来,相当于解决了粉丝心目中的问题,也轻松解决了行业里的

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条

【转】轻松搞定FTP之FlashFxp全攻略

转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融合了一些其他优秀FTP软件的优点.如像CuteFTP一样可以比较文件夹,支持彩色文字显示:像BpFTP支持多文件夹选择文件,能够缓存文件夹:像LeapFTP一样的外观界面,甚至设计思路也比较相似,支持文件夹 (带子文件夹)的文件传送.删除:支持上传.下载及第三方文件续传:可以跳过指定的文件类型,只传