• 你们对LinearLayout线性布局中Layout_weight的误解


    帮人找个入门级别的书得负责任,自己先看一下有无缺陷,结果发现这个:(原文发在该书的论坛上,发现受众面太小了,无奈转到这个弃用很久的博客里,以后把心得慢慢发上来)


    Google Android开发入门与实战,第二版,P104倒数第七行括弧内容:(layout_weight越小权重越大)。



    SDK中的原话:Indicates how much of the extra space in the LinearLayout will be allocated to the view associated with these LayoutParams. Specify 0 if the view should not be stretched. Otherwise the extra pixels will be pro-rated among all views whose weight is greater than 0.


    这是什么意思呢?主要是两个关键点:extra space和pro-rated among all views,额外的空间和大小比例


    说到额外的空间,不得不提另外几个属性,假设LinearLayout的android:orientation="horizontal",即水平分布,在三个控件的存在情况下,其layout_weight属性值分别为122(单个控件在某些情况下会标警示黄线,请自己尝试):


    第一种情况:每个控件的宽度属性都为android:layout_width="0dp",那么额外的空为(手机的宽度假设为X)X-0-0-0=X,那么根据sdk上所述:
    第一个控件的宽度为 0+(1/(1+2+2))*X=X/5
    第二个控件的宽度为 0+(2/(1+2+2))*X=2X/5
    第三个控件的宽度为 0+(2/(1+2+2))*X=2X/5


    第二种情况:每个控件的宽度属性都为android:layout_width="match_parent",那么额外的空间就是X-X-X-X=-2X
    第一个控件的宽度为 X+(1/(1+2+2))*(-2X)=3X/5
    第二个控件的宽度为 X+(2/(1+2+2))*(-2X)=X/5
    第三个控件的宽度为 X+(2/(1+2+2))*(-2X)=X/5


    第三种情况:其中第一个控件宽度属性为android:layout_width="match_parent",其他两个控件宽度为android:layout_width="0dp",额外的空间为X-X-0-0=0
    第一个控件的宽度为 X+(1/(1+2+2))*0=X
    第二个控件的宽度为 0+(2/(1+2+2))*0=0
    第三个控件的宽度为 0+(2/(1+2+2))*0=0


    第四种情况:第一个和第二个控件宽度属性为android:layout_width="match_parent",第三个控件宽度为android:layout_width="0dp",这个大家自己动手算算,结果很有趣。


    最终结论:layout_weight的公式


    控件的宽度(高度)=控件的width(height)值+(该控件的weight值/所有控件的weight的和)×额外的空间


    额外的空间=手机的宽度(高度)-所有控件的宽度(高度)


    有质疑的可以自己去写个代码尝试一下,希望都能踏踏实实的学习、工作,少点人云亦云,有自己的思想,网络上有关layout_weight的文章大部分都是错误的,希望本帖可以帮助一部分人。











  • 相关阅读:
    从Swift3的标准库协议看面向协议编程(一)
    iOS多线程到底不安全在哪里?
    typealias和泛型接口
    iOS蓝牙开发CoreBluetooth快速入门
    iOS学习路线图
    iOS开发masonry的一些使用简介
    在Swift项目中使用cocoaPods导入第三方OC库
    微信小程序开发POST请求
    一些NSArray,NSDictionary,NSSet相关的算法知识
    iOS开发中的权限
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3400184.html
Copyright © 2020-2023  润新知