还有该功能是android第一个版本就已经提供的方法, 所有可以跨任意android版本使用;
这两个属性联合起来能干什么呢?用来做一些类似于心形放大等点击特效非常合适, 不用去更改布局, 只需加入这两个属相,并引入动画效果就完成了;
注意事项:
父视图设置android:clipChildren、android:clipPadding和不设置的效果如下:
最近在写一个需求,要求点击底部栏的按钮,要能让图标放大,且要超出底部栏,实现一种越界的效果,效果如下:
在 android.surport.v4/v7
项目中TabLayout
在app_module
对应的build.gradle
中的引用如下:
//TabLayout
compile 'com.android.support:design:27.1.1'
compile 'com.android.support:support-v4:27.1.1'
在androidx
项目中TabLayout
在app_module
对应的build.gradle
中的引用如下:
//TabLayout
implementation 'com.google.android.material:material:1.2.0'
注意事项:根布局需要设置android:clipChildren和TabLayout布局android:clipChildren属性都需要设置为false,否则不生效;
根布局activity_main.xml
TabLayout的Tab布局tab_item.xml
TabLayout动态添加Tab:
private void initViews() { mTabLayout = (TabLayout) findViewById(R.id.tab_layout); initTabLayout(); } private void initTabLayout(){ //图文组合 if(tabImageResource != null && tabImageResource.length > 0){ createImageAndChina(); }else if(tabTitles != null && tabTitles.length > 0){ createChinaItem(); } } /** * 创建图文混排Item */ private void createImageAndChina() { isImageAndChina = true; for (int i = 0; i < tabImageResource.length; i++) { TabLayout.Tab tab = mTabLayout.newTab(); if(tab != null){ tab.setCustomView(getTabView(i)); mTabLayout.addTab(tab); } } } /** * 图文混排Item * @param position * @return */ private View getTabView(int position) { View tabView = LayoutInflater.from(this).inflate(R.layout.tab_item, null); setContentItem(tabView, position); return tabView; }
选中Tab动态修改Tab的Margin使Tab超出TabLayout:
/** * 修改Tab视图Margin * @param customView * @param dimenId */ public void changeTabMargin(View customView,int dimenId){ ViewGroup targetViewToApplyMargin = (ViewGroup) customView.getParent(); ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) targetViewToApplyMargin.getLayoutParams(); layoutParams.topMargin = (int)getResources().getDimension(dimenId); targetViewToApplyMargin.setLayoutParams(layoutParams); }
选中Tab时实现Tab视图的放大缩小效果:
/** * 使用属性动画改变Tab中View的状态 * @param customView */ private void changeTabSelect(View customView){ View iV = customView.findViewById(R.id.iv_app_icon); ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iV, "",1.0f,1.4f,1.0f) .setDuration(200); objectAnimator.start(); objectAnimator.addUpdateListener(animation -> { float cVal = (Float) animation.getAnimatedValue(); customView.setScaleY(cVal); customView.setScaleX(cVal); }); }
若有clipChilren属性不生效,可以动态设置Tab子视图的ViewGroup的clipChildren属性为false(暂未使用)
/** * 设置TabLayout下Tab父视图不裁剪子视图 * @param customView */ public void changeClipFalse(View customView){ if (customView != null) { ViewGroup targetViewToApplyMargin = (ViewGroup) customView.getParent(); //循环设置Tab下父视图不裁剪超出部分子视图 while (targetViewToApplyMargin != mTabLayout){ targetViewToApplyMargin.setClipChildren(false); targetViewToApplyMargin.setClipToPadding(false); targetViewToApplyMargin = (ViewGroup)targetViewToApplyMargin.getParent(); } } }
github源码地址:mayundoyouknow / Tablayout · CODE CHINA
参考:
仿淘宝/漫画岛底部栏实现--解决TabLayout clipchildren属性无效问题--底部导航栏图标溢出实现 - 简书
ConstraintLayout 实现LinearLayout weight效果_wqbs369的专栏-CSDN博客