layout_weight属性的再认识

package cc.testlayout_weight;

import android.os.Bundle;
import android.app.Activity;
import android.view.ViewTreeObserver;
import android.widget.TextView;
/**
 * Demo描述:
 * layout_weight属性的再认识
 *
 * 原理说明:
 * layout_weight的意思是:
 * 按照权重比例分享剩余空间的大小
 * 什么意思呢?
 * 一个通俗的例子:
 * 一个水平方向的线性布局,每个控件大小均为20,屏幕宽度为480
 * 那么剩余空间大小为480-(20+20+20)=420
 * 假设他们的layout_weight分别为 1 2 3
 * 那么按照权重他们分别分得剩余空间为
 * 420*(1/6)=70
 * 420*(2/6)=140
 * 420*(3/6)=210
 *
 * 所以每个控件实际分得空间大小为
 * 20+70=90
 * 20+140=160
 * 210+20=230
 *
 * 步骤说明:
 * 在线性布局中使用layout_weight属性
 * 第一步:
 * 不考虑layout_weight属性,明确各控件所占空间的原始大小且计算它们共需要占的空间大小
 * 第二步:
 * 利用总空间大小(如屏幕宽度)-它们共需要占的空间大小=剩余空间
 * 第三步:
 * 计算每个控件最终分得的空间大小
 * 最终大小=原始大小+按照比例分得的剩余空间
 *
 *
 * 示例1:
  <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" >

    <TextView
        android:id="@+id/firstTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#0045f5"
        android:gravity="center"
        android:text="1" />

    <TextView
        android:id="@+id/secondTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="#00ff47"
        android:gravity="center"
        android:text="2" />

    <TextView
        android:id="@+id/thirdTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="#ff5600"
        android:gravity="center"
        android:text="3" />

</LinearLayout>
 *
 * 分析说明:
 * 第一个TextView的宽为wrap_content,且没有设置layout_weight属性
 * 第二及三个TextView的宽为wrap_content,均设置layout_weight属性
 * 所以剩余空间为:
 * 480-(12+12+12)=444
 * 由于第一个TextView没有设置layout_weight,所以它的大小就是12.
 * 由于第二及三个TextView均设置layout_weight属性.所以这两者会
 * 按照比例来分享剩余的444空间,均分得444*(1/2)=222.
 * 所以第二及三个的宽度均为:原本的12+剩余空间分得的222=234
 *
 * 在这个例子中我们每个TextView的显示内容均很简单都是一个数字而已.
 * 所以在不考虑layout_weight属性的情况下他们的宽度都是wrap_content即12.
 * 那么要是我们在第二个TextView中显示的内容比较长,比如"22222222".
 * 那么他们的第二及三个TextView所占的长度还和刚才一样么?显示不一样.
 * 因为TextView的长度是由wrap_content指定的.
 * 在不考虑layout_weight属性的情况下,它的长度当然是由其内容决定的.
 * 要明白这个简单的道理.不能很生硬地照搬.
 *
 *
 * 示例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" >

    <TextView
        android:id="@+id/firstTextView"
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:background="#0045f5"
        android:gravity="center"
        android:text="1" />

    <TextView
        android:id="@+id/secondTextView"
        android:layout_width="0dip"
        android:layout_weight="2"
        android:layout_height="wrap_content"
        android:background="#00ff47"
        android:gravity="center"
        android:text="2222222222222222222" />

    <TextView
        android:id="@+id/thirdTextView"
        android:layout_width="0dip"
        android:layout_weight="3"
        android:layout_height="wrap_content"
        android:background="#ff5600"
        android:gravity="center"
        android:text="3" />

</LinearLayout>

 *
 * 分析说明:
 * 这三个TextView的宽度均设置为0dip.并且均设置了layout_weight属性
 * 所以剩余空间为:
 * 480-(0+0+0)=480
 * 现在再按照权重来分享剩余空间
 * 第一个TextView所分到的宽度为:480*(1/6)=80
 * 第二个TextView所分到的宽度为:480*(2/6)=160
 * 第三个TextView所分到的宽度为:480*(3/6)=240
 * 所以它们最终所占宽度为:
 * 第一个TextView 0+80=80;
 * 第二个TextView 0+160=160;
 * 第三个TextView 0+240=240;
 *
 * 所以在这里例子中提示我们:
 * 如果要按照一定的比重来平分空间.我们可以将这些空间的宽度
 * 均设置为0,且分别设置比重即可.
 *
 * 示例3:
 <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" >

    <TextView
        android:id="@+id/firstTextView"
        android:layout_width="fill_parent"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:background="#0045f5"
        android:gravity="center"
        android:text="1" />

    <TextView
        android:id="@+id/secondTextView"
        android:layout_width="fill_parent"
        android:layout_weight="2"
        android:layout_height="wrap_content"
        android:background="#00ff47"
        android:gravity="center"
        android:text="2222222222222222222" />

    <TextView
        android:id="@+id/thirdTextView"
        android:layout_width="fill_parent"
        android:layout_weight="3"
        android:layout_height="wrap_content"
        android:background="#ff5600"
        android:gravity="center"
        android:text="3" />

</LinearLayout>
 *
 * 分析说明:
 * 我们只是在示例2的基础上做了很小的修改,让每个TextView的的宽度均为fill_parent
 * 那么在不考虑layout_weight属性的时候每个TextView所占的大小均为480.
 * 所以剩余空间为:
 * 480-(480+480+480)=-960
 * 所以每个TextView分到的剩余空间为:
 * 第一个TextVeiw -960*(1/6)=-160
 * 第二个TextVeiw -960*(2/6)=-320
 * 第三个TextVeiw -960*(6/6)=-480
 * 所以它们最终所占宽度为:
 * 第一个TextView 480+(-160)=320;
 * 第二个TextView 480+(-320)=160;
 * 第三个TextView 480+(-480)=0;
 *
 *
 * 示例4:
<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" >

    <TextView
        android:id="@+id/firstTextView"
        android:layout_width="wrap_content"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:background="#0045f5"
        android:gravity="center"
        android:text="1" />

    <TextView
        android:id="@+id/secondTextView"
        android:layout_width="fill_parent"
        android:layout_weight="2"
        android:layout_height="wrap_content"
        android:background="#00ff47"
        android:gravity="center"
        android:text="2222222222222222222" />

    <TextView
        android:id="@+id/thirdTextView"
        android:layout_width="fill_parent"
        android:layout_weight="3"
        android:layout_height="wrap_content"
        android:background="#ff5600"
        android:gravity="center"
        android:text="3" />

</LinearLayout>
 *
 * 分析说明:
 * 在示例3的基础上做了很小的修改,让第一个TextView的的宽度为wrap_content
 * 其余两个均为fill_parent
 * 所以在不考虑layout_weight属性的时候它们分别占空间为:
 * 12 480 480
 * 所以剩余空间为:
 * 480-(12+480+480)=-492
 * 所以每个TextView分到的剩余空间为:
 * 第一个TextVeiw -492*(1/6)=-82
 * 第二个TextVeiw -492*(2/6)=-164
 * 第三个TextVeiw -492*(3/6)=-246
 * 所以它们最终所占宽度为:
 * 第一个TextView 12+(-82)=-70;
 * 第二个TextView 480+(-164)=316;
 * 第三个TextView 480+(-246)=234;
 *
 * 测试设备:
 * Android2.3.3
 * 854x480
 *
 * 参考资料:
 * 1 http://blog.csdn.net/xiaanming/article/details/13630837
 * 2 http://blog.csdn.net/dazlly/article/details/13767343
 *  Thank you very much
 *
 */
public class MainActivity extends Activity {
   private TextView mFirstTextView;
   private TextView mSecondTextView;
   private TextView mThirdTextView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	private void init() {
		mFirstTextView = (TextView) findViewById(R.id.firstTextView);
		mSecondTextView=(TextView) findViewById(R.id.secondTextView);
		mThirdTextView=(TextView) findViewById(R.id.thirdTextView);
		ViewTreeObserver mViewTreeObserver = mFirstTextView.getViewTreeObserver();
		mViewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
					public boolean onPreDraw() {
						int first_height = mFirstTextView.getMeasuredHeight();
						int first_width = mFirstTextView.getMeasuredWidth();
						int second_height = mSecondTextView.getMeasuredHeight();
						int second_width = mSecondTextView.getMeasuredWidth();
						int third_height = mThirdTextView.getMeasuredHeight();
						int third_width = mThirdTextView.getMeasuredWidth();
						System.out.println("first_width=" + first_width+ ",first_height=" + first_height);
						System.out.println("second_width=" + second_width+ ",second_height=" + second_height);
						System.out.println("third_width=" + third_width+ ",third_height=" + third_height);
						return true;
					}
				});
	}

}

main.xml如下:

<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" >

    <TextView
        android:id="@+id/firstTextView"
        android:layout_width="wrap_content"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:background="#0045f5"
        android:gravity="center"
        android:text="1" />

    <TextView
        android:id="@+id/secondTextView"
        android:layout_width="fill_parent"
        android:layout_weight="2"
        android:layout_height="wrap_content"
        android:background="#00ff47"
        android:gravity="center"
        android:text="2222222222222222222" />

    <TextView
        android:id="@+id/thirdTextView"
        android:layout_width="fill_parent"
        android:layout_weight="3"
        android:layout_height="wrap_content"
        android:background="#ff5600"
        android:gravity="center"
        android:text="3" />

</LinearLayout>

 

时间: 2024-09-30 04:31:16

layout_weight属性的再认识的相关文章

android:layout_weight属性详解

在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示.android并没用提供table这样的控件,虽然有TableLayout,但是它并非是我们想象中的像html里面的table那么好用,我们常用ListView实现table的效果,但是列对齐确比较麻烦,现在用LinearLayout及属性android:layout_weight能很好地解决.下面我们共同体验下layo

我的Android进阶之旅------&amp;gt;关于android:layout_weight属性的详细解析

关于androidlayout_weight属性的详细解析 效果一 效果二 图3的布局代码 图4的布局代码 效果三 图7代码 图8代码 效果四 效果五 版权声明:本文为[欧阳鹏]原创文章,欢迎转载,转载请注明出处! [http://blog.csdn.net/ouyang_peng/article/details/50757149] 关于android:layout_weight属性的详细解析 效果一 图1 上面的效果图中三个文本框的宽度比为 1:2:3 图2 代码如下所示: <?xml ver

神奇的layout_weight属性

1.概述         在线性布局有时候为了控制一下屏幕的适配,可以使用layout_weight这个属性来设置权重,要注意一点,这个属性只有在Linearlayout中才有效,这个属性往往会随着Android:layout_width设置而变化,有时候可能出现一些意想不到的效果,下面来看看 2.实例效果 布局文件如下,水平放了2个文本,设置不同权重1:2 2.1.layout_width="0dp" [html] view plain copy <span style=&qu

link发射取得的属性怎么样再还原成发射以前得到的对象?

问题描述 link发射取得的属性怎么样再还原成发射以前得到的对象? link发射取得的属性怎么样再还原成发射以前得到的对象? 解决方案 首先搞清楚,可以通过反射创建一个属性值和原来一样的对象,但是这个对象不是原来那个对象 具体参考http://www.360doc.com/content/11/0422/14/5054188_111515699.shtml

Android 布局学习之——LinearLayout的layout_weight属性

 一直对layout_weight属性感到比较困惑,今天学习一下,来深入了解layout_weight属性和它的用法.      定义     首先,看看Android官方文档是怎么说的,毕竟人家才是权威嘛.                官方文档的意思是:                  layout_weight属性用于分配LinearLayout中的的额外空间(extra space).                  如果View不想拉伸的话,layout_weight值设置为0.否

Android 对Layout_weight属性完全解析以及使用ListView来实现表格

主要说的是对Layout_weight属性的完全解析,以及利用Layout_weight这个属性使用ListView来实现表格的效果,我们都知道Android里面专门有一个TableLayout来实现表格的,说实话,我平常开发中用TableLayout还是比较少的,几乎没有用到,我们完全可以用LinearLayout和RelativeLayout来代替TableLayout的使用,自己开发中主要使用LinearLayout,RelativeLayout这两种布局,不过刚开始我还是偏爱于Relat

Android应用中通过Layout_weight属性用ListView实现表格_Android

今天主要说的是对Layout_weight属性的完全解析,以及利用Layout_weight这个属性使用ListView来实现表格的效果,我们都知道Android里面专门有一个TableLayout来实现表格的,说实话,我平常开发中用TableLayout还是比较少的,几乎没有用到,我们完全可以用LinearLayout和RelativeLayout来代替TableLayout的使用,自己开发中主要使用LinearLayout,RelativeLayout这两种布局,不过刚开始我还是偏爱于Rel

Android应用中通过Layout_weight属性用ListView实现表格

今天主要说的是对Layout_weight属性的完全解析,以及利用Layout_weight这个属性使用ListView来实现表格的效果,我们都知道Android里面专门有一个TableLayout来实现表格的,说实话,我平常开发中用TableLayout还是比较少的,几乎没有用到,我们完全可以用LinearLayout和RelativeLayout来代替TableLayout的使用,自己开发中主要使用LinearLayout,RelativeLayout这两种布局,不过刚开始我还是偏爱于Rel

Android(安卓)中layout_weight属性详解

当控件本身layout_width设置为fill_parent的时候,layout_weight数值越小,所占空间越大,但尽可能大是有限度的,即fill_parent. 当控件本身layout_width设置为wrap_content的时候,layout_weight数值越小,所占空间也越小,但这个小是有限度的,即wrap_content. 例子 看了一下源码,虽说不太懂,但了解了下大概意思,按照自己的理解总结一下,直接写一下简化的代码吧(下面的代码是LinearLayout源文件中一部分的精简