当前位置:操作系统 > 安卓/Android >>

Android自定义PopupWindow实现的Menu(TabMenu)

用过UCWEB-Android版的人都应该对其特殊的menu有印象,把menu做成Tab-Menu(支持分页的Menu),可以容纳比Android传统的menu更丰富的内容(Android的menu超过6项则缩略在[更多]里),本文参考网上的例子,对例子进行简化以及封装,使其作为一个复合控件融入自己的framework。

先来看看本文程序运行的效果:
 

TabMenu本身就是一个PopupWindow,PopupWindow上面放了两个GridView,第一个GridView就是分页标签,位于PopupWindow的顶部,第二个GridView是菜单,位于PopupWindow的主体。为了实现PopupWindow的弹出/退出的动画效果,本文使用了以下代码:

在工程的res文件夹里添加anim子目录,再新建文件popup_enter.xml:
Java代码 
<?xml version="1.0" encoding="utf-8"?>   
<set xmlns:android="http://schemas.android.com/apk/res/android">   
    <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="1000" />   
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="1000" />   
</set> 


新建文件popup_exit.xml:
Java代码 
<?xml version="1.0" encoding="utf-8"?>   
<set xmlns:android="http://schemas.android.com/apk/res/android">   
    <translate android:fromYDelta="0" android:toYDelta="100%p" android:duration="1000" />   
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="1000" />   
</set> 


在工程的values文件夹里新建文件popup_animation.xml:
Java代码 
<?xml version="1.0" encoding="utf-8"?>   
<resources>      
    <style name="PopupAnimation" parent="android:Animation">  
        <item name="android:windowEnterAnimation">@anim/popup_enter</item>   
        <item name="android:windowExitAnimation">@anim/popup_exit</item>    
    </style>   
</resources> 


main.xml的源码如下:
Java代码 
<?xml version="1.0" encoding="utf-8"?>   
<LinearLayout android:id="@+id/LinearLayout01"   
    android:layout_width="fill_parent" android:layout_height="fill_parent"   
    xmlns:android="http://schemas.android.com/apk/res/android">   
    <TextView android:id="@+id/TextView01" android:layout_height="wrap_content"   
        android:layout_width="fill_parent" android:text="扩展Menu"></TextView>   
</LinearLayout> 


TabMenu的封装类TabMenu.java的源码如下:
Java代码 
package com.iaiai.activity; 
 
import android.content.Context; 
import android.graphics.Color; 
import android.graphics.drawable.ColorDrawable; 
import android.view.Gravity; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.PopupWindow; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.LinearLayout.LayoutParams; 
 
/**
 * 
 * <p>
 * Title: TabMenu.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-17
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */ 
public class TabMenu extends PopupWindow { 
    private GridView gvBody, gvTitle; 
    private LinearLayout mLayout; 
    private MenuTitleAdapter titleAdapter; 
 
    public TabMenu(Context context, OnItemClickListener titleClick, 
            OnItemClickListener bodyClick, MenuTitleAdapter titleAdapter, 
            int colorBgTabMenu, int aniTabMenu) { 
        super(context); 
 
        mLayout = new LinearLayout(context); 
        mLayout.setOrientation(LinearLayout.VERTICAL); 
        // 标题选项栏 
        gvTitle = new GridView(context); 
        gvTitle.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
                LayoutParams.WRAP_CONTENT)); 
        gvTitle.setNumColumns(titleAdapter.getCount()); 
        gvTitle.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); 
        gvTitle.setVerticalSpacing(1); 
        gvTitle.setHorizontalSpacing(1); 
        gvTitle.setGravity(Gravity.CENTER); 
        gvTitle.setOnItemClickListener(titleClick); 
        gvTitle.setAdapter(titleAdapter); 
        gvTitle.setSelector(new ColorDrawable(Color.TRANSPARENT));// 选中的时候为透明色 
        this.titleAdapter = titleAdapter; 
        // 子选项栏 
        gvBody = new GridView(context); 
        gvBody.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
                LayoutParams.WRAP_CONTENT)); 
        gvBody.setSelector(new ColorDrawable(Color.TRANSPARENT));// 选中的时候为透明色 
        gvBody.setNumColumns(4); 
        gvBody.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); 
        gvBody.setVerticalSpacing(10); 
        gvBody.setHorizontalSpacing(10); 
&n

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,