全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android实现简单底部导航栏 Android仿微信滑动切换效果

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小时内与您取得联系。