Android 系统锁屏实现固件升级动画 超、凢脫俗 2022-07-12 13:28 164阅读 0赞 ## 前言 ## 在Android的开发过程中,有时候会有一些需求,实现一个类似锁屏的功能,我们经常会使用的一些悬浮窗效果或者弹出界面霸占整个手机屏幕,禁止用户交互,比如:手机的虚拟导航菜单屏蔽掉,状态栏禁止下拉或隐藏,原因就是用户可以借助下拉状态栏跳出程序回到桌面,如何屏蔽虚拟导航菜单栏和禁止下拉状态栏呢?Android 没有提供API 让我们来调用,只有查看源码, 利用Java 的反射机制来屏蔽,结果效果不怎么理想。后来就想有没有更好的办法来实现和优化呢,这就想到了WindowManger,例如Android本身就提供了Dialog等控件来实现,但是在很多情况下,我们需要更加灵活的使用方式,比如完全自定义浮出窗口中所需要显示的内容等,这个时候我们就会用到WindowManager.addView的方式来显示一个自定义的window,来遮挡住Activity里的布局,最终绕过了Activity。 ## 正题 ## 预览下要实现的效果: ![这里写图片描述][SouthEast] 首先我们添加权限: <!-- 系统弹框权限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 把Activity的主题设置为Dialog 的样式: <activity android:name=".UpdateFirmwareActivity" android:theme="@style/dialog_translucent"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> MainActivity的主要代码: WindowManager wm=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams(); wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; wmParams.format = PixelFormat.TRANSPARENT; wmParams.flags=WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; wmParams.width= Adaptation.screenWidth; wmParams.height=Adaptation.screenHeight; wm.addView(mView, wmParams); //设置全屏 getWindow().setLayout(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 这是设置类似系统锁屏的主要代码在onCreate()方法中调用,加载自己的布局文件用LayoutInflater来加载: mView = LayoutInflater.from(this).inflate(R.layout.activity_update,null); 你可以在这个界面上设计成你想要的效果,就算按了锁屏功能,你还是无法交互,只能强制重启,直到打开这个再次打开这个界面。 上面的动画就是简单的属性动画啦! 代码如下: rotate\_right.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:fromDegrees="0" android:toDegrees="-359" android:duration="1500" android:repeatCount="-1" android:pivotX="50%" android:pivotY="50%" /> </set> 这是是逆时针围着中心旋转的,顺时针旋转,把toDegrees 的值设置为正数就可以了。android:toDegrees=”-359” ,如果设置成360的话,每转一圈,在起始的地方就会出现卡顿现象。 在MainActivity调用: private Animation operatingAnimLeft; //逆时针旋转 //逆时针旋转 operatingAnimLeft = AnimationUtils.loadAnimation(this, R.anim.rotate_left); LinearInterpolator lin = new LinearInterpolator(); operatingAnimLeft.setInterpolator(lin); if(operatingAnimLeft!=null){ mToLeftRotate.startAnimation(operatingAnimLeft); } 最后为了防止我们调起界面退不回来,强制重启的麻烦,设置一个监听事件: /** * 防止为了退不出来,我设置一个点击事件移除view */ mToLeftRotate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mView != null) { wm.removeView(mView); MainActivity.this.finish(); } } }); 以上就是实现Android 系统类似锁屏的效果的主要代码,禁止用户交互的方案,以上仅供参考! 源码放在 GitHub上:[【UpgradeAndLockScreen】][UpgradeAndLockScreen] > 希望大家能够指点或提出宝贵意见,共同学习,谢谢! > 转载请注明出处:[http://blog.csdn.net/u011974987/article/details/56845216][http_blog.csdn.net_u011974987_article_details_56845216] > 欢迎关注我的社交网站! > 个人博客:[http://xuhaoblog.com][http_xuhaoblog.com] > Github:[https://github.com/git-xuhao][https_github.com_git-xuhao] [SouthEast]: /images/20220710/dc58993d7af145509894290d5866f7a0.png [UpgradeAndLockScreen]: https://github.com/git-xuhao/UpgradeAndLockScreen.git [http_blog.csdn.net_u011974987_article_details_56845216]: http://blog.csdn.net/u011974987/article/details/56845216 [http_xuhaoblog.com]: http://xuhaoblog.com [https_github.com_git-xuhao]: https://github.com/git-xuhao
还没有评论,来说两句吧...