您当前的位置: 首页 >  android

android 自定义下拉菜单

xiangzhihong8 发布时间:2016-07-20 14:15:26 ,浏览量:3

    本实例的自定义下拉菜单主要是继承PopupWindow类来实现的弹出窗体,各种布局效果可以根据自己定义设计。弹出的动画效果主要用到了translate、alpha、scale,具体实现步骤如下:

         先上效果图如下:左边下拉菜单、中间下拉菜单、右边下拉菜单

                 

1.主界面布局 activity_main.xml:

[html]  view plain  copy
  1.   
  2.   
  3.       
  4.   
  5.       
  6.   
  7.       
  8.   
  9.           
  10.   
  11.           
  12.   
  13.           
  14.       
  15.   
  16.       
  17.   
  18.       
  19.   
  20.   
2.主界面测试类 MainActivity.java

[java]  view plain  copy
  1. package com.popuptest;  
  2.   
  3. import java.util.ArrayList;  
  4. import android.os.Bundle;  
  5. import android.util.DisplayMetrics;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.view.Window;  
  9. import android.widget.AdapterView;  
  10. import android.widget.Button;  
  11. import android.widget.ImageButton;  
  12. import android.widget.ImageView;  
  13. import android.widget.LinearLayout;  
  14. import android.widget.TextView;  
  15. import android.widget.AdapterView.OnItemClickListener;  
  16. import android.widget.RelativeLayout.LayoutParams;  
  17. import android.app.Activity;  
  18.   
  19. public class MainActivity extends Activity implements OnClickListener {  
  20.   
  21.     public static int screenW, screenH;  
  22.   
  23.     private ImageButton backBtn, createBtn;  
  24.     private Button confirmBtn;  
  25.     private TextView topTv;  
  26.     private LinearLayout topll;  
  27.     private ImageView topIv;  
  28.     private TextView topLineTv;  
  29.   
  30.     private TopMiddlePopup middlePopup;  
  31.   
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  36.         setContentView(R.layout.activity_main);  
  37.         getScreenPixels();  
  38.         initWidget();  
  39.     }  
  40.   
  41.     /** 
  42.      * 初始化控件 
  43.      */  
  44.     private void initWidget() {  
  45.         backBtn = (ImageButton) findViewById(R.id.urm_back_btn);  
  46.         createBtn = (ImageButton) findViewById(R.id.urm_create_btn);  
  47.         confirmBtn = (Button) findViewById(R.id.urm_confirm_btn);  
  48.   
  49.         topll = (LinearLayout) findViewById(R.id.urm_top_ll);  
  50.         topIv = (ImageView) findViewById(R.id.urm_top_iv);  
  51.   
  52.         topLineTv = (TextView) findViewById(R.id.rule_line_tv);  
  53.   
  54.         topTv = (TextView) findViewById(R.id.urm_top_tv);  
  55.         topTv.setText("企业客户");  
  56.   
  57.         backBtn.setOnClickListener(this);  
  58.         createBtn.setOnClickListener(this);  
  59.         confirmBtn.setOnClickListener(this);  
  60.         topll.setOnClickListener(this);  
  61.   
  62.     }  
  63.   
  64.     /** 
  65.      * 设置弹窗 
  66.      *  
  67.      * @param type 
  68.      */  
  69.     private void setPopup(int type) {  
  70.         middlePopup = new TopMiddlePopup(MainActivity.this, screenW, screenH,  
  71.                 onItemClickListener, getItemsName(), type);  
  72.     }  
  73.   
  74.     /** 
  75.      * 设置弹窗内容 
  76.      *  
  77.      * @return 
  78.      */  
  79.     private ArrayList getItemsName() {  
  80.         ArrayList items = new ArrayList();  
  81.         items.add("企业客户");  
  82.         items.add("集团客户");  
  83.         items.add("公海客户");  
  84.         return items;  
  85.     }  
  86.   
  87.     @Override  
  88.     public void onClick(View v) {  
  89.         switch (v.getId()) {  
  90.         case R.id.urm_back_btn:  
  91.             setPopup(1);  
  92.             middlePopup.show(topLineTv);  
  93.             break;  
  94.         case R.id.urm_create_btn:  
  95.             setPopup(2);  
  96.             middlePopup.show(topLineTv);  
  97.             break;  
  98.         case R.id.urm_confirm_btn:  
  99.   
  100.             break;  
  101.         case R.id.urm_top_ll:  
  102.             setPopup(0);  
  103.             middlePopup.show(topLineTv);  
  104.             break;  
  105.         }  
  106.     }  
  107.   
  108.     /** 
  109.      * 弹窗点击事件 
  110.      */  
  111.     private OnItemClickListener onItemClickListener = new OnItemClickListener() {  
  112.   
  113.         @Override  
  114.         public void onItemClick(AdapterView parent, View view, int position,  
  115.                 long id) {  
  116.             System.out.println("--onItemClickListener--:");  
  117.             middlePopup.dismiss();  
  118.         }  
  119.     };  
  120.   
  121.     /** 
  122.      * 获取屏幕的宽和高 
  123.      */  
  124.     public void getScreenPixels() {  
  125.         DisplayMetrics metrics = new DisplayMetrics();  
  126.         getWindowManager().getDefaultDisplay().getMetrics(metrics);  
  127.         screenW = metrics.widthPixels;  
  128.         screenH = metrics.heightPixels;  
  129.     }  
  130.   
  131. }  
3.自定义弹窗类 TopMiddlePopup.java

[java]  view plain  copy
  1. package com.popuptest;  
  2.   
  3. import java.util.ArrayList;  
  4. import android.content.Context;  
  5. import android.graphics.drawable.ColorDrawable;  
  6. import android.view.LayoutInflater;  
  7. import android.view.MotionEvent;  
  8. import android.view.View;  
  9. import android.view.View.OnTouchListener;  
  10. import android.view.ViewGroup.LayoutParams;  
  11. import android.widget.LinearLayout;  
  12. import android.widget.ListView;  
  13. import android.widget.PopupWindow;  
  14. import android.widget.AdapterView.OnItemClickListener;  
  15.   
  16. public class TopMiddlePopup extends PopupWindow {  
  17.   
  18.     private Context myContext;  
  19.     private ListView myLv;  
  20.     private OnItemClickListener myOnItemClickListener;  
  21.     private ArrayList myItems;  
  22.     private int myWidth;  
  23.     private int myHeight;  
  24.     private int myType;  
  25.   
  26.     // 判断是否需要添加或更新列表子类项  
  27.     private boolean myIsDirty = true;  
  28.   
  29.     private LayoutInflater inflater = null;  
  30.     private View myMenuView;  
  31.   
  32.     private LinearLayout popupLL;  
  33.   
  34.     private PopupAdapter adapter;  
  35.   
  36.     public TopMiddlePopup(Context context) {  
  37.         // TODO Auto-generated constructor stub  
  38.     }  
  39.   
  40.     public TopMiddlePopup(Context context, int width, int height,  
  41.             OnItemClickListener onItemClickListener, ArrayList items,  
  42.             int type) {  
  43.   
  44.         inflater = (LayoutInflater) context  
  45.                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  46.         myMenuView = inflater.inflate(R.layout.top_popup, null);  
  47.   
  48.         this.myContext = context;  
  49.         this.myItems = items;  
  50.         this.myOnItemClickListener = onItemClickListener;  
  51.         this.myType = type;  
  52.   
  53.         this.myWidth = width;  
  54.         this.myHeight = height;  
  55.   
  56.         System.out.println("--myWidth--:" + myWidth + "--myHeight--:"  
  57.                 + myHeight);  
  58.         initWidget();  
  59.         setPopup();  
  60.     }  
  61.   
  62.     /** 
  63.      * 初始化控件 
  64.      */  
  65.     private void initWidget() {  
  66.         myLv = (ListView) myMenuView.findViewById(R.id.popup_lv);  
  67.         popupLL = (LinearLayout) myMenuView.findViewById(R.id.popup_layout);  
  68.         myLv.setOnItemClickListener(myOnItemClickListener);  
  69.   
  70.         if (myType == 1) {  
  71.             android.widget.RelativeLayout.LayoutParams lpPopup = (android.widget.RelativeLayout.LayoutParams) popupLL  
  72.                     .getLayoutParams();  
  73.             lpPopup.width = (int) (myWidth * 1.0 / 4);  
  74.             lpPopup.setMargins(0, 0, (int) (myWidth * 3.0 / 4), 0);  
  75.             popupLL.setLayoutParams(lpPopup);  
  76.         } else if (myType == 2) {  
  77.             android.widget.RelativeLayout.LayoutParams lpPopup = (android.widget.RelativeLayout.LayoutParams) popupLL  
  78.                     .getLayoutParams();  
  79.             lpPopup.width = (int) (myWidth * 1.0 / 4);  
  80.             lpPopup.setMargins((int) (myWidth * 3.0 / 4), 0, 0, 0);  
  81.             popupLL.setLayoutParams(lpPopup);  
  82.         }  
  83.     }  
  84.   
  85.     /** 
  86.      * 设置popup的样式 
  87.      */  
  88.     private void setPopup() {  
  89.         // 设置AccessoryPopup的view  
  90.         this.setContentView(myMenuView);  
  91.         // 设置AccessoryPopup弹出窗体的宽度  
  92.         this.setWidth(LayoutParams.MATCH_PARENT);  
  93.         // 设置AccessoryPopup弹出窗体的高度  
  94.         this.setHeight(LayoutParams.MATCH_PARENT);  
  95.         // 设置AccessoryPopup弹出窗体可点击  
  96.         this.setFocusable(true);  
  97.         // 设置AccessoryPopup弹出窗体的动画效果  
  98.         if (myType == 1) {  
  99.             this.setAnimationStyle(R.style.AnimTopLeft);  
  100.         } else if (myType == 2) {  
  101.             this.setAnimationStyle(R.style.AnimTopRight);  
  102.         } else {  
  103.             //this.setAnimationStyle(R.style.AnimTop);  
  104.             this.setAnimationStyle(R.style.AnimTopMiddle);  
  105.         }  
  106.         // 实例化一个ColorDrawable颜色为半透明  
  107.         ColorDrawable dw = new ColorDrawable(0x33000000);  
  108.         // 设置SelectPicPopupWindow弹出窗体的背景  
  109.         this.setBackgroundDrawable(dw);  
  110.   
  111.         myMenuView.setOnTouchListener(new OnTouchListener() {  
  112.   
  113.             @Override  
  114.             public boolean onTouch(View v, MotionEvent event) {  
  115.   
  116.                 int height = popupLL.getBottom();  
  117.                 int left = popupLL.getLeft();  
  118.                 int right = popupLL.getRight();  
  119.                 System.out.println("--popupLL.getBottom()--:"  
  120.                         + popupLL.getBottom());  
  121.                 int y = (int) event.getY();  
  122.                 int x = (int) event.getX();  
  123.                 if (event.getAction() == MotionEvent.ACTION_UP) {  
  124.                     if (y > height || x  right) {  
  125.                         System.out.println("---点击位置在列表下方--");  
  126.                         dismiss();  
  127.                     }  
  128.                 }  
  129.                 return true;  
  130.             }  
  131.         });  
  132.     }  
  133.   
  134.     /** 
  135.      * 显示弹窗界面 
  136.      *  
  137.      * @param view 
  138.      */  
  139.     public void show(View view) {  
  140.         if (myIsDirty) {  
  141.             myIsDirty = false;  
  142.             adapter = new PopupAdapter(myContext, myItems, myType);  
  143.             myLv.setAdapter(adapter);  
  144.         }  
  145.   
  146.         showAsDropDown(view, 0, 0);  
  147.     }  
  148.   
  149. }  
4.自定义弹窗布局 top_popup.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.       
  5.   
  6.           
  7.           
  8.   
  9.           
  10.       
  11.   
  12.   
5.弹窗类表适配器类 PopupAdapter

[java]  view plain  copy
  1. package com.popuptest;  
  2.   
  3. import java.util.ArrayList;  
  4. import android.content.Context;  
  5. import android.view.Gravity;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.RelativeLayout.LayoutParams;  
  11. import android.widget.TextView;  
  12.   
  13. public class PopupAdapter extends BaseAdapter {  
  14.     private Context myContext;  
  15.     private LayoutInflater inflater;  
  16.     private ArrayList myItems;  
  17.     private int myType;  
  18.   
  19.     public PopupAdapter(Context context, ArrayList items, int type) {  
  20.         this.myContext = context;  
  21.         this.myItems = items;  
  22.         this.myType = type;  
  23.   
  24.         inflater = LayoutInflater.from(myContext);  
  25.   
  26.     }  
  27.   
  28.     @Override  
  29.     public int getCount() {  
  30.         return myItems.size();  
  31.     }  
  32.   
  33.     @Override  
  34.     public String getItem(int position) {  
  35.         return myItems.get(position);  
  36.     }  
  37.   
  38.     @Override  
  39.     public long getItemId(int position) {  
  40.         return 0;  
  41.     }  
  42.   
  43.     @Override  
  44.     public View getView(int position, View convertView, ViewGroup parent) {  
  45.         PopupHolder holder = null;  
  46.         if (convertView == null) {  
  47.             holder = new PopupHolder();  
  48.             convertView = inflater.inflate(R.layout.top_popup_item, null);  
  49.             holder.itemNameTv = (TextView) convertView  
  50.                     .findViewById(R.id.popup_tv);  
  51.             if (myType == 0) {  
  52.                 holder.itemNameTv.setGravity(Gravity.CENTER);  
  53.             } else if (myType == 1) {  
  54.                 holder.itemNameTv.setGravity(Gravity.LEFT);  
  55.             } else if (myType == 2) {  
  56.                 holder.itemNameTv.setGravity(Gravity.RIGHT);  
  57.             }  
  58.             convertView.setTag(holder);  
  59.         } else {  
  60.             holder = (PopupHolder) convertView.getTag();  
  61.         }  
  62.         String itemName = getItem(position);  
  63.         holder.itemNameTv.setText(itemName);  
  64.         return convertView;  
  65.     }  
  66.   
  67.     private class PopupHolder {  
  68.         TextView itemNameTv;  
  69.     }  
  70.   
  71. }  
6.子item布局 top_popup_item.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.       
  5.   
  6.   
7.主界面顶部布局 urm_top.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.       
  5.   
  6.       
  7.   
  8.           
  9.   
  10.           
  11.       
  12.   
  13.       
  14.   
  15.           
  16.   
  17.           
  18.       
  19.   
  20.       
  21.   
  22.   
8.styles.xml文件

[html]  view plain  copy
  1.   
  2.   
  3.       
  4.       
  5.           
  6.       
  7.       
  8.       
  9.         @anim/push_top_in  
  10.         @anim/push_top_out  
  11.       
  12.       
  13.        
  14.         @anim/top_right_in  
  15.         @anim/top_right_out  
  16.       
  17.       
  18.        
  19.         @anim/top_left_in  
  20.         @anim/top_left_out  
  21.       
  22.       
  23.        
  24.         @anim/top_middle_in  
  25.         @anim/top_middle_out  
  26.       
  27.       
  28.       
  29.         20sp  
  30.         #000000  
  31.       
  32.   
  33.       
  34.         18sp  
  35.       
  36.   
9.各种动画效果

push_top_in.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.   
  5.       
  6.   
  7.       
  8.   
  9.   
push_top_out.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.   
  5.       
  6.   
  7.       
  8.   
  9.   
top_left_in.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.       
  5.   
  6.   
top_left_out.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.       
  5.   
  6.   
top_middle_in.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.       
  5.   
  6.   
top_middle_out.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.       
  5.   
  6.   
top_right_in.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.       
  5.   
  6.   
top_right_out.xml

[html]  view plain  copy
  1.   
  2.   
  3.   
  4.       
  5.   
  6.   
运行项目即可搞定!
关注
打赏
1688896170
查看更多评论

xiangzhihong8

暂无认证

  • 3浏览

    0关注

    1319博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.2077s