更多关于Toolbar的使用请移步Toolbar使用详解系列
从Toolbar的使用一步步解析Toolbar源码
大体架构
API 0.设置导航图标
mToolbar.setNavigationIcon(R.drawable.ic_actionbar_flow);
源码如下
public void setNavigationIcon(int resId) {
this.setNavigationIcon(this.mTintManager.getDrawable(resId));
}
setNavigationIcon
public void setNavigationIcon(@Nullable Drawable icon) {
if(icon != null) {
this.ensureNavButtonView();
if(this.mNavButtonView.getParent() == null) {
this.addSystemView(this.mNavButtonView);
this.updateChildVisibilityForExpandedActionView(this.mNavButtonView);
}
} else if(this.mNavButtonView != null && this.mNavButtonView.getParent() != null) {
this.removeView(this.mNavButtonView);
}
if(this.mNavButtonView != null) {
this.mNavButtonView.setImageDrawable(icon);
}
}
先判断传入图片参数是否为null
- null,移除导航图片。
- 不为null,新建一个ImageView,设置其LayoutParams,最后设置ImageView的图片为入参。
ensureNavButtonView
保证导航图片不为null,为null则新建并添加。
private void ensureNavButtonView() {
if(this.mNavButtonView == null) {
this.mNavButtonView = new ImageButton(this.getContext(), (AttributeSet)null, attr.toolbarNavigationButtonStyle);
Toolbar.LayoutParams lp = this.generateDefaultLayoutParams();
lp.gravity = 8388611 | this.mButtonGravity & 112;
this.mNavButtonView.setLayoutParams(lp);
}
}
设置导航图标,通过LayoutParams.gravity
lp.gravity=8388611设置gravity=start即左边开始位置
在Toolbar构造函数内对gravity进行了初始化
this.mButtonGravity = 48;
48:gravity = top