从屏幕底部弹出PopupWindow

来源:互联网 发布:windows 强力卸载 编辑:程序博客网 时间:2024/04/28 08:22

最近因为要用到PopupWindow,所以,就在网上搜索了一下,发现挺多关于这样的文章,现在我把它们整理了一下。

  1、Android PopupWindow 的使用技巧,http://www.cnblogs.com/sw926/p/3230659.html

2、Android PopupWindow 的使用和分析,http://www.cnblogs.com/mengdd/p/3569127.html

3、Android PopupWindow 实现从底部弹出或滑出选择菜单或窗口,http://104zz.iteye.com/blog/1685389


     本文是整理上面三篇文章而成,绝大部分代码是使用第三篇的,如有不妥,请联系。


     一、第一步就是创建布局文件

       res/layout/finish_project_popupwindow.xml

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <Button  
  8.         android:id="@+id/popupwindow_Button_saveProject"  
  9.         android:layout_marginLeft="20dip"    
  10.         android:layout_marginRight="20dip"    
  11.         android:layout_marginTop="10dip"   
  12.         android:layout_width="match_parent"  
  13.         android:layout_height="wrap_content"  
  14.         android:text="@string/popupwindow_Button_saveProject" />  
  15.   
  16.     <Button  
  17.         android:id="@+id/popupwindow_Button_abandonProject"  
  18.         android:layout_marginLeft="20dip"    
  19.         android:layout_marginRight="20dip"    
  20.         android:layout_marginTop="10dip"   
  21.         android:layout_width="match_parent"  
  22.         android:layout_height="wrap_content"  
  23.         android:text="@string/popupwindow_Button_abandonProject" />  
  24.   
  25.     <Button  
  26.         android:id="@+id/popupwindow_cancelButton"  
  27.         android:layout_marginLeft="20dip"    
  28.         android:layout_marginRight="20dip"    
  29.         android:layout_marginTop="10dip"   
  30.         android:layout_width="match_parent"  
  31.         android:layout_height="wrap_content"  
  32.         android:text="@string/popupwindow_cancelButton" />  
  33.   
  34. </LinearLayout>  

二、第二步,设置PopupWindow弹出和淡出的动画效果

              1、在res目录下建立一个文件夹anim,专门用于存储PopupWindow弹出和淡出的动画效果

(1)PopupWindow  弹出时的动画效果

                     res/anim/enter_anim.xml

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:shareInterpolator="false">    
  4.     <translate    
  5.         android:fromYDelta="100%p"    
  6.         android:toYDelta="0"     
  7.         android:duration="500" />    
  8.     <alpha    
  9.         android:fromAlpha="0"    
  10.         android:toAlpha="1.0"     
  11.         android:duration="300"/>       
  12. </set>   
            (2)PopupWindow 淡出时的动画效果

                  res/anim/out_anim.xml

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:shareInterpolator="false">    
  4.     <translate    
  5.         android:fromYDelta="0"    
  6.         android:toYDelta="100%p"     
  7.         android:duration="3000"/>   
  8.   
  9.     <alpha    
  10.         android:fromAlpha="1.0"    
  11.         android:toAlpha="0"     
  12.         android:duration="2000"/>       
  13. </set>    

            在<translate>标签中,fromYDelta, toYDelta 表示在y轴方法的移动,因为我是要实现从底部弹出PopupWindow的,所以,是y轴,如果想要实现从屏幕侧边的话,可以选择x轴fromXDelta, toXDelta。

duration 表示弹出或者淡出的动画时间。在<alpha>标签中表示PopupWindow透明度的变化,这样是为了比较好看。duration 同样表示时间。

           (3)增加这样的Style

               在res/valus/styles.xml  的<resources>标签内添加

[java] view plain copy
  1.  <!-- popupwindow 动画 -->    
  2. <style name="Animation">    
  3.     <item name="android:windowEnterAnimation">@anim/enter_anim</item>   
  4.     <item name="android:windowExitAnimation">@anim/out_anim</item>    
  5. </style>   
        其中,
[java] view plain copy
  1. <item name="android:windowEnterAnimation">@anim/enter_anim</item>   
       表示窗口弹出时的动画文件,@anim/enter_anim  中enter_anim一定要和我们前面定义弹出动画的文件名一致,淡出的动画文件类似。

     

       三、创建自定义类,继承PopupWindow

             src/FinishProjectPopupWindow.Java

[java] view plain copy
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.drawable.ColorDrawable;  
  4. import android.util.Log;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.view.ViewGroup.LayoutParams;  
  9. import android.widget.Button;  
  10. import android.widget.PopupWindow;  
  11.   
  12. public class FinishProjectPopupWindows extends PopupWindow{  
  13.       
  14.     private static final String TAG = "FinishProjectPopupWindows";  
  15.   
  16.     private View mView;  
  17.     public Button btnSaveProject, btnAbandonProject, btnCancelProject;  
  18.   
  19.     public FinishProjectPopupWindows(Activity context,  
  20.             OnClickListener itemsOnClick) {  
  21.         super(context);  
  22.           
  23.          Log.i(TAG, "FinishProjectPopupWindow 方法已被调用");  
  24.            
  25.          LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
  26.          mView = inflater.inflate(R.layout.finish_project_popuwindow, null);    
  27.            
  28.          btnSaveProject = (Button) mView.findViewById(R.id.popupwindow_Button_saveProject);  
  29.          btnAbandonProject = (Button) mView.findViewById(R.id.popupwindow_Button_abandonProject);  
  30.          btnCancelProject = (Button) mView.findViewById(R.id.popupwindow_cancelButton);  
  31.            
  32.          // 设置按钮监听  
  33.          btnCancelProject.setOnClickListener(new OnClickListener(){  
  34.             @Override  
  35.             public void onClick(View v) {  
  36.                 Log.i(TAG, "取消项目");  
  37.                dismiss();  
  38.             }          
  39.          });  
  40.          btnSaveProject.setOnClickListener(itemsOnClick);  
  41.          btnAbandonProject.setOnClickListener(itemsOnClick);  
  42.            
  43.           
  44.         //设置PopupWindow的View    
  45.             this.setContentView(mView);    
  46.             //设置PopupWindow弹出窗体的宽    
  47.             this.setWidth(LayoutParams.MATCH_PARENT);    
  48.             //设置PopupWindow弹出窗体的高    
  49.             this.setHeight(LayoutParams.WRAP_CONTENT);    
  50.             //设置PopupWindow弹出窗体可点击    
  51.              this.setFocusable(true);    
  52.             //设置SelectPicPopupWindow弹出窗体动画效果    
  53.             this.setAnimationStyle(R.style.Animation);  
  54.             //实例化一个ColorDrawable颜色为半透明    
  55.             ColorDrawable dw = new ColorDrawable(0xb0000000);    
  56.             //设置SelectPicPopupWindow弹出窗体的背景    
  57.             this.setBackgroundDrawable(dw);   
  58.     }  
  59. }  



          四、在Activity中设置弹出PopupWindow

[java] view plain copy
  1. private FinishProjectPopupWindows mFinishProjectPopupWindow  

[java] view plain copy
  1. mFinishProjectPopupWindow = new FinishProjectPopupWindows(MapFragmentActivity.this, itemsOnClick);  
  2. // 显示PopupWindow  
[java] view plain copy
  1. mFinishProjectPopupWindow.showAtLocation(MapFragmentActivity.this.findViewById(R.id.main),   
  2.                    Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 00);  


        五、实现PopupWindow中按钮的监听

[java] view plain copy
  1.  private OnClickListener  itemsOnClick = new OnClickListener(){  
  2.     @Override  
  3.     public void onClick(View v) {  
  4.         mFinishProjectPopupWindow.dismiss();  
  5.         switch(v.getId()){  
  6.         case R.id.popupwindow_Button_saveProject:  
  7.             Log.i(TAG, "保存线路");  
  8.             break;  
  9.         case R.id.popupwindow_Button_abandonProject:  
  10.             break;  
  11.         case R.id.popupwindow_cancelButton:  
  12.             mFinishProjectPopupWindow.dismiss();  
  13.             Log.i(TAG, "取消");  
  14.             break;  
  15.         }  
  16.           
  17.     }  
  18.        
  19. };  
  20.    



运行的效果


0 0