今天遇到一个奇怪的问题,在按Home回到桌面后,再从桌面打开app,会闪一下桌面背景的所有app图标。虽然解决了,但不知道什么原因引起的,感觉应该是app的样式导致的,但是把所有样式都去掉后,还是会闪。网上也有各种说法,比如设置启动样式为一张背景图。或者说去掉
<item name="android:windowIsTranslucent">true</item>
或
<item name="android:windowIsTranslucent">false</item>
这只是解决启动时的闪,我是启动时不闪,启动后,按home,再打开才会闪。
最后发现,只要在启动app的时候弹出一个PopupWindow就不会闪桌面背景。
所以最后解决方法就是在app启动的时候弹出一个宽、高为 1 的popupwindow。但是这个popupwindow并非想象中那么简单,如果随便弹出一下,在打开app的时候会闪一下闪一下两次,体验很差。下面是我写的PopupWindow,解决了这个问题。
public class TempPopupWindow extends PopupWindow
{
private static final String TAG = MyPopupWindow.class.getSimpleName();
private Context context;
private View viewRoot;
public TempPopupWindow(Context context)
{
super(context);
this.context = context;
init();
View contentView = getContentView();
contentView.measure(makeDropDownMeasureSpec(getWidth()), makeDropDownMeasureSpec(getHeight()));
}
private void init()
{
LayoutInflater inflater = LayoutInflater.from(context);
viewRoot = inflater.inflate(R.layout.temp_popup, null);//一个width/height为1,背景为全透明的布局
setContentView(viewRoot);
initWindow();
}
private void initWindow()
{
setAnimationStyle(R.style.pop_anim_style); //从底部弹出,底部退出的动画,很简单,网上很多
setWidth(1);
setHeight(1);
setFocusable(true);
setOutsideTouchable(true);
update();
ColorDrawable dw = new ColorDrawable(Color.TRANSPARENT); //设置popuowindow背景为全透明
setBackgroundDrawable(dw);
backgroundAlpha((Activity) context, 1.0f);
setOnDismissListener(new OnDismissListener()
{
@Override
public void onDismiss()
{
((Activity)context).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
backgroundAlpha((Activity) context, 1.0f);
}
});
}
//所有调用该方法的地方,参数alpha的值都要统一,如果不一样,就会闪不同颜色的背景
public void backgroundAlpha(Activity context, float bgAlpha)
{
WindowManager.LayoutParams lp = context.getWindow().getAttributes();
lp.alpha = bgAlpha;
lp.dimAmount = 1.0f;
context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
context.getWindow().setAttributes(lp);
}
public void showPopupWindow(View view)
{
showAtLocation(view, Gravity.CENTER | Gravity.CENTER, 10, 10);
backgroundAlpha((Activity) context, 1.0f);
}
private static int makeDropDownMeasureSpec(int measureSpec)
{
int mode;
if (measureSpec == ViewGroup.LayoutParams.WRAP_CONTENT)
{
mode = View.MeasureSpec.UNSPECIFIED;
}
else
{
mode = View.MeasureSpec.EXACTLY;
}
return View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.getSize(measureSpec), mode);
}
}
在Activity的onCreate()中延时50毫秒弹出这个popupwindow.
tempPopupWindow = new TempPopupWindow(this);
mHandler.sendEmptyMessageDelayed(Constant.MSG_DELAY_SHOW_POP_WINDOW, 50);
private Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
int what = msg.what;
switch (what)
{
case Constant.MSG_DELAY_SHOW_POP_WINDOW:
tempPopupWindow.showPopupWindow(imgMore);
sendEmptyMessageDelayed(Constant.MSG_DELAY_DISMISS_POP_WINDOW, 0);
break;
case Constant.MSG_DELAY_DISMISS_POP_WINDOW:
tempPopupWindow.dismiss();
break;
}
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="1dp" android:layout_height="1dp" android:background="@color/transparent"> </LinearLayout>
这只是我个人遇到的场景的解决方法。