Android-自定义PopupWindow


PopupWindow在应用中应该是随处可见的,很常用到,比如在旧版本的微信当中就用到下拉的PopupWindow,那是自定义的。新版微信5.2的ActionBar,有人已经模仿了它,但微信具体是使用了ActionBar还是其他的笔者倒是不太清楚,本篇博客主要介绍如何自定义一个PopupWindow来供自己在开发应用时使用。因为笔者最近在开发一款应用时用到这个知识点,所以自己实现了类似新版微信的效果。 源码下载:http://download.csdn.net/detail/wwj_748/7337175 效果图如下: 首先从布局开始 /14_CustomPopupWindow/res/layout/activity_swipe.xml
[html]view plaincopy
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/animation_layout_content"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:clickable="true"
  6. android:orientation="vertical">
  7. <RelativeLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:background="@drawable/abc_ab_bottom_solid_dark_holo"
  11. android:padding="12dip">
  12. <LinearLayout
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_alignParentLeft="true"
  16. android:gravity="center"
  17. android:orientation="horizontal">
  18. <ImageView
  19. android:layout_width="30dp"
  20. android:layout_height="30dp"
  21. android:src="@drawable/ic_launcher"/>
  22. <TextView
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:layout_marginLeft="10dip"
  26. android:text="任务系统"
  27. android:textColor="@color/lightgray"
  28. android:textSize="18sp"/>
  29. </LinearLayout>
  30. <LinearLayout
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:layout_alignParentRight="true"
  34. android:gravity="center"
  35. android:orientation="horizontal">
  36. <Button
  37. android:id="@+id/btnSearch"
  38. android:layout_width="30dp"
  39. android:layout_height="30dp"
  40. android:layout_marginRight="20dip"
  41. android:background="@drawable/actionbar_search_icon"
  42. android:visibility="gone"/>
  43. <Button
  44. android:id="@+id/btnAdd"
  45. android:layout_width="30dp"
  46. android:layout_height="30dp"
  47. android:layout_marginRight="20dip"
  48. android:background="@drawable/actionbar_add_icon"/>
  49. <Button
  50. android:id="@+id/btnSet"
  51. android:layout_width="30dp"
  52. android:layout_height="30dp"
  53. android:background="@drawable/actionbar_more_icon"/>
  54. </LinearLayout>
  55. </RelativeLayout>
  56. </LinearLayout>

/14_CustomPopupWindow/res/layout/add_popup_dialog.xml
[html]view plaincopy
  1. <precode_snippet_id="341527"snippet_file_name="blog_20140512_2_2271724"name="code"class="html"><?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:gravity="center_horizontal"
  6. android:orientation="vertical">
  7. <LinearLayout
  8. android:id="@+id/pop_layout2"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_alignParentRight="true"
  12. android:layout_alignParentTop="true"
  13. android:background="@drawable/abc_ab_bottom_solid_dark_holo"
  14. android:gravity="center_horizontal"
  15. android:orientation="vertical">
  16. <LinearLayout
  17. android:id="@+id/add_task_layout"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:orientation="horizontal"
  21. android:padding="8dp">
  22. <ImageView
  23. android:layout_width="35dp"
  24. android:layout_height="35dp"
  25. android:scaleType="fitCenter"
  26. android:src="@drawable/ofm_add_icon"/>
  27. <TextView
  28. android:layout_width="wrap_content"
  29. android:layout_height="fill_parent"
  30. android:layout_marginLeft="10dp"
  31. android:gravity="center"
  32. android:text="添加任务"
  33. android:textColor="@color/white"
  34. android:textSize="15dip"/>
  35. </LinearLayout>
  36. <TextView
  37. android:layout_width="fill_parent"
  38. android:layout_height="0.2dp"
  39. android:background="@color/black"/>
  40. <LinearLayout
  41. android:id="@+id/team_member_layout"
  42. android:layout_width="fill_parent"
  43. android:layout_height="wrap_content"
  44. android:orientation="horizontal"
  45. android:padding="8dp">
  46. <ImageView
  47. android:layout_width="35dp"
  48. android:layout_height="35dp"
  49. android:scaleType="fitCenter"
  50. android:src="@drawable/ofm_profile_icon"/>
  51. <TextView
  52. android:layout_width="wrap_content"
  53. android:layout_height="fill_parent"
  54. android:layout_marginLeft="10dp"
  55. android:gravity="center"
  56. android:text="团队成员"
  57. android:textColor="@color/white"
  58. android:textSize="15dip"/>
  59. </LinearLayout>
  60. </LinearLayout>
  61. </RelativeLayout></pre><br><br>
/14_CustomPopupWindow/res/layout/more_popup_dialog.xml
[html]view plaincopy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:gravity="center_horizontal"
  6. android:orientation="vertical">
  7. <LinearLayout
  8. android:id="@+id/pop_layout"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_alignParentRight="true"
  12. android:layout_alignParentTop="true"
  13. android:background="@drawable/abc_ab_bottom_solid_dark_holo"
  14. android:gravity="center_horizontal"
  15. android:orientation="vertical">
  16. <LinearLayout
  17. android:layout_width="fill_parent"
  18. android:layout_height="wrap_content"
  19. android:orientation="horizontal"
  20. android:padding="8dp">
  21. <ImageView
  22. android:layout_width="50dp"
  23. android:layout_height="50dp"
  24. android:src="@drawable/defalt_head"/>
  25. <LinearLayout
  26. android:layout_width="fill_parent"
  27. android:layout_height="wrap_content"
  28. android:gravity="left|center_horizontal"
  29. android:orientation="vertical"
  30. android:padding="5dp">
  31. <TextView
  32. android:layout_width="fill_parent"
  33. android:layout_height="wrap_content"
  34. android:text="wwj"
  35. android:textColor="@color/white"
  36. android:textSize="15sp"/>
  37. <TextView
  38. android:layout_width="fill_parent"
  39. android:layout_height="wrap_content"
  40. android:text="whatswwj"
  41. android:textColor="@color/green"
  42. android:textSize="15sp"/>
  43. </LinearLayout>
  44. </LinearLayout>
  45. <TextView
  46. android:layout_width="fill_parent"
  47. android:layout_height="0.2dp"
  48. android:background="@color/black"/>
  49. <LinearLayout
  50. android:layout_width="fill_parent"
  51. android:layout_height="wrap_content"
  52. android:orientation="horizontal"
  53. android:padding="8dp">
  54. <ImageView
  55. android:layout_width="35dp"
  56. android:layout_height="35dp"
  57. android:scaleType="fitCenter"
  58. android:src="@drawable/ofm_photo_icon"/>
  59. <TextView
  60. android:layout_width="wrap_content"
  61. android:layout_height="fill_parent"
  62. android:layout_marginLeft="10dp"
  63. android:gravity="center"
  64. android:text="我的相册"
  65. android:textColor="@color/white"
  66. android:textSize="15sp"/>
  67. </LinearLayout>
  68. <TextView
  69. android:layout_width="fill_parent"
  70. android:layout_height="0.2dp"
  71. android:background="@color/black"/>
  72. <LinearLayout
  73. android:layout_width="fill_parent"
  74. android:layout_height="wrap_content"
  75. android:orientation="horizontal"
  76. android:padding="8dp"
  77. android:visibility="gone">
  78. <ImageView
  79. android:layout_width="35dp"
  80. android:layout_height="35dp"
  81. android:scaleType="fitCenter"
  82. android:src="@drawable/ofm_collect_icon"/>
  83. <TextView
  84. android:layout_width="wrap_content"
  85. android:layout_height="fill_parent"
  86. android:layout_marginLeft="10dp"
  87. android:gravity="center"
  88. android:text="我的收藏"
  89. android:textColor="@color/white"
  90. android:textSize="15sp"/>
  91. </LinearLayout>
  92. <TextView
  93. android:layout_width="fill_parent"
  94. android:layout_height="0.2dp"
  95. android:background="@color/black"/>
  96. <LinearLayout
  97. android:layout_width="fill_parent"
  98. android:layout_height="wrap_content"
  99. android:orientation="horizontal"
  100. android:padding="8dp"
  101. android:visibility="gone">
  102. <ImageView
  103. android:layout_width="35dp"
  104. android:layout_height="35dp"
  105. android:scaleType="fitCenter"
  106. android:src="@drawable/ofm_card_icon"/>
  107. <TextView
  108. android:layout_width="wrap_content"
  109. android:layout_height="fill_parent"
  110. android:layout_marginLeft="10dp"
  111. android:gravity="center"
  112. android:text="我的银行卡"
  113. android:textColor="@color/white"
  114. android:textSize="15sp"/>
  115. </LinearLayout>
  116. <TextView
  117. android:layout_width="fill_parent"
  118. android:layout_height="0.2dp"
  119. android:background="@color/black"
  120. android:visibility="gone"/>
  121. <LinearLayout
  122. android:layout_width="fill_parent"
  123. android:layout_height="wrap_content"
  124. android:orientation="horizontal"
  125. android:padding="8dp">
  126. <ImageView
  127. android:layout_width="35dp"
  128. android:layout_height="35dp"
  129. android:scaleType="fitCenter"
  130. android:src="@drawable/ofm_setting_icon"/>
  131. <TextView
  132. android:layout_width="wrap_content"
  133. android:layout_height="fill_parent"
  134. android:layout_marginLeft="10dp"
  135. android:gravity="center"
  136. android:text="设置"
  137. android:textColor="@color/white"
  138. android:textSize="15sp"/>
  139. </LinearLayout>
  140. <TextView
  141. android:layout_width="fill_parent"
  142. android:layout_height="0.2dp"
  143. android:background="@color/black"/>
  144. <LinearLayout
  145. android:layout_width="fill_parent"
  146. android:layout_height="wrap_content"
  147. android:orientation="horizontal"
  148. android:padding="8dp">
  149. <ImageView
  150. android:layout_width="35dp"
  151. android:layout_height="35dp"
  152. android:scaleType="fitCenter"
  153. android:src="@drawable/ofm_blacklist_icon"/>
  154. <Button
  155. android:id="@+id/btn_cancel"
  156. android:layout_width="wrap_content"
  157. android:layout_height="fill_parent"
  158. android:layout_marginLeft="10dp"
  159. android:background="@null"
  160. android:gravity="center"
  161. android:text="退出登录"
  162. android:textColor="@color/white"
  163. android:textSize="15sp"/>
  164. </LinearLayout>
  165. </LinearLayout>
  166. </RelativeLayout>

以上分别是主页面和两个popupWindow布局 下面自定义两个PopupWindow,自己封装自己想要的PopuoWindow,这里只是给出示例 /14_CustomPopupWindow/src/com/wwj/popupwindow/AddPopWindow.java
[java]view plaincopy
  1. packagecom.wwj.popupwindow;
  2. importandroid.app.Activity;
  3. importandroid.content.Context;
  4. importandroid.graphics.drawable.ColorDrawable;
  5. importandroid.view.LayoutInflater;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.view.ViewGroup.LayoutParams;
  9. importandroid.widget.LinearLayout;
  10. importandroid.widget.PopupWindow;
  11. /**
  12. *自定义popupWindow
  13. *
  14. *@authorwwj
  15. *
  16. *
  17. */
  18. publicclassAddPopWindowextendsPopupWindow{
  19. privateViewconentView;
  20. publicAddPopWindow(finalActivitycontext){
  21. LayoutInflaterinflater=(LayoutInflater)context
  22. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  23. conentView=inflater.inflate(R.layout.add_popup_dialog,null);
  24. inth=context.getWindowManager().getDefaultDisplay().getHeight();
  25. intw=context.getWindowManager().getDefaultDisplay().getWidth();
  26. //设置SelectPicPopupWindow的View
  27. this.setContentView(conentView);
  28. //设置SelectPicPopupWindow弹出窗体的宽
  29. this.setWidth(w/2+50);
  30. //设置SelectPicPopupWindow弹出窗体的高
  31. this.setHeight(LayoutParams.WRAP_CONTENT);
  32. //设置SelectPicPopupWindow弹出窗体可点击
  33. this.setFocusable(true);
  34. this.setOutsideTouchable(true);
  35. //刷新状态
  36. this.update();
  37. //实例化一个ColorDrawable颜色为半透明
  38. ColorDrawabledw=newColorDrawable(0000000000);
  39. //点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener,设置其他控件变化等操作
  40. this.setBackgroundDrawable(dw);
  41. //mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
  42. //设置SelectPicPopupWindow弹出窗体动画效果
  43. this.setAnimationStyle(R.style.AnimationPreview);
  44. LinearLayoutaddTaskLayout=(LinearLayout)conentView
  45. .findViewById(R.id.add_task_layout);
  46. LinearLayoutteamMemberLayout=(LinearLayout)conentView
  47. .findViewById(R.id.team_member_layout);
  48. addTaskLayout.setOnClickListener(newOnClickListener(){
  49. @Override
  50. publicvoidonClick(Viewarg0){
  51. AddPopWindow.this.dismiss();
  52. }
  53. });
  54. teamMemberLayout.setOnClickListener(newOnClickListener(){
  55. @Override
  56. publicvoidonClick(Viewv){
  57. AddPopWindow.this.dismiss();
  58. }
  59. });
  60. }
  61. /**
  62. *显示popupWindow
  63. *
  64. *@paramparent
  65. */
  66. publicvoidshowPopupWindow(Viewparent){
  67. if(!this.isShowing()){
  68. //以下拉方式显示popupwindow
  69. this.showAsDropDown(parent,parent.getLayoutParams().width/2,18);
  70. }else{
  71. this.dismiss();
  72. }
  73. }
  74. }


/14_CustomPopupWindow/src/com/wwj/popupwindow/MorePopWindow.java
[java]view plaincopy
  1. packagecom.wwj.popupwindow;
  2. importandroid.app.Activity;
  3. importandroid.content.Context;
  4. importandroid.graphics.drawable.ColorDrawable;
  5. importandroid.view.LayoutInflater;
  6. importandroid.view.View;
  7. importandroid.view.ViewGroup.LayoutParams;
  8. importandroid.widget.PopupWindow;
  9. publicclassMorePopWindowextendsPopupWindow{
  10. privateViewconentView;
  11. publicMorePopWindow(finalActivitycontext){
  12. LayoutInflaterinflater=(LayoutInflater)context
  13. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  14. conentView=inflater.inflate(R.layout.more_popup_dialog,null);
  15. inth=context.getWindowManager().getDefaultDisplay().getHeight();
  16. intw=context.getWindowManager().getDefaultDisplay().getWidth();
  17. //设置SelectPicPopupWindow的View
  18. this.setContentView(conentView);
  19. //设置SelectPicPopupWindow弹出窗体的宽
  20. this.setWidth(w/2+50);
  21. //设置SelectPicPopupWindow弹出窗体的高
  22. this.setHeight(LayoutParams.WRAP_CONTENT);
  23. //设置SelectPicPopupWindow弹出窗体可点击
  24. this.setFocusable(true);
  25. this.setOutsideTouchable(true);
  26. //刷新状态
  27. this.update();
  28. //实例化一个ColorDrawable颜色为半透明
  29. ColorDrawabledw=newColorDrawable(0000000000);
  30. //点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener,设置其他控件变化等操作
  31. this.setBackgroundDrawable(dw);
  32. //mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
  33. //设置SelectPicPopupWindow弹出窗体动画效果
  34. this.setAnimationStyle(R.style.AnimationPreview);
  35. }
  36. publicvoidshowPopupWindow(Viewparent){
  37. if(!this.isShowing()){
  38. this.showAsDropDown(parent,parent.getLayoutParams().width/2,18);
  39. }else{
  40. this.dismiss();
  41. }
  42. }
  43. }


上面用到一个动画样式效果: /14_CustomPopupWindow/res/values/styles.xml
[html]view plaincopy
  1. <stylename="AnimationPreview">
  2. <itemname="android:windowEnterAnimation">@anim/fade_in</item>
  3. <itemname="android:windowExitAnimation">@anim/fade_out</item>
  4. </style>

用到两个动画资源 /14_CustomPopupWindow/res/anim/fade_in.xml
[html]view plaincopy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <!--左上角扩大-->
  3. <scalexmlns:android="http://schemas.android.com/apk/res/android"
  4. android:interpolator="@android:anim/accelerate_decelerate_interpolator"
  5. android:fromXScale="0.001"
  6. android:toXScale="1.0"
  7. android:fromYScale="0.001"
  8. android:toYScale="1.0"
  9. android:pivotX="100%"
  10. android:pivotY="10%"
  11. android:duration="200"/>

/14_CustomPopupWindow/res/anim/fade_out.xml
[html]view plaincopy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <!--左上角缩小-->
  3. <scalexmlns:android="http://schemas.android.com/apk/res/android"
  4. android:interpolator="@android:anim/accelerate_decelerate_interpolator"
  5. android:fromXScale="1.0"
  6. android:toXScale="0.001"
  7. android:fromYScale="1.0"
  8. android:toYScale="0.001"
  9. android:pivotX="100%"
  10. android:pivotY="10%"
  11. android:duration="200"/>


/14_CustomPopupWindow/src/com/wwj/popupwindow/MainActivity.java
[java]view plaincopy
  1. packagecom.wwj.popupwindow;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.view.View;
  5. importandroid.view.View.OnClickListener;
  6. importandroid.widget.Button;
  7. publicclassMainActivityextendsActivityimplementsOnClickListener{
  8. privateButtonsetButton;
  9. privateButtonaddButton;
  10. @Override
  11. protectedvoidonCreate(BundlesavedInstanceState){
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_swipe);
  14. setButton=(Button)findViewById(R.id.btnSet);
  15. addButton=(Button)findViewById(R.id.btnAdd);
  16. setButton.setOnClickListener(this);
  17. addButton.setOnClickListener(this);;
  18. }
  19. @Override
  20. publicvoidonClick(Viewv){
  21. switch(v.getId()){
  22. caseR.id.btnSet:
  23. MorePopWindowmorePopWindow=newMorePopWindow(MainActivity.this);
  24. morePopWindow.showPopupWindow(setButton);
  25. break;
  26. caseR.id.btnSearch:
  27. break;
  28. caseR.id.btnAdd:
  29. AddPopWindowaddPopWindow=newAddPopWindow(MainActivity.this);
  30. addPopWindow.showPopupWindow(addButton);
  31. break;
  32. default:
  33. break;
  34. }
  35. }
  36. }

以上是代码实现,具体可以下载源码参考。 优质内容筛选与推荐>>
1、PHP 获取网页所有连接
2、黑马程序员 Java高新技术---枚举
3、unittest学习
4、常用的一些基础工具类
5、Uva 10608 Friends


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn