`
phenom
  • 浏览: 409365 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

使用PopupWindow优化显示效果

 
阅读更多
在ListView里点击项弹出Dialog这样的状况是比较常见的,但当一个按钮在视图的左上方,点击出现管理菜单时,如果也有Dialog显示,第一,觉得比较丑,第二还得设置ListView项,或其它的东西,它还有一层灰色遮罩层遮住下面的内容,于是我就用了PopupWindow来处理。
用PopupWindow有一个问题,当你想要它关闭时,通常会想像Dialog那样,在它的范围外点击也关闭,所以要在Activity里面添加一些代码:
@Override
     public boolean dispatchTouchEvent(MotionEvent event) {
         if (mPopupWindow==null||!mPopupWindow.isShowing()) {
             return super.dispatchTouchEvent(event);
         }
         boolean isOut=isOutOfBounds(event);
         Log.d(TAG, "isOut:"+isOut+" event.getAction():"+event.getAction());
         if (event.getAction()==MotionEvent.ACTION_DOWN&&isOut) {
             mPopupWindow.dismiss();
             return true;
         }

         return false;
     }

     /**
      * 计算是否在PopupWindow外面点击
      *
      * @param event
      * @return
      */
     private boolean isOutOfBounds(MotionEvent event) {
         final int x=(int) event.getX();
         final int y=(int) event.getY();
         final int slop=ViewConfiguration.get(Activity2.this).getScaledWindowTouchSlop();
         final View decorView=mPopupWindow.getContentView();
         return (x<-slop)||(y<-slop)
             ||(x>(decorView.getWidth()+slop))
             ||(y>(decorView.getHeight()+slop));
     }

 Activity2里面有mPopupWindow。

这样就可以了,当你点击PopupWindow外的区域,会关闭的,注意有一点,如果使用ActivityGroup,在切换标签时,有时不会关闭,所以我只能在onPause里把它手动关闭了。

剩下的就是PopupWindow了,用这个词搜索,多数的代码总是有那么一段是相同的,而且没有讲到重点。
点击左右上方的按钮,调用显示PopupWindow:
private void showPopupWindow(View parent) {
        if (null==mPopupWindow) {
            initPopuptWindow();
        }

        if (groupId==-1||groupId==-2) {
            editGroup.setVisibility(View.GONE);
            addGroupMember.setVisibility(View.GONE);
            delGroupMember.setVisibility(View.GONE);
            delGroup.setVisibility(View.GONE);
        } else {
            editGroup.setVisibility(View.VISIBLE);
            addGroupMember.setVisibility(View.VISIBLE);
            delGroupMember.setVisibility(View.VISIBLE);
            delGroup.setVisibility(View.VISIBLE);
        }
        mPopupWindow.showAsDropDown(parent);
parent就是点击的按钮,showAsDropDown这个方法会自动计算显示的位置在parent下面。
    }

private void initPopuptWindow() {
        View popupWindow_view=getLayoutInflater().inflate(
            R.layout.popup_win, null, false);

        mPopupWindow=new PopupWindow(popupWindow_view);
        mPopupWindow.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);

这点很重要,如果你用的是PopupWindow(width,height)这样的构造方法,出现的东西就是固定高宽的,显示不是所需要的。设置这样的布局参数后,会自动处理布局的大小。

        //mPopupWindow.setOutsideTouchable(false); 这句似乎没有太多效果,查看源码,没发现什么好处。

        addContact=(Button) popupWindow_view.findViewById(R.id.add_contact);
        addGroup=(Button) popupWindow_view.findViewById(R.id.add_group);
        editGroup=(Button) popupWindow_view.findViewById(R.id.edit_group);
        addGroupMember=(Button) popupWindow_view.findViewById(R.id.add_group_member);
        delGroupMember=(Button) popupWindow_view.findViewById(R.id.del_group_member);
        delGroup=(Button) popupWindow_view.findViewById(R.id.del_group);
        
        addContact.setOnClickListener(popupItemClickListener);
        addGroup.setOnClickListener(popupItemClickListener);
        editGroup.setOnClickListener(popupItemClickListener);
        addGroupMember.setOnClickListener(popupItemClickListener);
        delGroupMember.setOnClickListener(popupItemClickListener);
        delGroup.setOnClickListener(popupItemClickListener);
    }

然后就是一个监听器了:
mPopupWindow.dismiss();
            switch (view.getId()){
                case R.id.add_contact: //添加
                    break;
                
                case R.id.add_group:  //创建
                    break;
}
、。。。。。。。。。。
}

这样处理有点傻,因为我的布局文件 里存着固定的按钮。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:gravity="center"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:background="@drawable/management_menu_bg" android:layout_margin="0dip">

    <Button android:id="@+id/add_contact" android:textColor="@color/white"
        android:text="@string/add_contact" android:background="@drawable/popup_bg"
        android:layout_width="wrap_content" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/add_group" android:textColor="@color/white"
        android:text="@string/add_group" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/edit_group" android:textColor="@color/white"
        android:text="@string/edit_group_name" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/add_group_member" android:textColor="@color/white"
        android:text="@string/group_add_member" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/del_group_member" android:textColor="@color/white"
        android:text="@string/group_del_member" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>

    <Button android:id="@+id/del_group" android:textColor="@color/white"
        android:text="@string/del_group" android:background="@drawable/popup_bg"
        android:layout_width="fill_parent" android:layout_height="36dip"
        android:padding="4dip"/>
</LinearLayout>  

因为功能相对固定,所以一次性把所有的按钮添加到布局文件中,在初始化时控制着显示与隐藏了。有点弱弱。
效果图如下:

  • 大小: 36.8 KB
分享到:
评论
1 楼 Will.Du 2013-07-05  
dialog背景可以设为全透明。。。。

相关推荐

    PopupWindow全屏显示以及适配不同手机屏幕之 应用实例 更换头像,拍照,相册选取附带动画效果

    在这个应用实例中,我们主要探讨如何将PopupWindow设置为全屏显示,适配不同手机屏幕,以及在更换头像过程中结合拍照、相册选取和动画效果。 首先,让我们详细了解PopupWindow的基本使用。PopupWindow类提供了创建...

    popupwindow中显示listview自适配

    在Android开发中,PopupWindow是一个非常实用的组件,它能够创建一种浮现在当前界面之上的小型窗口,常用于实现下拉菜单、快捷操作等效果。本文将深入探讨如何在PopupWindow中显示一个自适应的ListView,使内容可以...

    自定义PopupWindow动画效果

    本篇将详细探讨如何实现自定义的PopupWindow动画效果,以及如何通过源码理解和工具进行优化。 首先,PopupWindow的基本用法包括设置内容视图、宽高、显示位置等。然而,为了增加用户体验,我们往往希望在...

    PopupWindow

    3. 使用showAsDropDown或showAtLocation方法来显示PopupWindow,指定相对于某个View的位置。 在上述描述中,PopupWindow与EditText的交互可以通过监听EditText的焦点变化来实现。这涉及到对EditText添加FocusChange...

    popupwindow使用

    PopupWindow是Android开发中一种常用的UI组件,它用于在屏幕上的任意位置弹出一个窗口,通常用来显示一些临时的信息或者提供交互操作。本教程将深入探讨PopupWindow的基本使用,并结合ListView展示其实战应用。 ...

    博客《 PopUpWindow使用详解(一)——基本使用》对应源码

    PopupWindow的背景可以通过`setBackgroundDrawable()`来改变,动画效果可以使用Transition动画或者自定义动画。关闭策略通常通过监听PopupWindow的触摸事件或外部点击事件来实现,例如: ```java popupWindow....

    使用PopupWindow实现页面点击顶部弹出下拉菜单

    在Android开发中,`...当然,你可以根据需求进一步定制`PopupWindow`,比如添加更多交互逻辑、调整动画效果、优化性能等。`PopupWindow`是一个非常灵活的组件,熟练掌握它的使用将对你的Android开发工作大有裨益。

    popupwindow按钮交替效果

    6. **代码优化**: 为了提高代码的可维护性和复用性,可以将PopupWindow的创建和动画逻辑封装成一个工具类或单独的组件。这样,在其他地方需要类似功能时,可以直接复用。 此外,如果你有其他的实现方案或者想进一步...

    popupwindow动画

    在实际开发中,我们还可以结合使用多种动画效果,比如同时进行缩放和平移动画,让PopupWindow看起来更加自然。另外,可以利用`AnimatorSet`来组合多个动画,使其按照特定顺序执行。 除了直接在PopupWindow上应用...

    android自定义popupwindow仿微信右上角弹出菜单效果

    本文将详细介绍如何使用`PopupWindow`在Android应用中模仿微信右上角的弹出菜单效果。 首先,我们需要理解`PopupWindow`的基本用法。`PopupWindow` 是一个可以在屏幕任意位置显示的窗口,它不依附于任何Activity,...

    PopupWindow和ListView配合使用

    在Android开发中,`PopupWindow`和`ListView`是两种常用组件,它们结合使用可以创建出丰富的交互式界面。`PopupWindow`是一个可以显示在任意位置的浮动窗口,而`ListView`则是一种可滚动的视图,用于展示大量数据。...

    PopupWindow嵌套Demo

    PopupWindow在Android开发中是一种非常常用的轻量级弹窗组件,它...在实际项目中,不断实践和优化,将使你的PopupWindow使用更加得心应手。在PopupWindowDemo中,你可以找到具体的代码示例,帮助理解并掌握这些知识点。

    使用PopupWindow + 2个ListView实现仿 美团/淘宝/百度糯米 多级分类菜单效果

    - **动画效果**:为`PopupWindow`的显示和消失添加平滑的动画效果,提升用户体验。 - **适配不同设备**:确保`PopupWindow`的大小和位置能在不同尺寸和方向的屏幕上正确显示。 - **触摸事件处理**:处理触摸事件,...

    自定义popupWindow修改版

    通过不断的实践和优化,我们可以创造出符合用户需求、具有良好交互体验的PopupWindow。对于这个“自定义popupWindow修改版”,开发者可以通过查看源代码,理解并借鉴其中的设计思路,以提升自己的Android开发能力。

    安卓QQ相关相关-实现类似QQ风格的popupwindow弹出窗效果出现时有遮挡图层消失时无遮挡图层.rar

    6. **处理动画**:为了增强用户体验,你可以为PopupWindow的显示和消失添加动画效果,如淡入淡出、滑动等。可以使用Animation类或Transition类来实现。 7. **事件监听**:确保PopupWindow的关闭事件能够正确触发,...

    一个不错的PopupWindow源码

    通过学习和研究这个源码,开发者不仅可以掌握PopupWindow的基本用法,还能了解到如何优化用户体验,例如添加动画效果,处理触摸事件等。这对于提升Android开发技能,尤其是对于界面交互设计的理解非常有帮助。

Global site tag (gtag.js) - Google Analytics