我们开发时打仗最多的就是xml结构了,还记得我们写Android的第一个Hello World吗,就是通过activity_main.xml表现出来的。
固然xml写的许多,而且也没有什么技能难度,但是,这也每每是我们最轻易忽略的地方,写xml不难,写出好的xml还是得下点功夫了。
什么算是好的xml结构呢,我以为核心有两点,一个是提升开发服从,另一个是提升app性能。围绕着这两点,我也经心整理出了17个xml结构小本领,下面一起来看看都有哪些,你又把握了几个呢?
Space
官网是这么先容的:
Space 是一个轻量级的 View 子类,可用于在通用结构中创建组件之间的间距。
为什么说是轻量级呢,是由于Space的draw方法是空的,也就是什么都不绘制,只有onMeasure方法丈量宽高。
来看下源码:
public final class Space extends View { /** * Draw nothing. * * @param canvas an unused parameter. */ @Override public void draw(Canvas canvas) { } //... @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension( getDefaultSize2(getSuggestedMinimumWidth(), widthMeasureSpec), getDefaultSize2(getSuggestedMinimumHeight(), heightMeasureSpec)); }}以是Space作用于组件之间的间距时,绘制服从更高,特殊是在须要动态修改间距时,这点尤为表现。
比如你要动态修改组件的margin,如果用Space来当间距,只须要修改Space的宽度或高度即可,由于镌汰了绘制流程,以是比重绘其他组件更高效。
使用起来也很简单:
<Space android:id="@+id/space" android:layout_width="20dp" android:layout_height="20dp"/>如果你想,Space完全可以更换margin,但是不肯定能更换padding,由于padding是内边距,如果padding有配景致的话,就不能用Space取代了,由于Space的draw方法什么都不绘制的缘故原由,以是也不会有配景致,除非配景致是在父view里设置的。
GuideLine
ConstraintLayout自2018年发布第一个正式版本以来,已经4年多了,它通过扁平化的结构方式,有效的办理了层级嵌套的题目,不但比RelativeLayout更机动,而且性能上更佳,再共同上可视化工具拖拽编辑,服从上也有大大的提升,如果你还没有效上,发起你肯定要实验一下。
而在使用ConstraintLayout的过程中,我发现有些同学总是会忽略GuideLine,只管ConstraintLayout已经非常好用了,但是有些结构仍旧显得有些「鸠拙」。而如果你能妙用GuideLine,你会发现,结构越来越简单,适配也越来越方便。
GuideLine是ConstraintLayout结构的辅助对象,仅用于结构定位使用,它被标志了View.GONE,并不会表现在设备上。
来看下源码:
public class Guideline extends View { public Guideline(Context context) { super(context); super.setVisibility(View.GONE); } public Guideline(Context context, AttributeSet attrs) { super(context, attrs); super.setVisibility(View.GONE); } public Guideline(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); super.setVisibility(View.GONE); } public Guideline(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr); super.setVisibility(View.GONE); } //... @SuppressLint("MissingSuperCall") @Override public void draw(Canvas canvas) { } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(0, 0); } //...}标志为View.GONE是这句super.setVisibility(View.GONE)设置的默认值,不表现还是由于draw方法为空,跟上面的Space同出一辙。
GuideLine可以通过3种差别的方式来辅助定位: