zoukankan      html  css  js  c++  java
  • 转 android 从底部弹出一个popuwindow,渐入渐出效果。我这里是用在购物车需要选择购买选项的操作。

    最近要改客户端,需要实现一个从底部弹出的popuwindow,像我这种渣渣android技术,能整出popuwindow但是整不出动画,百度之,记录一下。

    从下面这个地址转的 http://blog.csdn.net/yxhuang2008/article/details/42617805

    最近因为要用到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, 0, 0);  

            五、实现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.    

    运行的效果



  • 相关阅读:
    弹出框背景色透明滚动条滚动仍然居中
    日常css和js小知识点记录
    手机端上传未知图片大小,js设置宽高比例
    IE6兼容透明背景图
    css考核点整理(七)-css sprites技术的使用心得
    css考核点整理(六)-水平居中定位的几种方式
    css考核点整理(五)-css3新增的常用属性
    css考核点整理(四)-css盒模型
    css考核点整理(三)-css选择器的使用
    css考核点整理(二)-css层叠机制
  • 原文地址:https://www.cnblogs.com/Jerseyblog/p/6212010.html
Copyright © 2011-2022 走看看