天天看點

一個實作帶灰色蒙版從底部彈出的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);//添加動畫,預設底部彈出動畫