实现三星音乐App风格的自定义TabLayout技术咨询
问题:实现三星音乐风格的Scrollable TabLayout
现有TabLayout的问题
默认设置为scrollable模式的TabLayout,选中标签的指示器位置不固定,选中第一个标签时指示器会贴在屏幕最左侧,不符合需求。
目标效果(参考三星音乐App的TabLayout)
- 选中标签始终位于屏幕中央
- 首尾标签不贴靠屏幕边缘
- 切换时带有缩放动画:选中的Tab移开时缩小,未选中的Tab被选中时放大
已尝试但无效的方案
- 给首尾Tab添加内边距和外边距,没有效果;已通过透明颜色移除指示器,能在选中/取消选中的回调中修改文本大小和字体,但无法实现滑动过程中的实时缩放效果
- 给Tab项设置OnTouchListener,试图根据移动方向修改文本缩放比例,但触摸事件触发几次后就停止,且没法给所有经过屏幕中央的Tab添加缩放效果
实验代码(存在缺陷,非推荐方案)
contentBinding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { if (tab != null) { Log.d("TAB_LAYOUT", "onTabSelected: "+tab.text) //tab.view. ... // Set huge text size and font } } override fun onTabUnselected(tab: TabLayout.Tab?) { if (tab != null) { Log.d("TAB_LAYOUT", "onTabUnselected: "+tab.text) //tab.view. ... // Set normal unselected text size and font } } override fun onTabReselected(tab: TabLayout.Tab?) { if (tab != null) { Log.d("TAB_LAYOUT", "onTabReselected: "+tab.text) //tab.view. ... // Set huge text size and font } } }) for (i in 0..4){ val mytab = contentBinding.tabLayout.getTabAt(i) mytab?.view?.setOnTouchListener(object : View.OnTouchListener { override fun onTouch(v: View?, event: MotionEvent?): Boolean { Log.d("TAB_ITEM_ALL"+i, "onTouch: "+event.toString()) if (event != null) { if(event.action == ACTION_MOVE) // if(event.x > prevX){ // moving away logic // } // else{ // moving towards // } return false } return false } }) }
咨询需求
想请教实现该风格TabLayout的可行方法,是否应该使用动画或平移等手段来达成需求?
内容的提问来源于stack exchange,提问作者Vikram Baliga
相关产品推荐
相关产品推荐

