android 关门效果,(转)安卓-BottomNavigationView关闭shiftingMode效果

原文:https://blog.csdn.net/xiaoyangsavvy/article/details/70213537

官方的BottomNavigationView默认有个放大的ShiftingMode效果,但是尚未支持代码层级的切换。在3个menu item及以下时默认关闭,而到了4个及以上时就懵逼了,因为我们是要做ViewPager的侧滑啊!

3934553acbab

image

滑动时,ViewPager是切换过去了,下面这item也切换过去了,但是你说说这效果是不是坑爹!!?

没办法了,查了一圈资料,发现官方这个控件还不支持代码层级的切换选项(如果你发现了,请告诉我)。迫不得已,只能看源码,开启上帝(反射)模式了!

3934553acbab

image

package com.fedming.bottomnavigationdemo;

import android.support.design.internal.BottomNavigationItemView;

import android.support.design.internal.BottomNavigationMenuView;

import android.support.design.widget.BottomNavigationView;

import java.lang.reflect.Field;

// 利用反射,改变 item 中 mShiftingMode 的值

public class BottomNavigationViewHelper {

public static void disableShiftMode(BottomNavigationView navigationView) {

BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);

try {

Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");

shiftingMode.setAccessible(true);

shiftingMode.setBoolean(menuView, false);

shiftingMode.setAccessible(false);

for (int i = 0; i < menuView.getChildCount(); i++) {

BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);

itemView.setShiftingMode(false);

itemView.setChecked(itemView.getItemData().isChecked());

}

} catch (NoSuchFieldException | IllegalAccessException e) {

e.printStackTrace();

}

}

}

我们通过反射拿到了BottomNavigationMenuView,至于为什么是BottomNavigationView 的第一个子View这就要看源码了,AS中直接可以点进去看。然后我们知道了这个效果是由mShiftingMode来决定的,那么上面的代码就好理解了。

在实例化BottomNavigationView后调用一次这行代码即可:

BottomNavigationViewHelper.disableShiftMode(bottomNavigationView)

如果不需要配置侧滑切换的话,直接默认效果就好,不要去反射修改了。禁止滑动时,为ViewPager添加setOnTouchListener接口,在onTouch下直接消费掉点击事件。添加下面这段代码:

//禁止ViewPager滑动

viewPager.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

return true;

}

});

最后来看下效果:

3934553acbab

image

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值