8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
收集一些布局优化技巧,持续更新……
include标签
可以复用布局,统一修改管理,典型的比如标题栏,也可以在标签中重新设置layout属性
merge标签
用来去除不必要的视图层级
如果仅仅是添加子视图到父视图进行显示,而不指定任何针对父视图的布局属性,可以使用
另外,假如需要在LinearLayout里面嵌入一个布局,而恰恰这个布局的根节点也是LinearLayout,这样就多了一层没有用的嵌套,无疑这样只会拖慢程序速度,也需要使用
标签只能作为xml的根元素
TextView同时显示文字与图片
一般是一个ImageView加一个TextView,其实可以用TextView直接搞定public void setCompoundDrawables(@Nullable Drawable left, @Nullable Drawable top, @Nullable Drawable right, @Nullable Drawable bottom);
设置四个方向的drawablepublic 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定义字体颜色等等
CharacterStyleForegroundColorSpan
MaskFilterSpan
SuggestionSpan
RasterizerSpan
BackgroundColorSpan
StrikethroughSpan
UnderlineSpan
ClickableSpanURLSpan
MetricAffectingSpanSubscriptSpan
StyleSpan
AbsoluteSizeSpan
RelativeSizeSpan
TextAppearanceSpan
SuperscriptSpan
LocaleSpan
ScaleXSpan
TypefaceSpan
ReplacementSpanDynamicDrawableSpan
最后设置给TextViewmTextView.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();
}
});