一个实现带灰色蒙版从底部弹出的PopupWindow基类封装(解决蒙版覆盖虚拟按键问题)

Posted 我爱烤冷面

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个实现带灰色蒙版从底部弹出的PopupWindow基类封装(解决蒙版覆盖虚拟按键问题)相关的知识,希望对你有一定的参考价值。

主要解决的问题:

1.项目中过多冗余的PopupWindow初始化

2.每个页面单独对灰色蒙版进行处理,并且效果并不是特别好。

3.使用WindowManager设置透明度,PopupWindow因为有延时动画,快速点击的时候,会出现一定异常情况。

4.使用WindowManager的透明度设置灰色蒙版,存在当底部展示虚拟按键的时候,灰色蒙版会覆盖到虚拟按键上

 

解决思路:

1.在基类中初始化一个PopupWindow,并对其进行一些常规的设置(通常大部分页面的设置都差不多,取最常用的配置,把有可能变化的配置可以作为设置项开放出来)

2.在基类中实现WindowManager控制透明度,以展示灰色蒙版效果。

3.解决快速点击问题。采用PopupWindow全屏展示,灰色遮罩层放一个透明的view,用它的点击事件来处理PopupWindow消失事件。

4.解决虚拟按键问题,尝试各种方法无效后。采用PopupWindow全屏展示,会填充的底部虚拟按键,然后通过一个占位view,设置为虚拟按键的高度来撑起PopupWindow。从而解决虚拟按键也会变灰的问题。

 

思路都讲了,还写不出来的可以下载看看。

https://download.csdn.net/download/u011835956/13622616

主要还是解决灰色蒙版会覆盖到虚拟按键上导致虚拟按键颜色发生变化的问题。

如果大家有更好的解决思路也请告诉我呀~

 

 

补充一个动画优化:

开始使用网上最常见的方案实现底部弹出由下至上弹出的动画效果,代码如下:

<set xmlns:android="http://schemas.android.com/apk/res/android">

 <translate

  android:duration="200"

  android:fromYDelta="0"

  android:toYDelta="50%p" />

 <alpha

  android:duration="200"

  android:fromAlpha="1.0"

  android:toAlpha="0.0" />

</set>

大概如上,使用translate动画,但是做出来的动画效果非常生硬。发现别人家的app动画效果都非常流畅,研究后换为scale缩放动画实现,动画效果就非常美了。原理是x轴不变,对y轴做一个缩放动画的效果:

 

popup_enter.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200">
    <scale
        android:fromXScale="1.0"
        android:fromYScale="0.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="0%"
        android:pivotY="100%"
        android:toXScale="1.0"
        android:toYScale="1.0" />
</set>

 

popup_exit.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200">
    <scale
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="0%"
        android:pivotY="100%"
        android:toXScale="1.0"
        android:toYScale="0.0"/>
</set>
<style name="popupAnimation">
    <item name="android:windowEnterAnimation">@anim/popup_enter</item>
    <item name="android:windowExitAnimation">@anim/popup_exit</item>
</style>



mPopupWindow.setAnimationStyle(R.style.popupAnimation);//添加动画,默认底部弹出动画

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于一个实现带灰色蒙版从底部弹出的PopupWindow基类封装(解决蒙版覆盖虚拟按键问题)的主要内容,如果未能解决你的问题,请参考以下文章

MUI 自定义从底部弹出的弹出框

4.弹出层组件的实现与封装

Kotlin 实现在Activity中间弹出的List列表弹窗(带选中效果)的功能

自定义PopupWindow弹出后背景灰色状态

Android实现从底部弹出的Dialog

iOS白色到透明渐变层是灰色