最近在项目中遇到个问题:在主页打开使用透明主题(设有 <item name="android:windowIsTranslucent">true</item>
)的activity时,由于有跳转动画的存在,动画完成之前快速点击多次主页跳转Activity按钮时,跳转的透明主题activity就会退到桌面。
网上还看到有人遇到多次点击某个区域的时候点击事件会穿透到桌面的问题,应该类似。
分析原因:在跳转页面的时候,当window还处于透明状态时,点击事件会穿透到app之外
处理方式有两种:
1.启动过程中屏蔽触摸
如何限制触摸屏事件连续响应
在动画开始的时候,记住一个时间,在响应点击事件的时候,要检查一下,当前时间与保存的时候差值有没有超过1秒,如果超过,可以认为是一次有效的操作
代码如下:
@Override
public void onClick(View v) {
if(LimitLRForLTUtil.IsNormalOperation()){
/***此处跳转activity*******/
overridePendingTransition(R.anim.push_right_in,R.anim.push_right_out);
}else{
System.out.println(".... Should be disregarded ");
}
super.onClick(v);
}
public class LimitLRForLTUtil {
private static long oldTime;
public static long INTERVALTIMEOFANIMATION = 1000;
public static void setOldTime(long time){
oldTime = time;
}
public static boolean IsNormalOperation(){
// the interval time between animations is 1000
if((System.currentTimeMillis() - oldTime) < INTERVALTIMEOFANIMATION ){
return false;
}
oldTime = System.currentTimeMillis();
return true;
}
}
2.禁用 windowIsTranslucent
那么问题来了,应用启动时会出现闪屏现象,但我又不想用启动页,咋办?
也是有办法的,设置activity主题为:
<style name="MyAppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:background">@null</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowDisablePreview">true</item>
<item name="android:windowNoDisplay">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowAnimationStyle">@style/alpha_anim</item>
</style>
这里的启动动画是淡入淡出:
<style name="alpha_anim">
<item name="android:windowEnterAnimation">@anim/alpha_in</item>
<item name="android:windowExitAnimation">@anim/alpha_out</item>
</style>
alpha_in:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="500"/>
</set>
alpha_out:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="500"/>
</set>
应用启动的主页那边,可以使用懒加载布局
你的主页布局Layout在xml布局文件中设为invisible,
然后在activity里面使用懒加载:
getWindow().getDecorView().postDelayed(() -> {
你的主页布局Layout.setVisibility(View.VISIBLE);
你的主页布局Layout.setAnimation(AnimationUtils.loadAnimation(this, R.anim.alpha_in));
},200);
这样就可以在主页出来后,再淡出布局,很线性流畅不突兀,闪屏现象也没有了,美滋滋。