Android实现顶部导航菜单左右滑动效果

2019-12-10 17:53:16刘景俊

代码中id为ivMenuBackground的图片是为了在点击一项菜单后设置其背景图片,菜单中默认选中第一项“移动”。
在程序结构图中的item_xxx.xml是为了在选一项菜单后显示下面的布局内容。这只是个示例,有兴趣的朋友可以改造成其它的布局内容。

使用二维数组存储导航菜单项:   

 private String[][] menus = {{SlideMenuUtil.ITEM_MOBILE,SlideMenuUtil.ITEM_WEB, 
  
 SlideMenuUtil.ITEM_CLOUD,SlideMenuUtil.ITEM_DATABASE},
  {SlideMenuUtil.ITEM_EMBED,SlideMenuUtil.ITEM_SERVER,
   SlideMenuUtil.ITEM_DOTNET,SlideMenuUtil.ITEM_JAVA},
  {SlideMenuUtil.ITEM_SAFE,SlideMenuUtil.ITEM_DOMAIN,
   SlideMenuUtil.ITEM_RESEASRCH,SlideMenuUtil.ITEM_MANAGE}};

上例代码中:数组的第一维是用来显示几页数据,第二维是用来显示每一页中的几个菜单项。
在刚开始时,需要初始化导航菜单内容:

 LayoutInflater inflater = getLayoutInflater(); 
 menuViews = new ArrayList<View>(); 
 SlideMenuLayout menu = new SlideMenuLayout(this);
 
 for(int i = 0;i < menus.length;i++){
 menuViews.add(menu.getSlideMenuLinerLayout(menus[i],screenWidth));
 }
 
 main = (ViewGroup)inflater.inflate(R.layout.main, null);

其中,menuViews是用来装载页面布局控件,有3个页面menuViews就有3项。screenWidth是代表屏幕宽度。这里还使用到SlideMenuLayout类的实例方法:getSlideMenuLinerLayout(String[] menuTextViews,int layoutWidth)
menuTextViews是代表每页中有几项菜单,layoutWidth是屏幕宽度。该方法中代码如下:

 /** 
 * 顶部滑动菜单布局
 * @param menuTextViews
 * @param layoutWidth
 */
 public View getSlideMenuLinerLayout(String[] menuTextViews,int layoutWidth){
 // 包含TextView的LinearLayout
 LinearLayout menuLinerLayout = new LinearLayout(activity);
 menuLinerLayout.setOrientation(LinearLayout.HORIZONTAL);
 
 // 参数设置
 LinearLayout.LayoutParams menuLinerLayoutParames = new LinearLayout.LayoutParams(
 LinearLayout.LayoutParams.WRAP_CONTENT, 
 LinearLayout.LayoutParams.WRAP_CONTENT,
 1);
 menuLinerLayoutParames.gravity = Gravity.CENTER_HORIZONTAL;
 
 // 添加TextView控件
 for(int i = 0;i < menuTextViews.length; i++){
 TextView tvMenu = new TextView(activity);
 // 设置标识值
 tvMenu.setTag(menuTextViews[i]);
 tvMenu.setLayoutParams(new LayoutParams(layoutWidth / 4,30)); 
 tvMenu.setPadding(30, 14, 30, 10);
 tvMenu.setText(menuTextViews[i]);
 tvMenu.setTextColor(Color.WHITE);
 tvMenu.setGravity(Gravity.CENTER_HORIZONTAL);
 tvMenu.setOnClickListener(SlideMenuOnClickListener);
 
 // 菜单项计数
 menuUtil.count ++;

 // 设置第一个菜单项背景
 if(menuUtil.count == 1){
 tvMenu.setBackgroundResource(R.drawable.menu_bg);
 }
 
 menuLinerLayout.addView(tvMenu,menuLinerLayoutParames);
 menuList.add(tvMenu);
 }

 return menuLinerLayout;
 }