Android仿微信底部菜单栏效果

前言

在市面上,大多数的APP都需要通过底部菜单栏来将程序的功能进行分类整理,通常都是分为3-5个大模块,从而正确有效地引导用户去使用我们的APP。实现底部菜单栏的方法也有很多种。

1.仿微信底部菜单栏(ViewPager+ImagerView+TextView)

......(其他方式后续会补充)

效果预览

首先来个开胃菜,看看实现效果:

先贴出项目所需的资源文件,这些可随个人自由更改颜色和文字
colors.xml

<color name="bg_line_light_gray">#9b9b9b</color>
<color name="bg_main_green">#31c016</color>

strings.xml

<string name="bottom_menu_me">我</string>
<string name="bottom_menu_discovery">发现</string>
<string name="bottom_menu_addressbook">通讯录</string>
<string name="bottom_menu_wechat">微信</string>

由于底部四个菜单项的布局都是类似的,可以把相同的内容提取出来,定义为style进行使用。这样不仅减少了代码量,也便于日后的维护。
styles.xml

<style name="ButtomMenuImgv">
  <item name="android:layout_width">wrap_content</item>
  <item name="android:layout_height">wrap_content</item>
  <item name="android:layout_marginBottom">5dp</item>
  <item name="android:layout_marginTop">5dp</item>
</style> 

<style name="ButtomMenuTv">
  <item name="android:layout_width">wrap_content</item>
  <item name="android:layout_height">wrap_content</item>
  <item name="android:layout_marginBottom">5dp</item>
  <item name="android:textSize">12sp</item>
  <item name="android:textColor">@drawable/ic_menu_textcolors_selector</item>
</style> 

<style name="ButtomMenuItemLayout">
  <item name="android:layout_width">0dp</item>
  <item name="android:layout_height">match_parent</item>
  <item name="android:layout_weight">1</item>
  <item name="android:gravity">center</item>
  <item name="android:orientation">vertical</item>
</style>

在res->drawable-xxhdpi文件夹中添加了8张png资源图片,分别对应菜单栏图片的选中与未选中状态。接着在res->drawable文件夹(如没有该文件夹则自己新建)中添加对应的四个选择器。

ic_menu_chat_selector.xml
ic_menu_addressbook_selector.xml
ic_menu_discovery_selector.xml
ic_menu_me_selector.xml

这里只贴出其中一个xml代码文件的内容(ic_menu_chat_selector.xml),其他只需更改相对应图片资源即可。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

  <item android:drawable="@drawable/ic_menu_chat_light"
    android:state_selected="true"></item>
  <item android:drawable="@drawable/ic_menu_chat_normal"></item> 

</selector>

在res->layout中新建四个布局文件

fragment_chat.xml
fragment_addressbook.xml
fragment_discovery.xml
fragment_me.xml

其中我只是简单地放了四个TextView用来区分,这里只贴出其中一个布局代码(fragment_chat.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent" > 

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="32sp"
    android:layout_centerInParent="true"
    android:text="@string/bottom_menu_wechat" /> 

</RelativeLayout>

在src文件夹下新建一个包用来存放fragment相关的文件,本项目中包名定义为com.example.bottommenu_vp_imgv_tv.fragment,接着在该包下新建四个类继承Fragment;(我们会发现Fragment有两个类:android.app.Fragment和android.support.v4.app.Fragment,这里我用android.support.v4.app.Fragment,那为何不使用android.app.Fragment呢?由于android.app.Fragment 兼容的最低版本是android:minSdkVersion="11",而android.support.v4.app.Fragment 可兼容的最低版本是android:minSdkVersion="4",但无论你选用哪个,在之后所有使用与Fragment相关的内容都要相对应。)

ChatFragment.Java
AddressBookFragment.Java
DiscoveryFragment.Java
MeFragment.Java

这里只贴出其中一个代码文件的内容(ChatFragment.Java),其他只需更改相对应布局文件即可。

import com.example.bottommenu_vp_imgv_tv.R;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; 

public class ChatFragment extends Fragment {
  @Override
  public View onCreateView(LayoutInflater inflater,
      @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = View.inflate(getActivity(), R.layout.fragment_chat, null);
    return view;
  }
}

新建一个FragmentPagerAdapter适配器
FragmentAdapter.java

import java.util.ArrayList;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter; 

public class FragmentAdapter extends FragmentPagerAdapter {
  private ArrayList<Fragment> mFragments;
  public FragmentAdapter(FragmentManager fm,ArrayList<Fragment> fragment) {
    super(fm);
    this.mFragments = fragment;
  }
  @Override
  public int getCount() {
    return mFragments.size();
  } 

  @Override
  public Fragment getItem(int arg0) {
    return mFragments.get(arg0);
  } 

}

所有准备工作已经完成,接下来就是具体实现了,基本思路是:底部图片文字资源采用选择器去实现,当选中某个菜单项时,重置所有菜单项为未选中状态,接着选中指定的菜单项并让ViewPager显示该菜单项对应的Fragment即可。
MainActivity.java

import java.util.ArrayList;
import com.example.bottommenu_vp_imgv_tv.fragment.AddressBookFragment;
import com.example.bottommenu_vp_imgv_tv.fragment.ChatFragment;
import com.example.bottommenu_vp_imgv_tv.fragment.DiscoveryFragment;
import com.example.bottommenu_vp_imgv_tv.fragment.FragmentAdapter;
import com.example.bottommenu_vp_imgv_tv.fragment.MeFragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView; 

public class MainActivity extends FragmentActivity implements OnClickListener,
    OnPageChangeListener {
  private ArrayList<TextView> tv_menus;
  private ArrayList<ImageView> imgv_menus;
  private ViewPager mViewPager; 

  private ArrayList<Fragment> mFragments;
  private FragmentAdapter mMainMenuAdapter; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    initView();
    initData();
    initEvent();
  } 

  // 初始化控件
  private void initView() {
    tv_menus = new ArrayList<TextView>();
    tv_menus.add((TextView) findViewById(R.id.tv_bottomMenu_chat));
    tv_menus
        .add((TextView) findViewById(R.id.tv_bottomMenu_addressbook));
    tv_menus.add((TextView) findViewById(R.id.tv_bottomMenu_discovery));
    tv_menus.add((TextView) findViewById(R.id.tv_bottomMenu_me));
    imgv_menus = new ArrayList<ImageView>();
    imgv_menus.add((ImageView) findViewById(R.id.imgv_bottomMenu_chat));
    imgv_menus
        .add((ImageView) findViewById(R.id.imgv_bottomMenu_addressbook));
    imgv_menus
        .add((ImageView) findViewById(R.id.imgv_bottomMenu_discovery));
    imgv_menus.add((ImageView) findViewById(R.id.imgv_bottomMenu_me));
    mViewPager = (ViewPager) findViewById(R.id.vp_main_menuContent);
  } 

  // 初始化数据
  private void initData() {
    mFragments = new ArrayList<Fragment>();
    mFragments.add(new ChatFragment());
    mFragments.add(new AddressBookFragment());
    mFragments.add(new DiscoveryFragment());
    mFragments.add(new MeFragment());
    mMainMenuAdapter = new FragmentAdapter(getSupportFragmentManager(),
        mFragments);
    setMenuSelector(0); // 默认选中第一个菜单项“微信”
  } 

  // 初始化事件
  private void initEvent() {
    mViewPager.setAdapter(mMainMenuAdapter);
    mViewPager.setOnPageChangeListener(this);
    findViewById(R.id.ll_bottomMenu_chat).setOnClickListener(this);
    findViewById(R.id.ll_bottomMenu_addressBook).setOnClickListener(this);
    findViewById(R.id.ll_bottomMenu_discovery).setOnClickListener(this);
    findViewById(R.id.ll_bottomMenu_me).setOnClickListener(this);
  } 

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case R.id.ll_bottomMenu_chat:
      setMenuSelector(0);
      break;
    case R.id.ll_bottomMenu_addressBook:
      setMenuSelector(1);
      break;
    case R.id.ll_bottomMenu_discovery:
      setMenuSelector(2);
      break;
    case R.id.ll_bottomMenu_me:
      setMenuSelector(3);
      break; 

    }
  } 

  /**
   * 选中指定的菜单项并显示对应的Fragment
   *
   * @param index
   */
  private void setMenuSelector(int index) {
    reSetSelected();
    tv_menus.get(index).setSelected(true);
    imgv_menus.get(index).setSelected(true);
    mViewPager.setCurrentItem(index);
  } 

  /**
   * 重置底部菜单所有ImageView和TextView为未选中状态
   */
  private void reSetSelected() {
    for (int i = 0; i < tv_menus.size(); i++) {
      tv_menus.get(i).setSelected(false);
      imgv_menus.get(i).setSelected(false);
    }
  } 

  @Override
  public void onPageScrollStateChanged(int arg0) { 

  } 

  @Override
  public void onPageScrolled(int arg0, float arg1, int arg2) { 

  } 

  @Override
  public void onPageSelected(int arg0) {
    setMenuSelector(arg0);
  }
}

贴上项目源码:Android仿微信底部菜单栏效果

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

(0)

相关推荐

  • Android制作微信app顶部menu菜单(ActionBar)

    使用微信APP的小伙伴对于微信的ActionBar一定有印象,今天就带领大家一起实现以下这个效果. 第一步打开我们的开发工具,这里我使用的是Eclipse+ADT插件,然后创建我们的工程,这里选择Android的最低版本号为3.0或以上. 然后开始我们的"抄袭",首先打开我们微信,我们看到,顶部标题部分,分为左右两部分,左侧为"微信"两字,右侧则为搜索按钮+更多按钮,点击搜索按钮,会出现一个文本输入框.点击更多按钮,则会出现隐藏的menu菜单,分为:添加好友.发起群

  • Android仿微信顶/底部菜单栏效果

    本文要实现仿微信微信底部菜单栏+顶部菜单栏,采用ViewPage来做,每一个page对应一个XML,当手指在ViewPage左右滑动时,就相应显示不同的page(其实就是xml)并且同时改变底部菜单按钮的图片变暗或变亮,同时如果点击底部菜单按钮,左右滑动page(其实就是xml)并且改变相应按钮的亮度. 一.布局 1.顶部菜单布局,命名为top_layout.xml <?xml version="1.0" encoding="utf-8"?> <R

  • Android开发之微信底部菜单栏实现的几种方法汇总

     实现方式 实现的方式有很多种 这里总结最常见的几种方式,以后再添加其他的. viewPager + RadioGroup viewPager + FragmentTabHost viewpager +TabLayout viewPager+RadioGroup 感觉这是最简单的一个了,我也就不贴代码 说说我理解的思路吧 通过给pager 和RadioGroup 添加监听,监听两个控件的变化 实现联动 当viewPager的显示pager改变就会触发监听 ,在监听中选中对应的RadioButto

  • Android仿微信菜单(Menu)(使用C#和Java分别实现)

    本篇是对安卓菜单使用编程方式实现,当然可以使用XML的方式完成同样的功能,基本Java和C#写法都是一致的,所以使用XML的方式在本篇中使用Java演示,需要注意的是,对于如果不是VS开发的话,那么资源文件名称必须以小写开头,否则会报错. 运行效果 C#实现 using Android.App; using Android.OS; using Android.Views; using Android.Widget; namespace MenuDemo { [Activity(Label = "

  • android自定义popupwindow仿微信右上角弹出菜单效果

    微信右上角的操作菜单看起来很好用,就照着仿了一下,不过是旧版微信的,手里刚好有一些旧版微信的资源图标,给大家分享一下. 不知道微信是用什么实现的,我使用popupwindow来实现,主要分为几块内容: 1.窗口布局文件:popwin_share.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com

  • Android开发Popwindow仿微信右上角下拉菜单实例代码

    先给大家看下效果图: MenuPopwindow: package com.cloudeye.android.cloudeye.view; import android.app.Activity; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.view.LayoutInflater; import android.view.View; import an

  • Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能

    如何为不同的list item呈现不同的菜单,本文实例就为大家介绍了Android仿微信或QQ滑动弹出编辑.删除菜单效果.增加下拉刷新等功能的实现,分享给大家供大家参考,具体内容如下 效果图: 1. 下载开源项目,并将其中的liberary导入到自己的项目中: 2. 使用SwipeMenuListView代替ListView,在页面中布局: <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh

  • Android中微信小程序开发之弹出菜单

    先给大家展示下效果图,具体效果图如下所示: 具体代码如下所示: 1.index.js //index.js //获取应用实例 var app = getApp() Page({ data: { isPopping: false,//是否已经弹出 animationPlus: {},//旋转动画 animationcollect: {},//item位移,透明度 animationTranspond: {},//item位移,透明度 animationInput: {},//item位移,透明度

  • Android仿微信底部菜单栏功能显示未读消息数量

    底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏,这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下做出来之后的效果: 以后使用的时候就可以换成自己项目的图片和字体了,主框架不用变哈哈, 首先是要布局layout下xml文件 main.xml: <?xml version="1.0" encoding=&qu

  • Android仿微信底部菜单栏效果

    前言 在市面上,大多数的APP都需要通过底部菜单栏来将程序的功能进行分类整理,通常都是分为3-5个大模块,从而正确有效地引导用户去使用我们的APP.实现底部菜单栏的方法也有很多种. 1.仿微信底部菜单栏(ViewPager+ImagerView+TextView) ......(其他方式后续会补充) 效果预览 首先来个开胃菜,看看实现效果: 先贴出项目所需的资源文件,这些可随个人自由更改颜色和文字 colors.xml <color name="bg_line_light_gray&quo

  • Android 仿微信底部渐变Tab效果

    先来看一下效果图 除了第三个的发现Tab有所差别外,其他的基本还原了微信的底部Tab渐变效果 每个Tab都是一个自定义View,根据ImageView的tint属性来实现颜色渐变效果,tint属性的使用可以看我的上一篇文章 我将自定义View命名为ShadeView,包含四个自定义属性 意思分别为图标.背景色.底部文本.底部文本大小 <declare-styleable name="ShadeView"> <attr name="icon" for

  • Android仿微信底部按钮滑动变色

    Android仿微信底部按钮滑动变色,这里只针对使用Fragment为Tab页的滑动操作,进行简单的变色讲解. 首先说下OnPageChangeListener这个监听 //这个监听有三个方法 public abstract void onPageScrollStateChanged (int state) public abstract void onPageScrolled (int position, float positionOffset, int positionOffsetPixe

  • Flutter实现仿微信底部菜单栏功能

    import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget{ @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: MyHomePage(), ), ); } } class MyHomePage extends Sta

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

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

  • Android仿微信雷达扫描效果的实现方法

    本文主要给大家介绍的是关于Android实现微信雷达扫描效果的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 废话不多说 先上图(用AS录制的 转换工具不是很好 所以看得效果不是很好) 效果图 示例代码 Activity 代码 public class ShapeDrawableActivity extends AppCompatActivity { private ImageView ivLightbeam; private ObjectAnimator radarScanAnim;

  • Android仿微信键盘切换效果

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

  • android 仿微信聊天气泡效果实现思路

    微信聊天窗口的信息效果类似iphone上的短信效果,以气泡的形式展现,在Android上,实现这种效果主要用到ListView和BaseAdapter,配合布局以及相关素材,就可以自己做出这个效果,素材可以下一个微信的APK,然后把后缀名改成zip,直接解压,就可以得到微信里面的所有素材了.首先看一下我实现的效果: 以下是工程目录结构: 接下来就是如何实现这个效果的代码: main.xml,这个是主布局文件,显示listview和上下两部分内容. 复制代码 代码如下: <?xml version

  • Android仿UC底部菜单栏实现原理与代码

    相关的链接: Android 底部菜单栏实现 最近刚看完ViewPager,就想到做这样一个Demo,当然也参考了高手们的实例里边的网格菜单,开始我打算用自定义的imgBtn,但是发现放在pager选项卡中不好排版,所以最好选了GridView,简单实用 一.先主界面xml activity_main.xml 复制代码 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

随机推荐