Android仿微信頂/底部菜單欄效果
本文要實(shí)現(xiàn)仿微信微信底部菜單欄+頂部菜單欄,采用ViewPage來(lái)做,每一個(gè)page對(duì)應(yīng)一個(gè)XML,當(dāng)手指在ViewPage左右滑動(dòng)時(shí),就相應(yīng)顯示不同的page(其實(shí)就是xml)并且同時(shí)改變底部菜單按鈕的圖片變暗或變亮,同時(shí)如果點(diǎn)擊底部菜單按鈕,左右滑動(dòng)page(其實(shí)就是xml)并且改變相應(yīng)按鈕的亮度。

一、布局
1、頂部菜單布局,命名為top_layout.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="45dp" android:background="@drawable/title_bar" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:text="微信" android:layout_centerVertical="true" android:textColor="#ffffff" android:textSize="20sp" android:textStyle="bold" /> <ImageButton android:id="@+id/top_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/top_add" android:layout_centerVertical="true" android:layout_alignParentRight="true" /> <ImageButton android:id="@+id/top_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/top_search" android:layout_centerVertical="true" android:layout_toLeftOf="@id/top_add" /> </RelativeLayout>
效果:

2、底部菜單布局bottom_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="60dp" android:background="@drawable/bottom_bar" android:orientation="horizontal" > <LinearLayout android:id="@+id/id_tab_weixin" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical" > <!-- android:clickable="false" 是為了防止ImageButton截取了觸摸事件 ,這里事件要給它的上一級(jí)linearlayout--> <ImageButton android:id="@+id/id_tab_weixin_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#00000000" android:clickable="false" android:src="@drawable/tab_weixin_pressed" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="微信" /> </LinearLayout> <LinearLayout android:id="@+id/id_tab_address" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical" > <ImageButton android:id="@+id/id_tab_address_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#00000000" android:clickable="false" android:src="@drawable/tab_address_normal" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="通訊錄" /> </LinearLayout> <LinearLayout android:id="@+id/id_tab_frd" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical" > <ImageButton android:id="@+id/id_tab_frd_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#00000000" android:clickable="false" android:src="@drawable/tab_find_frd_normal" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="發(fā)現(xiàn)" /> </LinearLayout> <LinearLayout android:id="@+id/id_tab_settings" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical" > <ImageButton android:id="@+id/id_tab_settings_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#00000000" android:clickable="false" android:src="@drawable/tab_settings_normal" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我" /> </LinearLayout> </LinearLayout>
效果:

3、整體布局
將上面兩個(gè)加到activity_main.xml中去
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <include layout="@layout/top_layout" /> <android.support.v4.view.ViewPager android:id="@+id/id_viewpage" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > </android.support.v4.view.ViewPager> " <include layout="@layout/bottom_layout" /> </LinearLayout>
效果:

效果還可以,底下菜單欄是有背景的,有點(diǎn)兒白色的,所以看得不是很清,一來(lái)微信是選中的
4、定義ViewPage的四個(gè)布局
因?yàn)橐肰iewPage要加四個(gè)page,每個(gè)page對(duì)應(yīng)一個(gè)xml,所以這里定義四個(gè)xml.
tab01.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="這里是微信" android:layout_centerVertical="true" android:textColor="#000000" android:textSize="40sp" android:textStyle="bold" /> </LinearLayout>
效果:

tab02.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="這里是通訊錄" android:layout_centerVertical="true" android:textColor="#000000" android:textSize="40sp" android:textStyle="bold" /> </LinearLayout>
效果:效果和上面一樣,只是文字改了一下
tab03.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="這里是發(fā)現(xiàn)" android:layout_centerVertical="true" android:textColor="#000000" android:textSize="40sp" android:textStyle="bold" /> </LinearLayout>
效果:效果和上面一樣,只是文字改了一下
tab04.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="這里是我" android:layout_centerVertical="true" android:textColor="#000000" android:textSize="40sp" android:textStyle="bold" /> </LinearLayout>
效果:效果和上面一樣,只是文字改了一下
二、代碼
1. MainActivity中把控件和ViewPage初始化
package com.example.tabexample;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.LinearLayout;
public class MainActivity extends Activity implements
android.view.View.OnClickListener {
private ViewPager mViewPager;// 用來(lái)放置界面切換
private PagerAdapter mPagerAdapter;// 初始化View適配器
private List<View> mViews = new ArrayList<View>();// 用來(lái)存放Tab01-04
// 四個(gè)Tab,每個(gè)Tab包含一個(gè)按鈕
private LinearLayout mTabWeiXin;
private LinearLayout mTabAddress;
private LinearLayout mTabFrd;
private LinearLayout mTabSetting;
// 四個(gè)按鈕
private ImageButton mWeiXinImg;
private ImageButton mAddressImg;
private ImageButton mFrdImg;
private ImageButton mSettingImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initView();
initViewPage();
initEvent();
}
private void initEvent() {
mTabWeiXin.setOnClickListener(this);
mTabAddress.setOnClickListener(this);
mTabFrd.setOnClickListener(this);
mTabSetting.setOnClickListener(this);
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
/**
*ViewPage左右滑動(dòng)時(shí)
*/
@Override
public void onPageSelected(int arg0) {
int currentItem = mViewPager.getCurrentItem();
switch (currentItem) {
case 0:
resetImg();
mWeiXinImg.setImageResource(R.drawable.tab_weixin_pressed);
break;
case 1:
resetImg();
mAddressImg.setImageResource(R.drawable.tab_address_pressed);
break;
case 2:
resetImg();
mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
break;
case 3:
resetImg();
mSettingImg.setImageResource(R.drawable.tab_settings_pressed);
break;
default:
break;
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
/**
* 初始化設(shè)置
*/
private void initView() {
mViewPager = (ViewPager) findViewById(R.id.id_viewpage);
// 初始化四個(gè)LinearLayout
mTabWeiXin = (LinearLayout) findViewById(R.id.id_tab_weixin);
mTabAddress = (LinearLayout) findViewById(R.id.id_tab_address);
mTabFrd = (LinearLayout) findViewById(R.id.id_tab_frd);
mTabSetting = (LinearLayout) findViewById(R.id.id_tab_settings);
// 初始化四個(gè)按鈕
mWeiXinImg = (ImageButton) findViewById(R.id.id_tab_weixin_img);
mAddressImg = (ImageButton) findViewById(R.id.id_tab_address_img);
mFrdImg = (ImageButton) findViewById(R.id.id_tab_frd_img);
mSettingImg = (ImageButton) findViewById(R.id.id_tab_settings_img);
}
/**
* 初始化ViewPage
*/
private void initViewPage() {
// 初媽化四個(gè)布局
LayoutInflater mLayoutInflater = LayoutInflater.from(this);
View tab01 = mLayoutInflater.inflate(R.layout.tab01, null);
View tab02 = mLayoutInflater.inflate(R.layout.tab02, null);
View tab03 = mLayoutInflater.inflate(R.layout.tab03, null);
View tab04 = mLayoutInflater.inflate(R.layout.tab04, null);
mViews.add(tab01);
mViews.add(tab02);
mViews.add(tab03);
mViews.add(tab04);
// 適配器初始化并設(shè)置
mPagerAdapter = new PagerAdapter() {
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
container.removeView(mViews.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = mViews.get(position);
container.addView(view);
return view;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public int getCount() {
return mViews.size();
}
};
mViewPager.setAdapter(mPagerAdapter);
}
/**
* 判斷哪個(gè)要顯示,及設(shè)置按鈕圖片
*/
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.id_tab_weixin:
mViewPager.setCurrentItem(0);
resetImg();
mWeiXinImg.setImageResource(R.drawable.tab_weixin_pressed);
break;
case R.id.id_tab_address:
mViewPager.setCurrentItem(1);
resetImg();
mAddressImg.setImageResource(R.drawable.tab_address_pressed);
break;
case R.id.id_tab_frd:
mViewPager.setCurrentItem(2);
resetImg();
mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
break;
case R.id.id_tab_settings:
mViewPager.setCurrentItem(3);
resetImg();
mSettingImg.setImageResource(R.drawable.tab_settings_pressed);
break;
default:
break;
}
}
/**
* 把所有圖片變暗
*/
private void resetImg() {
mWeiXinImg.setImageResource(R.drawable.tab_weixin_normal);
mAddressImg.setImageResource(R.drawable.tab_address_normal);
mFrdImg.setImageResource(R.drawable.tab_find_frd_normal);
mSettingImg.setImageResource(R.drawable.tab_settings_normal);
}
}
代碼量很短,只有幾百行,功能就可以實(shí)現(xiàn)了,注意這里去掉程序原本的標(biāo)題欄我直接用了
requestWindowFeature(Window.FEATURE_NO_TITLE);
2、效果:

三、思路說(shuō)明
1、分別為頂部菜單欄和底部菜單欄新建一個(gè)布局
2、中間是ViewPage,然后里面放四個(gè)Page(tab01-tab04.xml),注意,要通過(guò)適配器給ViewPage提供內(nèi)容.
3、監(jiān)聽ViewPage和底部菜單欄按鈕的事件(注意,這里的按鈕放在一個(gè)LinearLayout中,所以我們監(jiān)聽了LinearLayout的觸摸事件,而屏蔽了Imgaebutton的觸摸事件)
4、
public void onClick(View arg0)
這里面監(jiān)聽的是底部菜單的觸摸事件,根據(jù)觸摸的控件,改變自身的亮度、改變ViewPage顯示的內(nèi)容
mViewPager.setOnPageChangeListener(new OnPageChangeListener()
這里監(jiān)聽的是ViewPage左右滑動(dòng)的事件,改變相應(yīng)控件的亮度、改變ViewPage顯示的內(nèi)容
四、不足之處
1、最新版微信上應(yīng)該是左右滑動(dòng)是有部分亮度變化的,這里直接轉(zhuǎn)變過(guò)去了。
2、最新版微信文字也要跟著變化,這里沒做改變
本文已被整理到了《Android微信開發(fā)教程匯總》,歡迎大家學(xué)習(xí)閱讀。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- android自定義popupwindow仿微信右上角彈出菜單效果
- Android仿微信界面的導(dǎo)航以及右上角菜單欄效果
- Android開發(fā)Popwindow仿微信右上角下拉菜單實(shí)例代碼
- Android仿微信底部菜單欄效果
- Android開發(fā)之微信底部菜單欄實(shí)現(xiàn)的幾種方法匯總
- Android仿微信底部菜單欄功能顯示未讀消息數(shù)量
- Android仿微信滑動(dòng)彈出編輯、刪除菜單效果、增加下拉刷新功能
- Android自定義PopWindow實(shí)現(xiàn)QQ、微信彈出菜單效果
- Android制作微信app頂部menu菜單(ActionBar)
- Android實(shí)現(xiàn)微信加號(hào)菜單模式
相關(guān)文章
Android 實(shí)現(xiàn)電話來(lái)去自動(dòng)錄音的功能
本文主要介紹Android 電話自動(dòng)錄音功能的開發(fā),這里提供實(shí)現(xiàn)代碼和實(shí)現(xiàn)效果圖,有需要的小伙伴可以參考下2016-08-08
android異步請(qǐng)求服務(wù)器數(shù)據(jù)示例
這篇文章主要介紹了android異步請(qǐng)求服務(wù)器數(shù)據(jù)示例,需要的朋友可以參考下2014-03-03
Android開發(fā)之使用150行代碼實(shí)現(xiàn)滑動(dòng)返回效果
本文給大家分享Android開發(fā)之使用150行代碼實(shí)現(xiàn)滑動(dòng)返回效果的代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-05-05
Android?Studio實(shí)現(xiàn)簡(jiǎn)單頁(yè)面跳轉(zhuǎn)的詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于Android?Studio實(shí)現(xiàn)簡(jiǎn)單頁(yè)面跳轉(zhuǎn)的詳細(xì)教程,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Android?Studio具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-01-01
Android中進(jìn)程生命周期的優(yōu)先級(jí)
這篇文章主要介紹了Android中進(jìn)程生命周期的優(yōu)先級(jí)的相關(guān)資料,需要的朋友可以參考下2016-01-01
Flutter音樂(lè)播放插件audioplayers使用步驟詳解
audioplayers是一個(gè)可以支持同時(shí)播放多個(gè)音頻文件的Flutter的插件,可以播放多個(gè)同時(shí)的音頻文件,這篇文章主要介紹了audioplayers的使用步驟,感興趣想要詳細(xì)了解可以參考下文2023-05-05
Android中使用開源框架eventbus3.0實(shí)現(xiàn)fragment之間的通信交互
本文主要介紹了Android中使用開源框架eventbus3.0實(shí)現(xiàn)fragment之間的通信交互的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
Android?線程死鎖場(chǎng)景與優(yōu)化解決
線程死鎖是老生常談的問(wèn)題,線程池死鎖本質(zhì)上屬于線程死鎖的一部分,線程池造成的死鎖問(wèn)題往往和業(yè)務(wù)場(chǎng)景相關(guān),本文主要介紹了Android?線程死鎖場(chǎng)景與優(yōu)化,感興趣的可以了解一下2023-12-12
Flutter質(zhì)感設(shè)計(jì)之表單輸入
這篇文章主要為大家詳細(xì)介紹了Flutter質(zhì)感設(shè)計(jì)之表單輸入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android實(shí)現(xiàn)仿微信tab高亮icon粘著手的滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)仿微信tab高亮icon粘著手的滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08

