Layout 布局

张开发
2026/4/9 20:54:11 15 分钟阅读

分享文章

Layout 布局
命名空间自定义属性命名空间在XML布局文件的根元素上定义app命名空间。这是通过在根元素上添加xmlns:apphttp://schemas.android.com/apk/res-auto属性来实现的通常使用命名为app也可以使用其它名称。通过app命名空间可以使用自定义的属性来设置视图的行为或样式。这些属性需要在项目的res/values/attrs.xml文件中预先定义declare-styleable。LayoutInflater在Android开发中自定义View通常涉及到使用inflate()方法来加载一个布局并将其附加到某个父View上。这个过程涉及到两个关键的步骤首先是使用LayoutInflater类来加载布局资源其次是可选地将这个视图附加到它的父视图上。LayoutInflater把xml描述的layout布局转化为View对象findViewById()找具体xml中的具体widget控件。setContentView()一旦调用, layout就会立刻显示UIinflater只会把Layout形成一个以view类实现成的对象有需要时再用setContentView(view)显示出来View viewLayoutInflater.from(context).inflate(layoutId, null);View inflate(int resource, ViewGroup root)ViewGroup root可以是nullnull时只创建一个resource对应的View不是null时会将创建的view自动加为root的child。merge标签merge标签是合并标签。用在定义被包含的独立布局定义一个虚拟包含层。ViewStub标签ViewStub标签是占位符标签通过android:layout指定其替代内容但需要调用inflate()方法后才会真正替代。要加载的布局不能是 merge 或 include。ViewStub就是一个宽高都为0的View它默认是不可见的只有通过调用setVisibility函数或者Inflate函数才会将其要装载的目标布局给加载出来从而达到延迟加载的效果这个要被加载的布局通过android:layout属性来设置最终目的是把app加载页面的速度提高了。android:foregroundforeground 也就是前景色它与background相对应它指定的drawable是在view视图的上方绘制的。Android在View类中 就定义了 foreground 这个属性但是测试发现运行时只有FrameLayou布局上设置该属性才会生效。观察View的代码发现这样一段。它只针对是FrameLayout的实例做获取该styleable的操作。case R.styleable.View_foreground: if (targetSdkVersion VERSION_CODES.M || this instanceof FrameLayout) { setForeground(a.getDrawable(attr)); } break; case R.styleable.View_foregroundGravity: if (targetSdkVersion VERSION_CODES.M || this instanceof FrameLayout) { setForegroundGravity(a.getInt(attr, Gravity.NO_GRAVITY)); } break;ScrollView HorizontalScrollView NestedScrollView 区别ScrollView、HorizontalScrollView中只能放置一个直接的子视图。区别总结‌滚动方向‌ScrollView垂直滚动。HorizontalScrollView水平滚动。NestedScrollView垂直滚动专门用于处理嵌套滚动情况。‌使用场景‌使用ScrollView当需要垂直滚动内容时。使用HorizontalScrollView当需要水平滚动内容时。使用NestedScrollView当布局中包含多个可滚动的视图并且希望它们能正确协同工作时。‌兼容性ScrollView和HorizontalScrollView在所有Android版本中都可用。NestedScrollView仅在Android 5.0及以上版本中可用。实现叠加布局的方式方法一使用FrameLayout方法二使用RelativeLayout方法三使用ConstraintLayouthttps://blog.csdn.net/q7w8e9r4/article/details/139536300如何使用 ConstraintLayout 来减少嵌套层级优化性能https://cloud.tencent.com/developer/article/2496091LinearLayoutLinearLayout是Android中最基础的布局之一提供水平和垂直两种排列方式。其性能特点主要表现在简单布局高效对于不含权重的简单布局LinearLayout测量效率很高。权重计算代价高使用layout_weight属性会导致二次测量增加计算复杂度。嵌套代价显著多层LinearLayout嵌套会使测量次数呈几何级数增长。ConstraintLayout在Android应用开发中布局性能直接影响流畅度。ConstraintLayout作为新一代布局方案通过扁平化设计和强大的约束系统为高性能UI开发提供了全新解决方案。布局性能基础与测量机制Android的UI渲染过程主要包含三个关键阶段测量Measure、布局Layout和绘制Draw。测量阶段确定每个视图的大小布局阶段确定视图在屏幕上的位置绘制阶段则将视图实际渲染到屏幕上。布局性能的核心瓶颈往往出现在测量阶段特别是当视图层级过深或存在复杂依赖关系时。传统布局如LinearLayout在测量时需要遍历所有子视图两次第一次计算基本尺寸第二次根据权重分配剩余空间。这种双重测量机制在嵌套多层时会导致指数级增长的测量次数。RelativeLayout则因为需要处理视图间的相对位置关系可能需要进行多次测量迭代才能确定最终布局。MotionLayoutMotionLayout 是 ConstraintLayout 2.0 引入的动态布局容器作为 ConstraintLayout 的子类它通过 XML 定义界面元素的动态过渡效果。其核心优势在于声明式动画开发者无需编写Java/Kotlin 代码仅通过ConstraintSet和Transition标签即可实现复杂的界面交互。1.布局比重值 android:layout_weighthttp://hi.baidu.com/mendynew/blog/item/5d0c5bee1bc4ceedb3fb953f.htmllayout_weight的值是描述在布局完了之后剩余空间如何分配。layout_weight相同只说明剩余空间的分配大小相同而组件的实际宽度/高度则是组件需要的空间加上layout_weight分配的空间。layout_weight的设置和layout_height,layout_width不同的组合得出来不同的结果!比如在LinearLayout中水平4个TextView如果想既保持每个TextView的字符串长度不一致且每个TextView的宽度相同把TextView中的属性android:layout_width值设置为fill_parent。要想使每个控件按比例显示宽度最好的方法还是配置或动态计算设置其layout_width值。数值越小比重占的越大分配的越多。在java代码中它对应 LinearLayout.LayoutParams.weight;LinearLayout.LayoutParams用于设置LinearLayout的子视图的布局参数。2.gravity举例buttonandroid:layout_gravity 表示按钮在父视图中的位置。android:gravity表示button中的子视图比如其文字在button中的位置。android:paddingLeft表示内部左边距android:layout_marginLeft表示外部左边距3.布局中必须设置 android:layout_width, android:layout_heightLinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationverticalandroid:layout_widthfill_parentandroid:layout_heightfill_parent中必须设置 android:layout_width, android:layout_height属性否则运行出错。4.LinearLayout获取其尺寸先调用measure()方法测量然后调用getMeasuredWidth()获取最小尺寸。android3.0的LinearLayout有setShowDivider()方法设置分隔线或分隔图像当orientationvertical时子view的layout_gravity只在水平方向起作用。当orientationhori...时子view的layout_gravity只在垂直方向起作用。当设置LinearLayout的gravity为center时可能子view会两个方向居中。5.View存为图片7.FrameLayout是最简单的一个布局对象。它被定制为屏幕上的一个空白备用区域之后可以在其中填充一个单一对象。所有的子元素将会固定在屏幕的左上角不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充把它们部份或全部挡住除非后一个子元素是透明的。9.TableLayout中没有行线和列线只能自己添加View并设置其宽高。使用继承自View的类在其draw方法中drawline.http://www.microschool.net/Subjects/Blog/BlogArticle.aspx?id1160513.自定义View以及layout属性http://www.pin5i.com/showtopic-android-view-layout.html实现把自定义的View在layout的xml文件中标签化显示要重写CustomView(Context context, AttributeSet attrs)构造方法注意在xml中加上包名。获取视图在屏幕中的位置view.getLocationOnScreen();动态设置属性layoutParams.addRule()可以实现动态设置所有属性。14.可以使用merge标签来替代布局中的根标签FrameLayout16.Android UI 开发大全http://blog.51cto.com/zt/148http://www.mikel.cn/%E5%BC%80%E5%8F%91%E7%AC%94%E8%AE%B0/%E8%BD%AC%E8%BD%BDandroid%E5%BC%80%E5%8F%91%E4%B9%8Bui%E5%BA%93%E5%8F%8A%E7%BB%84%E4%BB%B6%E8%B5%84%E6%BA%90.html

更多文章