類似微信右上角加號popupWindow顯示,並顯示背景陰影

開局一張圖,剩下全靠x。

popupwindow相信大家在項目中都遇到過,但有幾個點我想跟大家分享一下,

  • popupwindow陰影背景的顯示和消失
  • popupwindow的顯示位置的調整
  • popupwindow的顯示和隱藏動畫

針對陰影背景我也是從網上找的解決方案,粘出代碼,直接拿來用,

 private void setWindowBg(float bgAlpha) {
        WindowManager.LayoutParams lp = getWindow()
                .getAttributes();
        lp.alpha = bgAlpha;
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        getWindow().setAttributes(lp);        
}

顯示popupwindow

// 調用此方法,並傳遞參數(0f~1f 完全不透明到完全透明)產生背景變暗效果
setWindowBg(0.4f);
showAsDropDown(popWindow, ivRight, -xOffset, yOffset);

隱藏popupwindow

//在popupwindow消失的監聽方法裏面再次調用,傳遞1f(完全透明)
 popWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            // 在dismiss中恢復透明度
            public void onDismiss() {
                setWindowBg(1f);
            }
});

剛開始背景的顯示和隱藏都沒什麼問題,但用着發現了個問題,當我退出此界面時,發現有個陰影界面一閃而逝,之前都沒有,感覺應該是setWindowBg()方法的問題,只要調用過此方法並顯示過陰影后,退出界面就會一閃而逝,不調就沒事。

接下來就繼續百度......叮 ,有了眉目,下面的代碼多了判斷,在透明度爲1f時調用了clearFlags,雖然不清楚裏面的參數是幹嘛的,但可以猜到是清除了某種標識。

private void setWindowBg(float bgAlpha) {
        WindowManager.LayoutParams lp = getWindow()
                .getAttributes();
        lp.alpha = bgAlpha;
        if (bgAlpha == 1) {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//不移除該Flag的話,在有的頁面上的會出現黑屏的bug
        } else {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//此行代碼主要是解決在華爲手機上半透明效果無效的bug
        }
        getWindow().setAttributes(lp);
    }

關於顯示位置的問題,也是碰到了一些坑,記錄一下

一般我們調用的showAsDropDown()方法,然後在三個參數的方法裏面,後面兩個參數分別是x軸偏移量,y軸偏移量,當我偏移量都爲0時,彈窗顯示位置緊貼屏幕右邊,而我想讓那個尖角剛好處於加號的下邊,然後就不斷的去移x軸的偏移量,因爲我這是往左調,所以偏移量爲負,最終移到理想的位置。ps:在不同型號的手機上位置可能會有偏差.需注意適配。

然後就是showAsDropDown()這個方法在不同的Android7.0及以上和低版本上也會有出現顯示問題,需要判斷Android版本併兼容,貼出代碼。

public void showAsDropDown(final PopupWindow pw, final View anchor, final int xoff, final int yoff) {
        if (Build.VERSION.SDK_INT >= 24) {
            Rect visibleFrame = new Rect();
            anchor.getGlobalVisibleRect(visibleFrame);
//            int height = anchor.getResources().getDisplayMetrics().heightPixels - visibleFrame.bottom;
            pw.setHeight(pw.getHeight());
            pw.showAsDropDown(anchor, xoff, yoff);
        } else {
            pw.showAsDropDown(anchor, xoff, yoff);
        }
    }

顯示的問題就解決了。

然後就是popupwindow的顯示和消失動畫了

也是xml裏面寫好的,然後引用到style文件,最終在代碼層給popupwindow設置setAnimationStyle(R.style.pop_add)   

conv_pop_right_anima_expand.xml

<!--showAnima顯示的動畫-->

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

    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
    <scale
        android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:pivotX="85%"
        android:pivotY="0%"
        android:toXScale="1.0"
        android:toYScale="1.0"/>
</set>

conv_pop_right_anima_shrink.xml 

<!--hideAnima隱藏的動畫-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200">
  
        <alpha
            android:fromAlpha="1.0"
            android:toAlpha="0.0"/>
        <scale
            android:fromXScale="1.0"
            android:fromYScale="1.0"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:pivotX="85%"
            android:pivotY="0%"
            android:toXScale="0"
            android:toYScale="0"/>

</set>

style文件裏的代碼 

<style name="pop_add">
        <item name="android:windowEnterAnimation">@anim/conv_pop_right_anima_expand</item>
        <item name="android:windowExitAnimation">@anim/conv_pop_right_anima_shrink</item>
</style>

 關於popupwindow的記錄到這裏了。以後遇到新的問題再來更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章