android透明主题引起的快速点击activity触发退到桌面

最近在项目中遇到个问题:在主页打开使用透明主题(设有 <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);

这样就可以在主页出来后,再淡出布局,很线性流畅不突兀,闪屏现象也没有了,美滋滋。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中实现透明Activity的点穿透,可以通过以下步骤进行操作: 1. 在Manifest文件中声明透明Activity: ```xml <activity android:name=".TransparentActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar"> </activity> ``` 2. 创建TransparentActivity类并继承自Activity,并在onCreate方法中设置Activity透明属性: ```java public class TransparentActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 设置Activity透明 getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); getWindow().setFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); // 设置布局等其他操作 setContentView(R.layout.activity_transparent); } } ``` 3. 在TransparentActivity的布局文件中,可以添加其他View元素,以便显示其他内容。 ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is a transparent activity" android:textSize="24sp" android:layout_centerInParent="true"/> <!--其他View元素--> </RelativeLayout> ``` 通过以上步骤,我们可以创建一个透明Activity,并且该Activity不会拦截点事件,点事件会传递到下方的View,从而实现了透明Activity的点穿透效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值