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();
    }
  }
}

总结:该代码耦合度较高,有些代码可能不太合理;欢迎大牛们给出合理建议;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android使用ViewPager实现图片滑动预览效果

    本文为大家分享了Android ViewPager实现图片滑动预览效果展示的具体代码,供大家参考,具体内容如下 效果图: 滑动前: 滑动后: 代码非常简单,实现起来很容易 xml代码: <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/ap

  • Android 修改viewpage滑动速度的实现代码

    1.自定义Scroller public class ViewPageFixedSpeedScroller extends Scroller { private int mDuration = 300; public ViewPageFixedSpeedScroller(Context context) { super(context); // TODO Auto-generated constructor stub } public ViewPageFixedSpeedScroller(Con

  • Android ViewPager实现左右滑动的实例

    Android ViewPager实现左右滑动的实例 多个标题以及标题下的每个View视图 <com.shizhefei.view.indicator.ScrollIndicatorView android:id="@+id/moretab_indicator" android:layout_width="match_parent" android:layout_height="45dp" /> <View android:la

  • Android 滑动监听的实例详解

    Android 滑动监听的实例详解 摘要: ScollBy,ScollTo是对内容的移动,view.ScollyBy是对view的内容的移动 view,ScollTo是对内容的移动(移动到指定位置),view.ScollyBy是对view的内容的移动(移动距离) 在次activity中,当手指点击TextView ,此时是ViewGroup 响应还是TextView响应呢? 代码实践: 在activity中重写onTouchEvent(): public boolean onTouchEvent

  • Android模仿美团顶部的滑动菜单实例代码

    前言 本文主要给大家介绍了关于Android模仿美团顶部滑动菜单的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 先来看下效果图: 实现方法 这是通过 ViewPager 和 GridView 相结合做出来的效果,每一个 ViewPager 页面都是一个 GridView,底部的每个滑动指示圆点都是从布局文件中 inflate 出来的 首先需要一个代表每个活动主题的 JavaBean /** * Created by CZY on 2017/6/23. */ publ

  • Android自定义滑动解锁控件使用详解

    最近的项目里用到了,在网上找不到合适的,于是自己写了个简单的,带回弹效果: 可以自定义的属性有: <!-- 滑动解锁控件 xml配置属性 --> <declare-styleable name="SlideToUnlockView"> <attr name="slideImageViewWidth" format="dimension"/><!-- 滑块宽度 --> <attr name=&q

  • Android view随触碰滑动效果

    主要思路是通过父布局的onTouch(),方法,获取滑动到的位置和点击下的位置,再去设置子view的位置.我的代码中考虑了在边缘情况.需要注意的是,使用RelativeLayout,以imageView为例.从测试结果来看,bottomMargin 和rightMargin 性能非常差,最好还是用leftMargin与topMargin定位. 下面是运行效果: 布局文件里面就是一个Relativelayout中有一个ImageView.如下 <?xml version="1.0"

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

    Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏的设置方法类似于TabLayout的关联,View需要创建关联方法,用来关联VIewPager; 3. 通过关联方法获取ViewPager实例后,根据ViewPager页面数创建底部导航栏的图标按钮; 代码实现: 1. 新建第一个自定义View, 图标 + 文字 的底部按钮; /** * 自定义控件

  • android实现简单底部导航栏

    本文实例为大家分享了android实现底部导航栏的具体代码,供大家参考,具体内容如下 常见的底部导航栏 动态效果 实现步骤 1.底部导航栏样式 我们应该在项目的res文件夹下新建一个menu文件夹,用来装menu布局文件 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"&g

  • Android仿微信键盘切换效果

    Android 仿微信的键盘切换(录音,表情,文字,其他),IM通讯,类似朋友圈只要涉及到文字等相关的app都会要涉及到键盘的处理,今天就给大家分享一下Android 仿微信的键盘切换. 效果图如下: Android 仿微信的键盘切换,实现了录音.表情.其他和软键盘显示之间的切换,其中解决了很多博客介绍的键盘切换时,软键盘显示切换到表情(其他)时,出现屏幕晃动的情况,以及点击和滑动键盘显示区域外时,软键盘隐藏的功能等,废话不多说直接上代码,以供大家参考: xml: <?xml version=&qu

  • 超简单的几行代码搞定Android底部导航栏功能

    超简单,几行代码搞定Android底部导航栏-–应项目需求以及小伙伴的留言,新加了两个方法: 设置底部导航栏背景图片 添加底部导航栏选项卡切换监听事件 底部导航栏的实现也不难,就是下边是几个Tab切换,上边一般是一个FrameLayout,然后FrameLayout中切换fragment. 网上有不少关于Android底部导航栏的文章,不过好像都只是关于下边Tab切的,没有实现Tab与fragment的联动,用的时候还要自己手写这部分代码,对我这个比较懒(据说,懒是程序员的一种美德_#)得程序员

  • 微信小程序实战之仿android fragment可滑动底部导航栏(4)

    底部3-5个选项的底部导航栏,目前在移动端上是主流布局之一,因此腾讯官方特地做了,可以通过设置,就可以做出了一个底部的导航栏. 相关教程:微信小程序教程系列之设置标题栏和导航栏(7) 但是通过设置的这个底部的导航栏,功能上比较固定,它必须要设置与它对应的一个页面,而且并不能滑动. 在业务上,有时候会比较限制,并不能完全满足所需. 又例如早前有人拿着UI稿问我,这种广告轮播图的样式,在小程序能不能实现呢? 我当时没有想了下,还不是很确定,因为小程序的轮播图的那几个小点点实在比较普通,样式单一. 因

  • Android实现带有指示器的自定义底部导航栏

    今天这篇文章,主要是给大家实现一个自定义的带有指示器的底部导航栏. 先看一下实现的效果吧. 这个自定义控件的使用要注意以下几个方面: 1.没有布局文件及资源文件,只需要一个java文件就可调用 2.可以非常灵活的使用,一句代码就可以添加到项目中 3.暂时只支持4.0以上版本,颜色值使用的是系统自带色值,如需在低版本使用,请自己替换颜色值 4.支持智能适配,可以根据底部按钮的数量,自动的调整布局 5.主内容区域,必须使用Fragment实现,通过附加到Viewpager上实现界面的左右滑动 下面给

  • Android程序开发之Fragment实现底部导航栏实例代码

    流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 说明 IDE:AS,Android studio; 模拟器:genymotion; 实现的效果,见下图. 具体实现 为了讲明白这个实现过程,我们贴出来的代码多一写,这样更方便理解 [最后还会放出完整的代码实现] .看上图的界面做的比较粗糙,但实现过程的骨架都具有了,想要更完美的设计,之后自行完善吧 ^0^. 布局 通过观察上述效果图,发现任意一个选项页面都有三部分组成: 顶部去除ActionBar后的标题栏: 中间一个Fragment

  • android中Fragment+RadioButton实现底部导航栏

    在App中经常看到这样的tab底部导航栏 那么这种效果是如何实现,实现的方式有很多种,最常见的就是使用Fragment+RadioButton去实现.下面我们来写一个例子 首先我们先在activity_mian.xml定义布局,整个布局的外面是线性布局,上面是帧布局切换不同的Fragment,底下是RadioGroup嵌套的是RadioButton.代码如下所示: <?xml version="1.0" encoding="utf-8"?> <Li

  • Android用Scroller实现一个可向上滑动的底部导航栏

    静静等了5分钟竟不知道如何写我这第一篇文章.每次都想好好的学习学习,有时间多敲敲代码,写几篇自己的文章.今天终于开始实行了,还是有点小激动的.哈哈! 好了废话就不多收了.我今天想实现的一个功能就是一个可以上滑底部菜单栏.为什么我会想搞这么个东西呢, 还是源于一年前,我们app 有这么个需求,当时百度也好谷歌也好,都没有找到想要的效果,其实很简单的一个效果.但是当时我也是真的太菜了,所有有关自定义的控件真的是不会,看别人的代码还好,真要是自己写,一点头绪都没有.因为我试着写了,真的不行啊.当时觉得

  • Android底部导航栏的三种风格实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Google 给我们提供的一个专门用于底部导航的 View,你只需要在新建 Activity 的时候选择 "Bottom Navigation Activity",IDE 就会自动使用 BottomNavigationView 帮你生成好相应的代码了. 1. 在 xml 中使用 <andr

随机推荐