Android仿微信滑动切换最终实现效果:
大体思路:
1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标;
2. 底部导航栏的设置方法类似于TabLayout的关联,View需要创建关联方法,用来关联VIewPager;
3. 通过关联方法获取ViewPager实例后,根据ViewPager页面数创建底部导航栏的图标按钮;
代码实现:
1. 新建第一个自定义View, 图标 + 文字 的底部按钮;
/**
* 自定义控件,该控件为底部导航栏中的图标
* Created by MrZheng on 2017/8/2.
*/
public class TabView extends LinearLayout {
BotBean mBean;
private TextView title;
private ImageView iconImage;
/**
* 引用此控件,只能通过new 方法;接收一个TabView
* @param context
*/
public TabView(Context context, BotBean bean) {
super(context);
this.mBean = bean;
initView();
}
/**
* 初始化布局
*/
public void initView() {
setOrientation(VERTICAL);
setGravity(Gravity.CENTER);
//添加小图标
iconImage = new ImageView(getContext());
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT
, ViewGroup.LayoutParams.WRAP_CONTENT);
iconImage.setLayoutParams(layoutParams);
iconImage.setImageResource(mBean.getUncheckedId());
Drawable drawable = getContext().getResources().getDrawable(mBean.getUncheckedId());
Drawable wrapDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTintList(wrapDrawable, ColorStateList.valueOf(Color.BLACK));
iconImage.setImageDrawable(wrapDrawable);
addView(iconImage);
//标题
title = new TextView(getContext());
LinearLayout.LayoutParams titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
title.setLayoutParams(titleParams);
title.setText(mBean.getContent());
addView(title);
}
//判断选择状态,改变图标
//供外部调用
public void setSelected(boolean isSelected) {
if (mBean == null) {
return;
}
if (isSelected) {
if (iconImage != null) {
//使用颜色过滤器,改变选中时的颜色
Drawable drawable = getContext().getResources().getDrawable(mBean.getUncheckedId());
Drawable wrapDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTintList(wrapDrawable, ColorStateList.valueOf(Color.GREEN));
iconImage.setImageDrawable(wrapDrawable);
title.setTextColor(Color.GREEN);
}
} else {
if (title != null) {
// iconImage.setImageResource(mBean.getUncheckedId());
Drawable drawable = getContext().getResources().getDrawable(mBean.getUncheckedId());
Drawable wrapDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTintList(wrapDrawable, ColorStateList.valueOf(Color.BLACK));
iconImage.setImageDrawable(wrapDrawable);
title.setTextColor(Color.GRAY);
}
}
}
}
2. 创建第二个自定义View,该View为底部导航栏载体,根据 关联的ViewPager页面 个数创建 底部导航栏图标;
/**
* 该控件为底部导航栏图标载体
* Created by MrZheng on 2017/8/2.
*/
public class bottomView extends LinearLayout {
private ViewPager vp;
BottomPageChangeListener mBottomPageChangeListener;
public bottomView(Context context) {
super(context);
}
public bottomView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public bottomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 同TabLayout用法相似,需要与ViewPager进行绑定
*/
public void setViewPager(ViewPager viewPager, ArrayList<BotBean> botBeen,BottomPageChangeListener bottomPageChangeListener) {
if (viewPager == null) {
return;
}
vp = viewPager;
mBottomPageChangeListener = bottomPageChangeListener;
initTabView(botBeen);
//设置ViewPager的点击事件
vp.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override
public void onPageSelected(int position) {
for (int i = 0; i < getChildCount(); i++) {
getChildAt(i).setSelected((position == i ? true : false));
}
if (mBottomPageChangeListener != null) {
mBottomPageChangeListener.onPageChangeListener(position);
}
}
});
}
/**
* 初始化底部导航栏,ViewPager有多少页,就创建多少个图标
*/
public void initTabView(ArrayList<BotBean> botBeen) {
setGravity(HORIZONTAL);
for (int i = 0; i < botBeen.size(); i++) {
BotBean bean = botBeen.get(i);
TabView tabView = new TabView(getContext(), bean);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT
, ViewGroup.LayoutParams.WRAP_CONTENT);
params.weight = 1;
params.gravity = Gravity.CENTER;
tabView.setLayoutParams(params);
//为每个view设置点击事件,点击跳转过去
final int finalI = i;
tabView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
vp.setCurrentItem(finalI);
}
});
//设置一开始选中状态
if (i == 0) {
tabView.setSelected(true);
//由于初始化时,onPageSelected()选中方法并没有的到执行,所以主动去调用回调方法
if (mBottomPageChangeListener != null) {
mBottomPageChangeListener.onPageChangeListener(i);
}
}
addView(tabView);
}
}
/**
* 提供接口回调方法,每次滑动都通知外界
*/
public interface BottomPageChangeListener{
void onPageChangeListener(int position);
}
}
3. 添加 图标自定义类, 该类封装着底部导航栏中每一个选项的的图标和文字,将该类型对象添加到集合中,用于给底部导航栏设置图标;
/**
* 底部导航栏的封装类,该类对象用于在底部导航栏添加对应图标和文字
* Created by MrZheng on 2017/8/2.
*/
public class BotBean {
String content;//图标名字
int uncheckedId;//未选中时的图标
public BotBean(String content, int uncheckedId) {
this.content = content;
this.uncheckedId = uncheckedId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getUncheckedId() {
return uncheckedId;
}
public void setUncheckedId(int uncheckedId) {
this.uncheckedId = uncheckedId;
}
}
自定义View实现完成,在Fragment或Activity中使用该View:
1. 在布局文件中添加:
<zhengyanze.com.bottomdemo.widget.bottomView android:id="@+id/bottom" android:layout_width="match_parent" android:layout_height="60dp"> </zhengyanze.com.bottomdemo.widget.bottomView>
2. 在活动或碎片中添加:
public class MainActivity extends AppCompatActivity {
ArrayList<Fragment> mFragments;
ArrayList<BotBean> mItemIcon;//存放底部图标和文字
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragments = new ArrayList<>();
mItemIcon = new ArrayList<>();
mFragments.add(new TextFragment());
mFragments.add(new TextFragment());
mFragments.add(new TextFragment());
mFragments.add(new TextFragment());
mItemIcon.add(new BotBean("首页", R.mipmap.ic_home2));
mItemIcon.add(new BotBean("通讯录", R.mipmap.ic_study2));
mItemIcon.add(new BotBean("发现", R.mipmap.ic_found2));
mItemIcon.add(new BotBean("我的", R.mipmap.ic_me2));
ViewPager vp = (ViewPager) findViewById(R.id.vp);
vp.setAdapter(new FAdapter(getSupportFragmentManager()));
tv = (TextView) findViewById(R.id.tv);
bottomView bottom = (bottomView) findViewById(R.id.bottom);
bottom.setViewPager(vp, mItemIcon, new bottomView.BottomPageChangeListener() {
@Override
public void onPageChangeListener(int position) {
//滑动后的回调
tv.setText(mItemIcon.get(position).getContent());
}
});
}
/**
* 适配器
*/
class FAdapter extends FragmentPagerAdapter {
public FAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
}
}
总结:该代码耦合度较高,有些代码可能不太合理;欢迎大牛们给出合理建议;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android底部导航栏
# Android微信滑动切换
# Android滑动切换
# Android程序开发之Fragment实现底部导航栏实例代码
# Android实现底部导航栏功能(选项卡)
# 超简单的几行代码搞定Android底部导航栏功能
# Android 弹出Dialog时隐藏状态栏和底部导航栏的方法
# android 全屏去掉底部虚拟导航栏的方法
# 解决android 显示内容被底部导航栏遮挡的问题
# Android底部导航栏的三种风格实现
# Android中TabLayout+ViewPager 简单实现app底部Tab导航栏
# Android实现底部导航栏的主界面
# android实现简单底部导航栏
# 自定义
# 回调
# 栏中
# 第一个
# 不太
# 较高
# 有多少
# 第二个
# 跳转
# 首页
# 类似于
# 绑定
# 将该
# 装着
# 大家多多
# 多少个
# 大牛
# 小图标
# setImageResource
# setLayoutParams
相关文章:
如何安全更换建站之星模板并保留数据?
如何选择网络建站服务器?高效建站必看指南
如何用景安虚拟主机手机版绑定域名建站?
浅谈Javascript中的Label语句
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
北京网站制作网页,网站升级改版需要多久?
Python lxml的etree和ElementTree有什么区别
linux top下的 minerd 木马清除方法
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何选择服务器才能高效搭建专属网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
实惠建站价格推荐:2025年高性价比自助建站套餐解析
如何通过PHP快速构建高效问答网站功能?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
临沂网站制作公司有哪些,临沂第四中学官网?
网站制作企业,网站的banner和导航栏是指什么?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
建站之星官网登录失败?如何快速解决?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何通过虚拟机搭建网站?详细步骤解析
平台云上自主建站:模板化设计与智能工具打造高效网站
移民网站制作流程,怎么看加拿大移民官网?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
建站主机如何安装配置?新手必看操作指南
如何在橙子建站中快速调整背景颜色?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
郑州企业网站制作公司,郑州招聘网站有哪些?
c# 服务器GC和工作站GC的区别和设置
北京企业网站设计制作公司,北京铁路集团官方网站?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
,购物网站怎么盈利呢?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
网站专业制作公司有哪些,做一个公司网站要多少钱?
大型企业网站制作流程,做网站需要注册公司吗?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
如何挑选高效建站主机与优质域名?
如何在Tomcat中配置并部署网站项目?
如何在Windows环境下新建FTP站点并设置权限?
如何快速搭建响应式可视化网站?
,有什么在线背英语单词效率比较高的网站?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。