hardwareAccelerated你不知道的一些问题

本文介绍了在Android中如何在Application、Activity、Window和View四个层次上开启硬件加速,并探讨了minSDKVersion和targetSDKVersion对硬件加速的影响。同时,提供了两种实现虚线的方法,一种适用于关闭硬件加速的场景,另一种则可在保持硬件加速的同时实现虚线效果。

在Android中,可以四给不同层次上开启硬件加速:

1、Application

<applicationandroid:hardwareAccelerated="true">

2、Activity

<activityandroid:hardwareAccelerated="true">

3、Window

getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

4、View

view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

在这四个层次中,应用和Activity是可以选择的,Window只能打开,View只能关闭。

在apk的AndroidManifest中,如果指定了minSDKVersion&targetSDKVersion=7,会使得应用无法使用硬件加速进行绘图。

注:有些朋友可能会遇到在开发过程中用到虚线的情况,实现有两种方式:

方式一:

hundsun_include_dotted_line.xml

<?xml version="1.0"encoding="utf-8"?>

<Viewxmlns:android="http://schemas.android.com/apk/res/android"

   style="@style/HundsunStyleWmHw"

   android:background="@drawable/hundsun_shape_dotted_line" />

hundsun_shape_dotted_line.xml

<?xml version="1.0"encoding="utf-8"?>

<shapexmlns:android="http://schemas.android.com/apk/res/android"

   android:shape="line" >

<!-- 显示一条虚线,破折线的宽度为dashWith,破折线之间的空隙的宽度为dashGap,当dashGap=0dp时,为实线(使用时需要把这个Activity的硬件加速关了) -->

   <stroke

       android:dashGap="@dimen/hundsun_dimen_wee_spacing"

       android:dashWidth="@dimen/hundsun_dimen_small_spacing"

       android:width="@dimen/hundsun_dimen_normal_divide"

       android:color="@color/hundsun_app_color_divide" />

   <!-- 虚线高度 -->

   <size android:height="2dp" />

</shape>

这种方式需要在使用该虚线的Activity中设置<activity android:hardwareAccelerated="false">,缺点是这个Activity会变慢,如果有网络请求时,大概率出现收到数据后不会回调问题(断点时,每次都会回调,这是很多人遇到的奇怪问题)。

方式二(建议使用这种方式):

hundsun_include_dash_line.xml

<?xml version="1.0"encoding="utf-8"?>

<Viewxmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="match_parent"

   android:layout_height="@dimen/hundsun_dimen_normal_divide"

   android:background="@drawable/hundsun_shape_dash" />

hundsun_shape_dash.xml

<?xml version="1.0"encoding="utf-8"?>

<bitmapxmlns:android="http://schemas.android.com/apk/res/android"

   android:src="@drawable/hundsun_dashed_line"

   android:tileMode="repeat" />

hundsun_dashed_line.png是一张图片,只要很小很小就行,自动平铺的。

另外对APP进行在线全方位远程调试我都会用Testbird——云手机,功能非常强大,又很方便快捷,还可以做兼容性测试、压力测试等等。

<think>我们正在讨论WindowManager.LayoutParams的各种标志位(flags)。用户希望了解FLAG_ALLOW_LOCK_WHILE_SCREEN_ON、FLAG_DIM_BEHIND等标志位的详细解释和作用。根据引用[3],我们知道WindowManager.LayoutParams是用于描述窗口管理策略的。同时,引用[2]中提到了FLAG_LAYOUT_IN_SCREEN和FLAG_ALT_FOCUSABLE_IM等标志位的部分解释。由于用户要求了解具体标志位,我们将逐一解释常见的标志位,特别是用户提到的两个。同时,我们需要注意引用[1]中提到了FLAG_KEEP_SCREEN_ON,这也是一个常用标志位。下面,我将详细解释WindowManager.LayoutParams中一些重要的标志位:1.**FLAG_ALLOW_LOCK_WHILE_SCREEN_ON**:-作用:允许在屏幕开启时锁定设备(即允许系统进入睡眠状态,即使屏幕还是亮的)。通常情况下,如果应用设置了FLAG_KEEP_SCREEN_ON(保持屏幕常亮),那么设备将会锁定(即会进入睡眠)。但是,如果同时设置了这个标志,那么即使屏幕保持开启,设备也可以进入锁定状态(睡眠)。-使用场景:在需要屏幕常亮但允许设备锁定的特殊情况下使用,例如在播放视频时,屏幕常亮但设备可以进入睡眠(实际上这种情况很少见,因为进入睡眠会关闭屏幕)。所以这个标志一般很少使用。2.**FLAG_DIM_BEHIND**:-作用:在窗口后面添加变暗效果。当这个标志被设置时,窗口后面的所有内容都会变暗,从而突出当前窗口。可以通过`dimAmount`属性设置变暗的程度(0.0表示完全透明,1.0表示完全透明即全黑)。-使用场景:常用于对话框、弹出窗口等,以突出显示当前窗口并屏蔽背景窗口的交互。-示例代码:```javaWindowManager.LayoutParamsparams=getWindow().getAttributes();params.flags|=WindowManager.LayoutParams.FLAG_DIM_BEHIND;params.dimAmount=0.5f;//设置变暗程度getWindow().setAttributes(params);```3.**FLAG_KEEP_SCREEN_ON**(引用[1]中用到):-作用:保持屏幕常亮。设置这个标志后,屏幕将会变暗直至关闭,直到窗口被销毁。-使用场景:例如在播放视频、游戏等需要保持屏幕开启的应用中。-示例代码:```javagetWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);```4.**FLAG_LAYOUT_IN_SCREEN**:-作用:将窗口放置在整个屏幕中,包括系统装饰(如状态栏)的后面。通常和FLAG_LAYOUT_NO_LIMITS一起使用(但引用[2]提到这个标志只能配合FLAG_LAYOUT_IN_SCREEN使用?实际上,引用[2]中的描述可能指的是另一个标志,这里我们按官方文档为准)。设置此标志后,窗口将使用整个屏幕空间,但可以通过其他标志调整布局。-使用场景:用于全屏应用或需要覆盖系统UI的窗口。5.**FLAG_LAYOUT_NO_LIMITS**(在之前的回答中用于解决输入框问题):-作用:允许窗口扩展到屏幕之外。这样,窗口就可以延伸到状态栏、导航栏等系统装饰的区域之外。-使用场景:在沉浸式全屏应用中,需要隐藏状态栏和导航栏,并让内容充满整个屏幕时使用。6.**FLAG_ALT_FOCUSABLE_IM**(引用[2]提到):-作用:这个标志用于改变窗口在接收输入法输入时的行为。设置此标志后,窗口会接受除输入法窗口外的其他窗口的焦点。通常用于希望弹出输入法的窗口(比如一个弹出窗口,同时希望底下的窗口可以接受输入法输入)。-使用场景:当需要显示一个临时窗口(如菜单)而影响底层窗口的输入法状态时。7.**FLAG_NOT_FOCUSABLE**:-作用:窗口能获得输入焦点。这意味着该窗口能接收按键事件或触摸事件,事件会传递到其后的窗口。-使用场景:用于需要交互的窗口,比如半透明的覆盖层,或者仅用于显示信息的窗口。8.**FLAG_NOT_TOUCHABLE**:-作用:窗口接受任何触摸事件。与FLAG_NOT_FOCUSABLE同的是,它可能获得焦点(如果设置FLAG_NOT_FOCUSABLE)但响应触摸。-使用场景:用于完全覆盖在窗口上但希望中断用户操作的层,例如在某些动画期间。9.**FLAG_FULLSCREEN**:-作用:隐藏屏幕上的所有系统装饰(如状态栏),使窗口占据整个屏幕。注意,这个标志只隐藏系统UI,并会改变窗口的布局属性(如宽高)。-使用场景:全屏游戏、视频播放器等。10.**FLAG_LAYOUT_INSET_DECOR**(引用[2]提到):-作用:当窗口在屏幕中布局时,确保内容会被系统装饰(如状态栏)遮挡。窗口管理器会报告窗口的内边距(插入矩形),这样内容就会被遮盖。-使用场景:在需要避免内容被状态栏覆盖的窗口中。11.**FLAG_HARDWARE_ACCELERATED**:-作用:启用硬件加速渲染。通常从API级别11开始,如果应用在AndroidManifest.xml中设置了硬件加速,则所有窗口默认开启硬件加速。但可以通过此标志为单个窗口启用或禁用。-使用场景:需要高性能图形渲染的窗口(如游戏)。12.**FLAG_SECURE**:-作用:防止窗口内容被截图或录屏。设置此标志后,系统会阻止该窗口出现在屏幕截图中,也会出现在非安全的显示设备上(如通过Miracast投射)。-使用场景:用于显示敏感信息的窗口(如支付界面)。以上是一些常见的标志位。由于标志位数量众多,我们无法一一列举,但用户提到的两个标志(FLAG_ALLOW_LOCK_WHILE_SCREEN_ON和FLAG_DIM_BEHIND)已经详细解释。现在,我们将这些标志位按照用户要求,用清晰的结构整理出来,并生成相关问题。注意:回答中引用的段落末尾自然地添加引用标识。由于我们之前有三个引用,但引用[1]和[2]是关于具体的标志,而引用[3]是关于LayoutParams的定义,所以我们在解释具体标志时,如果引用了这些内容,就在末尾添加引用标识。例如,当我们提到FLAG_KEEP_SCREEN_ON时,可以引用[1];当我们提到FLAG_LAYOUT_INSET_DECOR时,引用[2];而整体上,我们都在解释WindowManager.LayoutParams,所以可以引用[3]。下面开始组织回答:</think> ### WindowManager.LayoutParams 标志位详解 #### **1. FLAG_ALLOW_LOCK_WHILE_SCREEN_ON** - **作用**:允许设备在屏幕开启状态下进入睡眠模式 - **详细解释**: - 当应用设置 `FLAG_KEEP_SCREEN_ON` 保持屏幕常亮时,此标志允许系统在特定条件下(如长时间无操作)仍可进入锁定状态 - 主要用于需要屏幕常亮但又需要节省电量的场景 - 常配合 `FLAG_KEEP_SCREEN_ON` 使用,如: ```java getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); ``` - **典型场景**:电子书阅读器、长时间显示的监控数据界面[^1] #### **2. FLAG_DIM_BEHIND** - **作用**:使窗口背后的内容变暗 - **详细解释**: - 通过 `dimAmount` 属性控制变暗程度(0.0~1.0) - 变暗效果会作用在当前窗口后方所有内容上 - **实现代码示例**: ```java WindowManager.LayoutParams params = getWindow().getAttributes(); params.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND; params.dimAmount = 0.5f; // 50% 变暗 getWindow().setAttributes(params); ``` - **典型场景**:对话框弹出时突出当前内容,减弱背景干扰[^3] #### **3. FLAG_LAYOUT_IN_SCREEN** - **作用**:使窗口占据整个屏幕空间 - **详细解释**: - 包括系统装饰区域(状态栏/导航栏) - 必须配合 `FLAG_LAYOUT_INSET_DECOR` 使用避免内容被遮盖: ```java params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; ``` - **坐标系原点**:屏幕左上角(包含系统栏区域) - **典型场景**:全屏游戏、沉浸式视频播放器 #### **4. FLAG_ALT_FOCUSABLE_IM** - **作用**:控制输入法窗口的焦点行为 - **详细解释**: - 防止当前窗口自动获取输入焦点 - 允许多个窗口同时处理输入事件 - 使用场景示例: ```java // 在弹出窗口中设置 popupWindow.setInputMethodMode(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); ``` - **典型场景**:浮窗输入界面、需要同时操作多个窗口的复杂应用[^2] #### **5. FLAG_KEEP_SCREEN_ON** - **作用**:强制屏幕保持开启状态 - **详细解释**: - 优先级高于系统自动休眠设置 - 推荐在Activity中使用而非全局设置: ```java getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); ``` - **省电建议**:在 `onPause()` 中清除此标志: ```java getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); ``` - **典型场景**:导航应用、视频播放器[^1] #### **6. FLAG_NOT_FOCUSABLE** - **作用**:禁止窗口获取输入焦点 - **详细解释**: - 窗口接受任何输入事件 - 事件会穿透到下层窗口 - **组合使用**:常配合 `FLAG_NOT_TOUCHABLE`: ```java params.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; ``` - **典型场景**:半透明覆盖层、非交互式引导蒙版 #### **7. FLAG_SECURE** - **作用**:防止敏感内容被截屏/录屏 - **详细解释**: - 禁止 `adb screencap` 命令获取内容 - 禁止Android系统截图(电源+音量键) - **实现代码**: ```java getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); ``` - **典型场景**:金融支付界面、DRM保护内容 #### **8. FLAG_FULLSCREEN** - **作用**:完全隐藏状态栏 - **详细解释**: - 与沉浸式模式的差异:会自动恢复状态栏 - **现代替代方案**:推荐使用系统UI控制API: ```java // API 30+ 推荐方式 window.setDecorFitsSystemWindows(false) ``` - **兼容实现**: ```java if (Build.VERSION.SDK_INT >= 30) { window.insetsController.hide(WindowInsets.Type.statusBars()) } else { window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } ``` --- ### 标志位使用原则 1. **组合逻辑**:多个标志位使用位运算符组合 ```java params.flags = FLAG_A | FLAG_B & ~FLAG_C; ``` 2. **生命周期管理**: ```java // 设置标志位 void onResume() { getWindow().addFlags(FLAG_KEEP_SCREEN_ON); } // 清除标志位 void onPause() { getWindow().clearFlags(FLAG_KEEP_SCREEN_ON); } ``` 3. **兼容性处理**:通过 `Build.VERSION.SDK_INT` 检查API级别 --- ### 窗口层级类型对照表 | 类型常量 | 值 | 应用场景 | |-----------------------------|-------|-----------------------| | `TYPE_APPLICATION` | 2 | 常规应用窗口 | | `TYPE_APPLICATION_PANEL` | 1000 | 附属面板(浮动窗口) | | `TYPE_APPLICATION_MEDIA` | 1001 | 媒体内容覆盖层 | | `TYPE_APPLICATION_SUB_PANEL` | 1002 | 次级面板(如菜单) | | `TYPE_SYSTEM_ALERT` | 2003 | 系统级告警窗口 | > 窗口类型需通过 `type` 字段设置,层级值越大显示越靠前[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值