android popwindow实现左侧弹出菜…

本文介绍如何使用 Android 的 PopupWindow 实现左侧弹出菜单效果,包括自定义视图、显示动画及点击外部区域隐藏等功能。
学习一下PopupWindow的浮层显示效果。
PopupWindow可以实现浮层效果,主要方法有:可以自定义view,通过LayoutInflator方法;可以出现和退出时显示动画;可以指定显示位置等。
为了将PopupWindow的多个功能展现并力求用简单的代码实现,编写了一个点击按钮左侧弹出菜单的功能,实现出现和退出时显示动画效果并点击其他区域时弹出层自动消失,效果图如下:
popwindow.png 
图-1 android 实现左侧弹出菜单的功能
源码:
1.PopwindowOnLeftActivity.java
  1. package com.pop.main;

  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.MotionEvent;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.view.View.OnTouchListener;
  8. import android.widget.Button;
  9. import android.widget.PopupWindow;

  10. public class PopwindowOnLeftActivity extends Activity {
  11. // 声明PopupWindow对象的引用
  12. private PopupWindow popupWindow;


  13. @Override
  14. public void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. // 点击按钮弹出菜单
  18. Button pop = (Button) findViewById(R.id.popBtn);
  19. pop.setOnClickListener(popClick);
  20. }
  21. //点击弹出左侧菜单的显示方式
  22. OnClickListener popClick = new OnClickListener() {

  23. @Override
  24. public void onClick(View v) {
  25. // TODO Auto-generated method stub
  26. getPopupWindow();
  27. // 这里是位置显示方式,在按钮的左下角
  28. popupWindow.showAsDropDown(v);
  29. // 这里可以尝试其它效果方式,如popupWindow.showAsDropDown(v,
  30. // (screenWidth-dialgoWidth)/2, 0);
  31. // popupWindow.showAtLocation(findViewById(R.id.layout),
  32. // Gravity.CENTER, 0, 0);
  33. }
  34. };


  35. protected void initPopuptWindow() {
  36. // TODO Auto-generated method stub

  37. // 获取自定义布局文件pop.xml的视图
  38. View popupWindow_view = getLayoutInflater().inflate(R.layout.pop, null,
  39. false);
  40. // 创建PopupWindow实例,200,150分别是宽度和高度
  41. popupWindow = new PopupWindow(popupWindow_view, 200, 150, true);
  42. // 设置动画效果
  43. popupWindow.setAnimationStyle(R.style.AnimationFade);
  44. //点击其他地方消失
  45. popupWindow_view.setOnTouchListener(new OnTouchListener() {
  46. @Override
  47. public boolean onTouch(View v, MotionEvent event) {
  48. // TODO Auto-generated method stub
  49. if (popupWindow != null && popupwindows.isShowing()) {
  50. popupWindow.dismiss();
  51. popupWindow = null;
  52. }
  53. return false;
  54. }
  55. });
  56. // pop.xml视图里面的控件
  57. Button open = (Button) popupWindow_view.findViewById(R.id.open);
  58. Button save = (Button) popupWindow_view.findViewById(R.id.save);
  59. Button close = (Button) popupWindow_view.findViewById(R.id.close);
  60. // pop.xml视图里面的控件触发的事件
  61. // 打开
  62. open.setOnClickListener(new OnClickListener() {
  63. @Override
  64. public void onClick(View v) {
  65. // TODO Auto-generated method stub
  66. // 这里可以执行相关操作
  67. System.out.println("打开操作");
  68. // 对话框消失
  69. popupWindow.dismiss();
  70. }
  71. });
  72. // 保存
  73. save.setOnClickListener(new OnClickListener() {
  74. @Override
  75. public void onClick(View v) {
  76. // TODO Auto-generated method stub
  77. // 这里可以执行相关操作
  78. System.out.println("保存操作");
  79. popupWindow.dismiss();
  80. }
  81. });
  82. // 关闭
  83. close.setOnClickListener(new OnClickListener() {
  84. @Override
  85. public void onClick(View v) {
  86. // TODO Auto-generated method stub
  87. // 这里可以执行相关操作
  88. System.out.println("关闭操作");
  89. popupWindow.dismiss();
  90. }
  91. });

  92. }

  93. private void getPopupWindow() {

  94. if (null != popupWindow) {
  95. popupWindow.dismiss();
  96. return;
  97. } else {
  98. initPopuptWindow();
  99. }
  100. }
  101. }
复制代码
主要界面
2.main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <Button android:id="@+id/popBtn"
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:text="@string/pop_left" />
  10. </LinearLayout>
复制代码
弹出层的布局
3.pop.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:background="@android:color/darker_gray">
  7. <Button android:id="@+id/open"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:background="@drawable/btn"
  11. android:text="@string/open"/>
  12. <Button android:id="@+id/save"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:background="@drawable/btn"
  16. android:text="@string/save"/>
  17. <Button android:id="@+id/close"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:background="@drawable/btn"
  21. android:text="@string/close"/>
  22. </LinearLayout>
复制代码
value下的style文件
4.style
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <style name="AnimationFade">
  4. <!--   PopupWindow左右弹出的效果-->
  5. <item name="android:windowEnterAnimation">@anim/in_lefttoright</item>
  6. <item name="android:windowExitAnimation">@anim/out_righttoleft</item>
  7. </style>
  8. </resources>
复制代码
value下的string文件
5.string.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string name="hello">Hello World, PopwindowOnLeftActivity!</string>
  4. <string name="app_name">PopwindowOnLeft</string>
  5. <string name="pop_left">弹出左侧菜单</string>
  6. <string name="open">打开</string>
  7. <string name="save">保存</string>
  8. <string name="close">关闭</string>
  9. </resources>
复制代码
anim目录下的文件
出现时从左往右的动画文件
6.in_lefttoright.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!-- 定义从左向右进入的动画 -->
  4. <translate
  5. android:fromXDelta="-100%"
  6. android:toXDelta="0"
  7. android:duration="500"/>
  8. </set>
复制代码
退出时从右往左消失的动画
7.out_righttoleft.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!-- 定义从右向左动画退出动画 -->
  4. <translate
  5. android:fromXDelta="0"
  6. android:toXDelta="-100%"
  7. android:duration="500"/>
  8. </set>
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值