開局一張圖,剩下全靠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的記錄到這裏了。以後遇到新的問題再來更新。