湖畔镇

Android布局优化

收集一些布局优化技巧,持续更新……

include标签

可以复用布局,统一修改管理,典型的比如标题栏,也可以在<include>标签中重新设置layout属性

merge标签

用来去除不必要的视图层级

如果仅仅是添加子视图到父视图进行显示,而不指定任何针对父视图的布局属性,可以使用

另外,假如需要在LinearLayout里面嵌入一个布局,而恰恰这个布局的根节点也是LinearLayout,这样就多了一层没有用的嵌套,无疑这样只会拖慢程序速度,也需要使用

<merge>标签只能作为xml的根元素

TextView同时显示文字与图片

一般是一个ImageView加一个TextView,其实可以用TextView直接搞定

public void setCompoundDrawables(@Nullable Drawable left, @Nullable Drawable top, @Nullable Drawable right, @Nullable Drawable bottom);

设置四个方向的drawable

public void setCompoundDrawablePadding(int pad);

设置图片和文字的距离

利用TextView的行间距

android:lineSpaceingExtra属性可以改变行间距,还有android:lineSpacingMultiplier设定行距倍数

遇到多行文本,行间有一定距离的场景,就不需要多个TextView

一个TextView中不同的样式

如果一段文字中有多种样式,一般就是分成几个TextView去做

但是也可以通过SpannableHtml.fromHtml()实现

String text;
SpannableStringBuilder style = new SpannableStringBuilder(text);

SpannableStringBuilder.setSpan()

public void setSpan(Object what, int start, int end, int flags);

设置的东西都是CharacterStyle的子类,比如AbsoluteSizeSpan定义字体大小,ForegroundColorSpan定义字体颜色等等

CharacterStyle

  • ForegroundColorSpan
  • MaskFilterSpan
  • SuggestionSpan
  • RasterizerSpan
  • BackgroundColorSpan
  • StrikethroughSpan
  • UnderlineSpan
  • ClickableSpan
    • URLSpan
  • MetricAffectingSpan
    • SubscriptSpan
    • StyleSpan
    • AbsoluteSizeSpan
    • RelativeSizeSpan
    • TextAppearanceSpan
    • SuperscriptSpan
    • LocaleSpan
    • ScaleXSpan
    • TypefaceSpan
    • ReplacementSpan
      • DynamicDrawableSpan

最后设置给TextView

mTextView.setText(style);

ViewStub

ViewStub是个轻量级的View,不占用布局位置,可以实现按需加载,比如网络请求失败的提示页面

一旦ViewStub可见或是被inflate()了,它就不存在了,被获得的View取代

LinearLayout的分割线

比如两个按钮之间的一道分割线,一般都是用一个View,也可以直接使用LinearLayoutandroid:divider属性,android:showDividers可以设置显示位置,android:dividerPadding可以设置内边距

Space

要为布局间添加间距,可以通过添加一个空的View,也可以通过设置margin,但前者影响性能,后者影响可读性,这时可以使用Space,它也很轻量

移除不必要的背景

过多的背景叠加会导致过度绘制,会影响性能

假设我们的Activity背景是白色,Activity的布局最终会加入DecorView中,那么这个View中的背景就没必要了,通过下面的代码

getWindow().setBackgroundDrawable(null);

使用TextSwitcher和ImageSwitcher平滑过渡

很多时候文字改变的时候希望不那么突兀,平滑一点,可以使用这些类

使用TextSwitcher

  1. 获得TextSwitcher对象
  2. 通过setFactory()设置ViewFactory,实现makeView()方法,返回实际的TextView
  3. 通过setInAnimation()设置换入动画
  4. 通过setOutAnimation()设置换出动画

ImageSwitcher也是同样的用法

这两个控件的目的是使过度更自然,代码更易读,因此不要滥用它们

在onCreate中获得视图的宽高

onCreate()中调用getWidth()getHeight()获得的都是0,可以使用post()方法

view.post(new Runnable() {
    @Override
    public void run() {
        int height = view.getHeight();
        int width = view.getWidth();
    }
});
分享