我们活着不能与草木同腐,不能醉生梦死,枉度人生,要有所作为。——方志敏
概述
Design设计语言,在我们App端已经随处可见。具有界面更干净、更简约,支持各种新动画效果,具有内置的实时UI阴影,以及可在不同屏幕之间切换的hero元素等特点。
我们先来看看底部导航栏最终效果,有图才有真相嘛:
底部导航栏
首先我们来分析一下,底部导航栏固定在整个界面的底部,导航栏的内部是水平排版,对自然就想到了(Linearlayout)线性布局,线性布局内部子布局(weight)权重设置为1,自布局包含图片,图片通过颜色过滤器(ColorFilter)来设置颜色的变化。
底部导航栏由自定义BottomBar继承LinearLayout;BottomBarTab继承FrameLayout组成。下面一起来看看具体实现。
BottomBarTab类
public class BottomBarTab extends FrameLayout {
private Context mContext;
public BottomBarTab(Context context, @DrawableRes int icon) {
this(context, null, icon);
}
public BottomBarTab(Context context, AttributeSet attrs, @DrawableRes int icon) {
this(context, attrs, 0, icon);
}
public BottomBarTab(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BottomBarTab(Context context, AttributeSet attrs, int defStyleAttr, @DrawableRes int icon) {
super(context, attrs, defStyleAttr);
init(context, icon);
}
BottomBarTab类继承FrameLayout类,从写了4个构造方法。我们需要注意的是@DrawableRes int icon参数表示图片本地资源。
接着来分析下初始化init():
/** *@param context *@param icon */
private void init(Context context, int icon) {
this.mContext = context;
TypedArray typedArray = context.obtainStyledAttributes(
new int[]{android.support.v7.appcompat.R.attr.selectableItemBackgroundBorderless}
);
Drawable drawable = typedArray.getDrawable(0);
setBackgroundDrawable(drawable);
typedArray.recycle();
mIcon = new ImageView(mContext);
//单位 值 密度 当前手机密度为3 size=3*27=81
int size = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 27, getResources().getDisplayMetrics());
LayoutParams params = new LayoutParams(size, size);
params.gravity = Gravity.CENTER;
mIcon.setImageResource(icon);
mIcon.setLayoutParams(params);
mIcon.setColorFilter(ContextCompat.getColor(context, R.color.tab_unselect));
addView(mIcon);
}
主要是设置背景资源,添加图片以及图片的属性。
BottomBar类
我们来看一些关键代码
mTabLayout = new LinearLayout(mContext);
mTabLayout.setBackgroundColor(Color.WHITE);
mTabLayout.setOrientation(LinearLayout.HORIZONTAL);
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
mTabLayout.setLayoutParams(lp);
addView(mTabLayout);
mTabParams = new LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT);
mTabParams.weight = 1;
设置权重平分父布局。
public BottomBar addItem(final BottomBarTab tab) {
tab.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (mListener == null)
return;
int position = tab.getTabPosition();
if (mCurrentPosition == position) {
mListener.onTabReselected(position);
} else {
mListener.onTabSelected(position, mCurrentPosition);
tab.setSelected(true);
mListener.onTabUnselected(mCurrentPosition);
mTabLayout.getChildAt(mCurrentPosition).setSelected(false);
mCurrentPosition = position;
}
}
});
tab.setTabPosition(mTabLayout.getChildCount());
tab.setLayoutParams(mTabParams);
mTabLayout.addView(tab);
return this;
}