美文网首页高级UI
掌握Popupwindow实现弹出列表效果及自定义效果

掌握Popupwindow实现弹出列表效果及自定义效果

作者: 郑_S_W | 来源:发表于2019-07-25 17:18 被阅读0次

    1、PopupWindow与AlertDialog的区别

    PopupWindow和AlertDialog很相似,都是一个悬浮的窗口遮挡在当前页面,但是它们是有区别的,最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加灵活。

    2.显示函数 image.png

    3.设置点击外部消失PopupWindow

    //必须先设置背景
    popupWindow.setBackgroundDrawable(null);
    popupWindow.setOutsideTouchable(true);
    

    4.为菜单添加阴影(了解)

    View inflate = LayoutInflater.from(this).inflate(R.layout.pop, null, false);
    final PopupWindow popupWindow = new PopupWindow(inflate, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    inflate.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
               popupWindow.dismiss();
             }
        });
    //popupWindow.setBackgroundDrawable(null);
    popupWindow.setOutsideTouchable(true);
    WindowManager.LayoutParams attributes = getWindow().getAttributes();
    attributes.alpha = 0.3f;
    getWindow().addFlags(WindowManager.LayoutParams.FLAGS_CHANGED);
    getWindow().setAttributes(attributes);
    popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
          @Override
         public void onDismiss() {
              WindowManager.LayoutParams attributes = getWindow().getAttributes();
              attributes.alpha = 1.0f;
              getWindow().addFlags(WindowManager.LayoutParams.FLAGS_CHANGED);
              getWindow().setAttributes(attributes);
            }
    });
    //在某个view的下方,如果有偏移量,在某个view下方开始加减对应偏移量即popwindow的位置       popupWindow.setAnimationStyle(R.style.PopAnimation);
    popupWindow.showAsDropDown(inflate,Gravity.CENTER,0,0);
    

    5.加动画

    popupWindow.setAnimationStyle(R.style.PopAnimation);
    
    <style name="PopAnimation" parent="@android:style/Animation">
           <item name="android:windowExitAnimation">@anim/anim_eixt</item>
            <item name="android:windowEnterAnimation">@anim/anim_enter</item>
    </style>
    

    anim_exit.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1500"
    >
        <translate
            android:fromXDelta="0"
            android:toXDelta="100%p"
            android:fromYDelta="0"
            android:toYDelta="100%p"
            />
        <alpha
            android:fromAlpha="1.0"
            android:toAlpha="0"
            />
    </set>
    
    

    anim_enter.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1500"
    >
        <translate
            android:fromXDelta="100%p"
            android:toXDelta="0"
            android:fromYDelta="100%p"
            android:toYDelta="0"
            />
        <alpha
            android:fromAlpha="0"
            android:toAlpha="1.0"
            />
    </set>
    

    6.又想有阴影,又想在某个随着屏幕滑动位置变化的某个view下面

    View inflate = LayoutInflater.from(this).inflate(R.layout.pop, null, false);
    final PopupWindow popupWindow = new PopupWindow(inflate, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        //点击非菜单部分退出
       inflate.setOnClickListener(new View.OnClickListener() {
            @Override
             public void onClick(View v) {
                  popupWindow.dismiss();
              }
          });
    popupWindow.setBackgroundDrawable(null); 
    popupWindow.setOutsideTouchable(true);
    popupWindow.setAnimationStyle(R.style.PopAnimation);
    //相对于屏幕的位置
    int[] position = new int[2];
    mBtn2.getLocationOnScreen(position);
    LinearLayout llCotainer = inflate.findViewById(R.id.ll_container);
    //获取状态栏高度
     int result = 0;
     int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
     if (resourceId > 0) {
            result = getResources().getDimensionPixelSize(resourceId);
     }
    LinearLayout.LayoutParams par = (LinearLayout.LayoutParams) llCotainer.getLayoutParams();
    par.setMargins(position[0],position[1]+mBtn2.getHeight()-result,0,0);
    popupWindow.showAtLocation(mBtn2, Gravity.NO_GRAVITY,0,0);
    

    相关文章

      网友评论

        本文标题:掌握Popupwindow实现弹出列表效果及自定义效果

        本文链接:https://www.haomeiwen.com/subject/jozhrctx.html