BottomNavigationView文档格式.docx
- 文档编号:21611290
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:14
- 大小:96.65KB
BottomNavigationView文档格式.docx
《BottomNavigationView文档格式.docx》由会员分享,可在线阅读,更多相关《BottomNavigationView文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
设置菜单图标着色
itemTextColor:
设置菜单文本颜色
menu:
设置菜单
itemBackground:
设置导航栏的背景色
@menu/menu_buttom_navi
?
xmlversion="
1.0"
encoding="
utf-8"
>
menuxmlns:
android="
xmlns:
app="
<
item
@+id/menu_recent"
icon="
@drawable/ic_history_black_24dp"
title="
@string/menu_recents"
@+id/menu_favorites"
@drawable/ic_favorite_black_24dp"
@string/menu_favorites"
@+id/menu_nearby"
@drawable/ic_place_black_24dp"
@string/menu_nearby"
@+id/menu_navi"
@drawable/ic_navigation_black_24dp"
@string/menu_navigation"
/menu>
与定义普通menu布局一样。
接下来是java代码
bottomNaviView=(BottomNavigationView)findViewById(R.id.bottom_navi_view);
bottomNaviView.setOnNavigationItemSelectedListener(newBottomNavigationView.OnNavigationItemSelectedListener(){
@Override
publicbooleanonNavigationItemSelected(@NonNullMenuItemitem){
switch(item.getItemId()){
caseR.id.menu_recent:
break;
caseR.id.menu_favorites:
caseR.id.menu_nearby:
caseR.id.menu_navi:
}
returntrue;
});
对BottomNavigationView设置选择监听器就可以做一些item切换事件了。
注意事项
底部导航栏默认高度是56dp
菜单只能是3-5个
源码分析
BottomNavigationView有几个先关的重要类
BottomNavigationMenu
BottomNavigationMenuView
BottomNavigationPresenter
它的设计有点类似于开发中的MVP模式。
先来看BottomNavigationView的构造函数
publicBottomNavigationView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
ThemeUtils.checkAppCompatTheme(context);
//检测当前主题
//Createthemenu
mMenu=newBottomNavigationMenu(context);
mMenuView=newBottomNavigationMenuView(context);
FrameLayout.LayoutParamsparams=newFrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
params.gravity=Gravity.CENTER;
mMenuView.setLayoutParams(params);
mPresenter.setBottomNavigationMenuView(mMenuView);
mMenuView.setPresenter(mPresenter);
mMenu.addMenuPresenter(mPresenter);
//Customattributes
//...省略若干代码
if(a.hasValue(R.styleable.BottomNavigationView_menu)){
inflateMenu(a.getResourceId(R.styleable.BottomNavigationView_menu,0));
//加载menu
a.recycle();
addView(mMenuView,params);
//
mMenu.setCallback(newMenuBuilder.Callback(){//设置监听器
publicbooleanonMenuItemSelected(MenuBuildermenu,MenuItemitem){
returnmListener!
=null&
&
mListener.onNavigationItemSelected(item);
publicvoidonMenuModeChange(MenuBuildermenu){}
}
ThemeUtils.checkAppCompatTheme(context)是用来检测当前主题的。
代码很简单,就是判断是否有colorPrimary属性。
classThemeUtils{
privatestaticfinalint[]APPCOMPAT_CHECK_ATTRS={
android.support.v7.appcompat.R.attr.colorPrimary
};
staticvoidcheckAppCompatTheme(Contextcontext){
TypedArraya=context.obtainStyledAttributes(APPCOMPAT_CHECK_ATTRS);
finalbooleanfailed=!
a.hasValue(0);
if(a!
=null){
if(failed){
thrownewIllegalArgumentException("
YouneedtouseaTheme.AppCompattheme"
+"
(ordescendant)withthedesignlibrary."
);
构造函数中接下来调用了inflateMenu()
publicvoidinflateMenu(intresId){
mPresenter.setUpdateSuspended(true);
getMenuInflater().inflate(resId,mMenu);
mPresenter.initForMenu(getContext(),mMenu);
mPresenter.setUpdateSuspended(false);
mPresenter.updateMenuView(true);
可以看出都是调用的BottomNavigationPresenter的函数。
setUpdateSuspended(true)–暂停修改menu
setUpdateSuspended(false)—可以修改menu
在initForMenu()一前一后,设置一个标志来表示当前正在操作menu。
重点来看BottomNavigationPresenter.initForMenu()
@Override
publicvoidinitForMenu(Contextcontext,MenuBuildermenu){
mMenuView.initialize(mMenu);
mMenu=menu;
函数内部又是调用的BottomNavigationMenuView.initialize()
publicvoidinitialize(MenuBuildermenu){
if(mMenu==null)return;
if(mMenu.size()>
mActiveButton){
mMenu.getItem(mActiveButton).setChecked(true);
代码中就是一些简单的初始化操作。
接下来看BottomNavigationPresenter.updateMenuView(true)
publicvoidupdateMenuView(booleancleared){
if(mUpdateSuspended)return;
if(cleared){
mMenuView.buildMenuView();
}else{
mMenuView.updateMenuView();
第一次创建Menu时,调用的是buildMenuView方法。
BottomNavigationMenuView.buildMenuView()
publicvoidbuildMenuView(){
if(mButtons!
for(BottomNavigationItemViewitem:
mButtons){
sItemPool.release(item);
removeAllViews();
mButtons=newBottomNavigationItemView[mMenu.size()];
//当menuitem大于3个的时候,会出现缩放动画
mShiftingMode=mMenu.size()>
3;
for(inti=0;
i<
mMenu.size();
i++){
mMenu.getItem(i).setCheckable(true);
BottomNavigationItemViewchild=getNewItem();
mButtons[i]=child;
child.setIconTintList(mItemIconTint);
child.setTextColor(mItemTextColor);
child.setItemBackground(mItemBackgroundRes);
child.setShiftingMode(mShiftingMode);
//单个item--BottomNavigationItenView的初始化操作
child.initialize((MenuItemImpl)mMenu.getItem(i),0);
child.setItemPosition(i);
//设置点击事件
child.setOnClickListener(mOnClickListener);
//添加子视图
addView(child);
在BottomNavigationMenuView类中定义了一个Pool对象,用来缓存BottomNavigationItemView对象。
privatestaticfinalPools.Pool<
BottomNavigationItemView>
sItemPool=newPools.SynchronizedPool<
(5);
通过for循环创建了nMenu.size()个BottomNavigationItemView对象。
BottomNavigationItemViewchild=getNewItem();
mButtons[i]=child;
getNewItem()
privateBottomNavigationItemViewgetNewItem(){
BottomNavigationItemViewitem=sItemPool.acquire();
if(item==null){
item=newBottomNavigationItemView(getContext());
returnitem;
getNewItem()类似于Message.obtain()的机制。
接着看buildMenuView(),方法最后面,调用了BottomNavigationItemView.initialize(),然后调用addView(child)来添加子item视图。
publicvoidinitialize(MenuItemImplitemData,intmenuType){
mItemData=itemData;
setCheckable(itemData.isCheckable());
setChecked(itemData.isChecked());
setEnabled(itemData.isEnabled());
setIcon(itemData.getIcon());
setTitle(itemData.getTitle());
setId(itemData.getItemId());
看一下BottomNavigationItemView的构造函数
publicBottomNavigationItemView(@NonNullContextcontext){
this(context,null);
publicBottomNavigationItemView(@NonNullContextcontext,AttributeSetattrs){
this(context,attrs,0);
publicBottomNavigationItemView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
finalResourcesres=getResources();
intinactiveLabelSize=
res.getDimensionPixelSize(R.dimen.design_bottom_navigation_text_size);
intactiveLabelSize=res.getDimensionPixelSize(
R.dimen.design_bottom_navigation_active_text_size);
mDefaultMargin=res.getDimensionPixelSize(R.dimen.design_bottom_navigation_margin);
mShiftAmount=inactiveLabelSize-activeLabelSize;
mScaleUpFactor=1f*activeLabelSize/inactiveLabelSize;
mScaleDownFactor=1f*inactiveLabelSize/activeLabelSize;
//注意下面的代码
LayoutInflater.from(context).inflate(R.layout.design_bottom_navigation_item,this,true);
setBackgroundResource(R.drawable.design_bottom_navigation_item_background);
mIcon=(ImageView)findViewById(R.id.icon);
mSmallLabel=(TextView)findViewById(R.id.smallLabel);
mLargeLabel=(TextView)findViewById(R.id.largeLabel);
代码中映射了一个布局文件
design_bottom_navigation_item.xml
mergexmlns:
ImageView
@+id/icon"
24dp"
layout_gravity="
center_horizontal"
layout_marginTop="
@dimen/design_bottom_navigation_margin"
layout_marginBottom="
duplicateParentState="
android.support.design.internal.BaselineLayout
bottom|center_horizontal"
TextView
@+id/smallLabel"
textSize="
@dimen/design_bottom_navigation_text_size"
@+id/largeLabel"
visibility="
sible"
@dimen/design_bottom_navigation_active_text_size"
/android.support.design.internal.BaselineLayout>
/merge>
该布局文件由系统提供,包括一个ImageView和两个TextView。
当菜单项大于3个,切换item时,被选中的item会将largeLabel显示,将smallLabel隐藏。
然后改变ImageView和TextView的margin值达到动画效果。
在BottomNavigationMenuView的构造函数中对mAnimationHelper进行了实例化
privatefinalBottomNavigationAnimationHelperBasemAnimationHelper;
if(Build.VERSION.SDK_INT>
=Build.VERSION_CODES.ICE_CREAM_SANDWICH){
mAnimationHelper=newBottomNavigationAnimationHelperIcs();
mAnimationHelper=newBottomNavigationAnimationHelperBase();
当版本小于14(Android4.0)时,是没有动画效果的。
classBottomNavigationAnimationHelperBase{
voidbeginDelayedTransition(ViewGroupview){
//Donothing.
Andr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BottomNavigationView