您的位置:首页 > 移动开发 > 微信开发

仿微信6.0底部滑动菜单

2016-04-07 13:11 381 查看

仿微信6.0底部滑动菜单

主要的文件有:

MyActivity

IconTabPageIndicator

BaseFragment

IconPagerAdapter

PageIndicator

其他的xml文件

开发环境

一年没有写过Android代码后,帮朋友重新开发一个应用中用到的这个框架,记录一下,防止忘记

Android Studio 1.5.1

JRE 1.8.0

gradle 2.8

源代码

这里只是关键代码,只需要替换到对应的位置:

MyActivity

package com.example.zxy.test;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

import com.viewpagerindicator.IconPagerAdapter;

import java.util.ArrayList;
import java.util.List;

public class MyActivity extends FragmentActivity {

private ViewPager mViewPager;
private IconTabPageIndicator mIndicator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);

initViews();
}

private void initViews() {
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mIndicator = (IconTabPageIndicator) findViewById(R.id.indicator);
List<BaseFragment> fragments = initFragments();
FragmentAdapter adapter = new FragmentAdapter(fragments, getSupportFragmentManager());
mViewPager.setAdapter(adapter);
mIndicator.setViewPager(mViewPager);
}

private List<BaseFragment> initFragments() {
List<BaseFragment> fragments = new ArrayList<BaseFragment>();

BaseFragment userFragment = new BaseFragment();
userFragment.setTitle("用户");
userFragment.setIconId(R.drawable.tab_user_selector);
fragments.add(userFragment);

BaseFragment noteFragment = new BaseFragment();
noteFragment.setTitle("记事本");
noteFragment.setIconId(R.drawable.tab_record_selector);
fragments.add(noteFragment);

BaseFragment contactFragment = new BaseFragment();
contactFragment.setTitle("联系人");
contactFragment.setIconId(R.drawable.tab_user_selector);
fragments.add(contactFragment);

BaseFragment recordFragment = new BaseFragment();
recordFragment.setTitle("记录");
recordFragment.setIconId(R.drawable.tab_record_selector);
fragments.add(recordFragment);

return fragments;
}

class FragmentAdapter extends FragmentPagerAdapter implements IconPagerAdapter {
private List<BaseFragment> mFragments;

public FragmentAdapter(List<BaseFragment> fragments, FragmentManager fm) {
super(fm);
mFragments = fragments;
}

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

@Override
public int getIconResId(int index) {
return mFragments.get(index).getIconId();
}

@Override
public int getCount() {
return mFragments.size();
}

@Override
public CharSequence getPageTitle(int position) {
return mFragments.get(position).getTitle();
}
}

}


BaseFragment

package com.example.zxy.test;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class BaseFragment extends Fragment {
private String title;
private int iconId;

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public int getIconId() {
return iconId;
}

public void setIconId(int iconId) {
this.iconId = iconId;
}

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.v("choice--->",getTitle());
if(getTitle().equals("用户")) {
View view = inflater.inflate(R.layout.fragment, null, false);
TextView textView = (TextView) view.findViewById(R.id.text);
textView.setText(getTitle());
return view;
} else {
View view = inflater.inflate(R.layout.fragment2, null, false);
TextView textView = (TextView) view.findViewById(R.id.text2);
textView.setText(getTitle());
return view;
}

}
}


IconTabPageIndicator

package com.example.zxy.test;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.viewpagerindicator.IconPagerAdapter;
import com.viewpagerindicator.PageIndicator;

import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;

public class IconTabPageIndicator extends LinearLayout implements PageIndicator {
/**
* Title text used when no title is provided by the adapter.
*/
private static final CharSequence EMPTY_TITLE = "";

/**
* Interface for a callback when the selected tab has been reselected.
*/
public interface OnTabReselectedListener {
/**
* Callback when the selected tab has been reselected.
*
* @param position Position of the current center item.
*/
void onTabReselected(int position);
}

private Runnable mTabSelector;

private final View.OnClickListener mTabClickListener = new View.OnClickListener() {
public void onClick(View view) {
TabView tabView = (TabView) view;
final int oldSelected = mViewPager.getCurrentItem();
final int newSelected = tabView.getIndex();
mViewPager.setCurrentItem(newSelected, false);
if (oldSelected == newSelected && mTabReselectedListener != null) {
mTabReselectedListener.onTabReselected(newSelected);
}
}
};

private final LinearLayout mTabLayout;

private ViewPager mViewPager;
private ViewPager.OnPageChangeListener mListener;

private int mSelectedTabIndex;

private OnTabReselectedListener mTabReselectedListener;

private int mTabWidth;

public IconTabPageIndicator(Context context) {
this(context, null);
}

public IconTabPageIndicator(Context context, AttributeSet attrs) {
super(context, attrs);
setHorizontalScrollBarEnabled(false);

mTabLayout = new LinearLayout(context, null, R.attr.tabPageIndicator);
addView(mTabLayout, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
}

public void setOnTabReselectedListener(OnTabReselectedListener listener) {
mTabReselectedListener = listener;
}

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int widthMode = View.MeasureSpec.getMode(widthMeasureSpec);
final boolean lockedExpanded = widthMode == View.MeasureSpec.EXACTLY;

final int childCount = mTabLayout.getChildCount();

if (childCount > 1 && (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) {
mTabWidth = MeasureSpec.getSize(widthMeasureSpec) / childCount;
} else {
mTabWidth = -1;
}

final int oldWidth = getMeasuredWidth();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int newWidth = getMeasuredWidth();

if (lockedExpanded && oldWidth != newWidth) {
// Recenter the tab display if we're at a new (scrollable) size.
setCurrentItem(mSelectedTabIndex);
}
}

private void animateToTab(final int position) {
final View tabView = mTabLayout.getChildAt(position);
if (mTabSelector != null) {
removeCallbacks(mTabSelector);
}
mTabSelector = new Runnable() {
public void run() {
final int scrollPos = tabView.getLeft() - (getWidth() - tabView.getWidth()) / 2;
mTabSelector = null;
}
};
post(mTabSelector);
}

@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
if (mTabSelector != null) {
// Re-post the selector we saved
post(mTabSelector);
}
}

@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mTabSelector != null) {
removeCallbacks(mTabSelector);
}
}

private void addTab(int index, CharSequence text, int iconResId) {
final TabView tabView = new TabView(getContext());
tabView.mIndex = index;
tabView.setOnClickListener(mTabClickListener);
tabView.setText(text);

if (iconResId > 0) {
tabView.setIcon(iconResId);
}

mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0, MATCH_PARENT, 1));
}

@Override
public void onPageScrollStateChanged(int arg0) {
if (mListener != null) {
mListener.onPageScrollStateChanged(arg0);
}
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
if (mListener != null) {
mListener.onPageScrolled(arg0, arg1, arg2);
}
}

@Override
public void onPageSelected(int arg0) {
setCurrentItem(arg0);
if (mListener != null) {
mListener.onPageSelected(arg0);
}
}

@Override
public void setViewPager(ViewPager view) {
if (mViewPager == view) {
return;
}
if (mViewPager != null) {
mViewPager.setOnPageChangeListener(null);
}
final PagerAdapter adapter = view.getAdapter();
if (adapter == null) {
throw new IllegalStateException("ViewPager does not have adapter instance.");
}
mViewPager = view;
view.setOnPageChangeListener(this);
notifyDataSetChanged();
}

public void notifyDataSetChanged() {
mTabLayout.removeAllViews();
PagerAdapter adapter = mViewPager.getAdapter();
IconPagerAdapter iconAdapter = null;
if (adapter instanceof IconPagerAdapter) {
iconAdapter = (IconPagerAdapter) adapter;
}
final int count = adapter.getCount();
for (int i = 0; i < count; i++) {
CharSequence title = adapter.getPageTitle(i);
if (title == null) {
title = EMPTY_TITLE;
}
int iconResId = 0;
if (iconAdapter != null) {
iconResId = iconAdapter.getIconResId(i);
}
addTab(i, title, iconResId);
}
if (mSelectedTabIndex > count) {
mSelectedTabIndex = count - 1;
}
setCurrentItem(mSelectedTabIndex);
requestLayout();
}

@Override
public void setViewPager(ViewPager view, int initialPosition) {
setViewPager(view);
setCurrentItem(initialPosition);
}

@Override
public void setCurrentItem(int item) {
if (mViewPager == null) {
throw new IllegalStateException("ViewPager has not been bound.");
}
mSelectedTabIndex = item;
mViewPager.setCurrentItem(item, false);

final int tabCount = mTabLayout.getChildCount();
for (int i = 0; i < tabCount; i++) {
final View child = mTabLayout.getChildAt(i);
final boolean isSelected = (i == item);
child.setSelected(isSelected);
if (isSelected) {
animateToTab(item);
}
}
}

@Override
public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) {
mListener = listener;
}

private class TabView extends LinearLayout {
private int mIndex;
private ImageView mImageView;
private TextView mTextView;

public TabView(Context context) {
super(context, null, R.attr.tabView);
View view = View.inflate(context, R.layout.tab_view, null);
mImageView = (ImageView) view.findViewById(R.id.tab_image);
mTextView = (TextView) view.findViewById(R.id.tab_text);
this.addView(view);
}

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

// Re-measure if we went beyond our maximum size.
if (mTabWidth > 0) {
super.onMeasure(MeasureSpec.makeMeasureSpec(mTabWidth, MeasureSpec.EXACTLY),
heightMeasureSpec);
}
}

public void setText(CharSequence text) {
mTextView.setText(text);
}

public void setIcon(int resId) {
if (resId > 0) {
mImageView.setImageResource(resId);
}
}

public int getIndex() {
return mIndex;
}
}
}


具体demo可以点击下载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息