收集一些布局优化技巧,持续更新……
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
去做
但是也可以通过Spannable
或Html.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
,也可以直接使用LinearLayout
的android:divider
属性,android:showDividers
可以设置显示位置,android:dividerPadding
可以设置内边距
Space
要为布局间添加间距,可以通过添加一个空的View
,也可以通过设置margin
,但前者影响性能,后者影响可读性,这时可以使用Space
,它也很轻量
移除不必要的背景
过多的背景叠加会导致过度绘制,会影响性能
假设我们的
Activity
背景是白色,Activity
的布局最终会加入DecorView
中,那么这个View
中的背景就没必要了,通过下面的代码getWindow().setBackgroundDrawable(null);
使用TextSwitcher和ImageSwitcher平滑过渡
很多时候文字改变的时候希望不那么突兀,平滑一点,可以使用这些类
使用TextSwitcher
- 获得
TextSwitcher
对象 - 通过
setFactory()
设置ViewFactory
,实现makeView()
方法,返回实际的TextView
- 通过
setInAnimation()
设置换入动画 - 通过
setOutAnimation()
设置换出动画
ImageSwitcher
也是同样的用法
这两个控件的目的是使过度更自然,代码更易读,因此不要滥用它们
在onCreate中获得视图的宽高
在onCreate()
中调用getWidth()
和getHeight()
获得的都是0,可以使用post()
方法
view.post(new Runnable() {
@Override
public void run() {
int height = view.getHeight();
int width = view.getWidth();
}
});