android底部导航栏传参数,Android Material Design (底部导航栏)

我们活着不能与草木同腐,不能醉生梦死,枉度人生,要有所作为。——方志敏

概述

Design设计语言,在我们App端已经随处可见。具有界面更干净、更简约,支持各种新动画效果,具有内置的实时UI阴影,以及可在不同屏幕之间切换的hero元素等特点。

我们先来看看底部导航栏最终效果,有图才有真相嘛:

0818b9ca8b590ca3270a3433284dd417.png

底部导航栏

首先我们来分析一下,底部导航栏固定在整个界面的底部,导航栏的内部是水平排版,对自然就想到了(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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值