分别用自定义PopupWindow和自定义Dialog实现下拉菜单

首先看下分别使用PopupWindow和Dialog实现的下拉菜单的不同之处:

PopupWindow:

Dialog:

由于之前用PopupWindow实现的效果不是太理想,并且弹出下拉菜单的时候背景透明度变化的也不是太好,后来改为Diaolog,项目中其他弹窗也都用的diaolog,便于更改背景透明度,整体看起来也比较统一.
下面把两种实现的方法都记录下来:
**第一种:自定义PopupWindow**

首先自定义一个PopWindow:

PopWindow.class:

public class PopWindow extends PopupWindow {

    private View.OnClickListener listener;
    private View view;
    private boolean clickOutSideClose = true;

    public PopWindow(Context mContext, View parent, int resid) {
        super(mContext);
        view = View
                .inflate(mContext, resid, null);
        setWidth(LinearLayout.LayoutParams.MATCH_PARENT);
        setHeight(LinearLayout.LayoutParams.MATCH_PARENT);
        setBackgroundDrawable(new ColorDrawable(0x44000000));
        this.setAnimationStyle(R.style.popwin_anim_style);
        setFocusable(true);
        setOutsideTouchable(true);
        setContentView(view);
        update();
        setClickDismiss();
    }

    public void clickOutSideClose(boolean b){
        clickOutSideClose = b;
    }
    public void setClickDismiss(){
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                if(clickOutSideClose)
                    dismiss();
            }
        });
    }

    public View getView(){
        return view;
    }
}

PopWindow的样式:

<style name="popwin_anim_style">
        <item name="android:windowEnterAnimation">@anim/pop_show</item>
        <item name="android:windowExitAnimation">@anim/pop_dismiss</item>
    </style>

PopWindow弹出和消失动画:

pop_show.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale android:fromXScale="0.6" android:toXScale="1.1"
        android:fromYScale="0.6" android:toYScale="1.1" android:pivotX="50%"
        android:pivotY="50%" android:duration="200" />
    <scale android:fromXScale="1.0" android:toXScale="0.91"
        android:fromYScale="1.0" android:toYScale="0.91" android:pivotX="50%"
        android:pivotY="50%" android:duration="400" android:delay="200" />
    <alpha android:interpolator="@android:anim/linear_interpolator"
        android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="400" />

</set>

pop_dismiss.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale android:fromXScale="1.0" android:toXScale="1.25"
        android:fromYScale="1.0" android:toYScale="1.25" android:pivotX="50%"
        android:pivotY="50%" android:duration="200" />
    <scale android:fromXScale="1.0" android:toXScale="0.48"
        android:fromYScale="1.0" android:toYScale="0.48" android:pivotX="50%"
        android:pivotY="50%" android:duration="400" android:delay="200" />
    <alpha android:interpolator="@android:anim/linear_interpolator"
        android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="400" />
</set>

点击上图中的”筛选”按钮,弹出PopWindow:

 /**
     * 点击筛选按钮
     */
    @OnClick(R.id.tv_sx)
    void clickIcon() {
        //弹出popwindow
        typePop = new PopWindow(getActivity(),tv_sx,R.layout.pop_filter);
        typePop.clickOutSideClose(true);
        typePop.showAsDropDown(tv_sx);
    }

说明:pop_filter为自己定义的下拉菜单的布局文件,这个在这里就不再贴出,大家可以自己根据需求写就行.

至此,就实现了自定义PopWindow弹出下拉菜单.

第二种:自定义Dialog

首先还是自定义一个名为AlertDialogCommon的自定义Dialog

AlertDialogCommon.class

public class AlertDialogCommon extends Dialog {

    private View rootView;
    private Context context;
    private int rid;

    public AlertDialogCommon(Context context, boolean cancelable, OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    public AlertDialogCommon(Context context, int rid) {
        super(context, R.style.dialog);
        this.context = context;
        this.rid = rid;
    }

    public void init(){
        rootView = LayoutInflater.from(context).inflate(rid,null);
        setContentView(rootView);
    }

    public void showDialog(){
        this.show();
        init();
    }

    public View getView(){
        return rootView;
    }
}

AlertDialogCommon的样式:

    <style name="dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item><!--边框 -->
        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上 -->
        <item name="android:windowIsTranslucent">true</item><!--半透明 -->
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowAnimationStyle">@style/popwin_anim_style</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:backgroundDimAmount">0.4</item>
        <item name="android:windowBackground">@color/transparent</item>
    </style>

动画样式:

<style name="popwin_anim_style">
        <item name="android:windowEnterAnimation">@anim/pop_show</item>
        <item name="android:windowExitAnimation">@anim/pop_dismiss</item>
    </style>

动画样式中的弹出(pop_show)和消失(pop_dismiss)动画跟上面PopWindow中的一致,这里就不再累赘.

点击上图中的”筛选”按钮,弹出Diaolog:

  /**
     * 点击筛选按钮
     */
    @OnClick(R.id.tv_sx)
    void clickIcon() {
        //弹出popwindow
            typePop = new AlertDialogCommon(getActivity(), R.layout.pop_filter);
        Window dialogWindow = typePop.getWindow();
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP);
        lp.x = Tools.getScreenWidth(getActivity())-lp.width-10;// dialog窗口 X坐标
        lp.y = llType.getHeight()+llSearch.getHeight(); // dialog窗口 Y坐标
        dialogWindow.setAttributes(lp);
        typePop.showDialog();
    }

获取屏幕宽度的工具类:

public class Tools{
    /**
     * 获取屏幕宽度
     * @param context
     * @return
     */
    public static int getScreenWidth(Context context){
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        int screenWidth = wm.getDefaultDisplay().getWidth();//屏幕宽度
        return screenWidth;
    }
}

说明:想要把Dialog显示在”筛选”按钮下面,需要计算dialog窗口的坐标,这里dialog的x坐标为屏幕宽度减去dialog布局的宽度再减去10,减10是为了dialog右侧紧贴屏幕,不美观.dialog的高度y坐标为上图中所示的”名企大厂 本地就业”标题栏的高度和”搜索框”的高度相加,不用考虑状态栏的高度.

至此,用自定义Dialog实现了下拉菜单.

dialog的好处在于背景透明度在dialog弹出时可以均匀的变化,并且直接就可以覆盖整个屏幕,显示效果稍好一些.

时间: 2024-10-26 09:35:12

分别用自定义PopupWindow和自定义Dialog实现下拉菜单的相关文章

Android 自定义对话框,进度条,下拉刷新等

这个demo集合了自定义对话框,进度条,下拉刷新以及popup弹出框等.是学习了网上开源项目后,抽取集合了常用对话框,进度条,下拉刷新以及popup弹出框等.现在结构目录简单,更易于学习和扩展使用.注释都卸载代码.下面进行简单的介绍以及部分代码展示. 本文demo下载:点击 1.整体实现的效果图 2.项目结构图 这上面项目结构图也是一目了然,有什么功能展示.大家也看到了,这上面类有点多,如果全部贴出来,不大可能,有兴趣下载本文源码. 3.看看基础类BaseActivity 我就贴一下基础类,还有

Android之——自定义下拉菜单的实现

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48101651 做过Android开发的童鞋,一般都会遇到这样一种情况,就是Android中原有的下拉控件Spinner过于单调和简单,不能够满足我们实际开发的需求了,这时候就需要我们自己自定义下拉菜单来实现相应的功能,那么,如何实现自定义下拉菜单呢?下面我就来和大家一起实现这个功能. 一.原理 我们这个下拉菜单展示的内容主要以ListView实现,在界面上放置一个文本框,文本框右

iOS 下拉菜单 FFDropDownMenu自定义下拉菜单样式实战-b

Demo地址:https://github.com/chenfanfang/CollectionsOfExampleFFDropDownMenu框架地址:https://github.com/chenfanfang/FFDropDownMenu 老样子,先附上两张效果图 customMenuStyle.gif customMenuStyle.png 首先自定义一个继承于FFDropDownMenuBasedModel的菜单模型.h文件 #import <FFDropDownMenuBasedMo

IOS第二天-新浪微博 - 添加搜索框,弹出下拉菜单 ,代理的使用 ,HWTabBar.h(自定义TabBar)

********HWDiscoverViewController.m(发现) - (void)viewDidLoad { [super viewDidLoad]; // 创建搜索框对象 HWSearchBar *searchBar = [HWSearchBar searchBar]; searchBar.width = 300; searchBar.height = 30; self.navigationItem.titleView = searchBar; //设置titleView 是搜索框

jQuery宽屏下拉菜单导航 子菜单可自定义

jQuery是一款流行已久的Javascript框架,确实很好用.今天我们要介绍一款用jQuery实现的下拉菜单导航插件,下拉菜单的外观是仿腾讯云官网菜单的.鼠标滑过主菜单时,即可展开二级下拉子菜单.值得注意的是,这款jQuery下拉菜单的子菜单内容可以自定义,因此也非常灵活. 访问地址:http://www.xuecss3.com/jquery-10-757-1.html 另外分享一个FQ软件:下载地址  http://www.xuecss3.com/qianduan-9-374-1.html

css自定义下拉菜单,通过伪类控制展开隐藏

公司最近要做组件库,一些单选框,复选框,下拉菜单都需要美观自定义, 闲余时间做了一个(对浏览器要求较高的)下拉菜单的组件. /*********实现功能 start **************/ 通过css伪类:focus实现下拉菜单基本功能 select: 点击菜单(动画过渡)展开,再次点击(动画过渡)收起; 并保证点击页面空白处和选择option同样(动画过渡)收起菜单. option: 限制5条内容的高度,超出则滚动条,反之则自适应高度; /***********实现功能end*****

JS自定义下拉菜单select

由于系统自定的select样式的确丑到爆,所以抽空写了这么一个可以自定义下拉菜单样式的插件, 思路就是隐藏select,用一个span标签显示内容,ul标签显示下拉列表,如图: IE下存在一个BUG,设置overflow-y后,IE下设置width无效,只测试了IE9,其他版本未测试,当然如果能加入自定义样式的滚动条就完美了,时间关系以后再补吧 代码如下: 1 //自定义dropdownlist的样式, 2 //classname为模拟出来的span标签样式 3 //ulClass为下拉列表样式

angular 实现自定义样式下拉菜单

自己闲着没事写了一个自定义的下拉菜单希望和大家交流一下!望能和大神们成为朋友. 下面上代码: <!doctype html> <html lang="en" ng-app='App'> <head> <meta charset="UTF-8"> <title>Document</title> <script src='../angular-1.3.9/angular.js'><

[k]自定义样式下拉菜单

自定义样式下拉菜单-1 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title> 自定义样式下拉菜单1 </title> 6 <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script> 7 <s