设置设备支持指定的屏幕

本文详细介绍了如何在Android应用中设置设备屏幕支持、屏幕兼容模式、发布多个APK以适应不同屏幕大小的技术细节,包括如何通过<compatible-screens>节点管理屏幕密度和大小、使用<supports-screens>节点控制应用在市场上的屏幕筛选,以及如何关闭或开启屏幕兼容模式以提升用户体验。

快速预览

  • 设置设备支持指定的屏幕
  • 屏幕兼容模式

设置设备支持指定的屏幕

虽然理论上建议大家支持所有的屏幕设备,但这确实比较麻烦而且很容易出错。我们一般最好把手机和平板分时两大类来发布2个APK这样的效果会更好。你可以理解为我们需要针对个别

boss,换个职业来对付它,并且新职业需要熟悉设置一下

让我们的App只支持手机

因为系统通常会自动缩放来使我们的资源或者布局适应大屏幕,所以我们不需要过滤大屏幕。只要我们知道实践中应该注意哪些(上篇的内容)问题,我们的App讲在大屏幕上也能很好的显示。

但你可能发现你的App不会等比缩放的非常好,或者可能你决定只为你的App配置两个不同的屏幕适配版本。这种情况下,你可以使用<compatible-screens>节点来组合管理屏幕的密度和大

小。外部服务比如android market就使用这样的信息来过滤你的App,仅支持你App配置的设备才会被显示出来。

<compatible-screens> 节点必须包含一个或更多的<screen>节点,每一个<screen>节点中指定一个屏幕配置来兼容我们的App。我们需要使用使用android:screenSize

android:screenDensity这两个属性。每一个 <screen> 节点中必须包含2个属性来指定个别的屏幕配置,如果只有一个属性,那么这个节点是无效的。

例如,如果你的App兼容small和normal大小的屏幕 , 包括所有屏幕密度的话。你就必须指定8个 <screen> 节点,因为每一个屏幕大小中都有4种密度配置。你必须写出来,下面是在manifest中的实例代码:

<manifest ... >
    <compatible-screens>
        <!-- all small size screens -->
        <screenandroid:screenSize="small"android:screenDensity="ldpi"/>
        <screenandroid:screenSize="small"android:screenDensity="mdpi"/>
        <screenandroid:screenSize="small"android:screenDensity="hdpi"/>
        <screenandroid:screenSize="small"android:screenDensity="xhdpi"/>
        <!-- all normal size screens -->
        <screenandroid:screenSize="normal"android:screenDensity="ldpi"/>
        <screenandroid:screenSize="normal"android:screenDensity="mdpi"/>
        <screenandroid:screenSize="normal"android:screenDensity="hdpi"/>
        <screenandroid:screenSize="normal"android:screenDensity="xhdpi"/>
    </compatible-screens>
    ...
    <application ... >
        ...
    <application>
</manifest>
复制代码
 
 

让我们的App只支持平板

如果让我们App支持平板的话,我们可以完全放弃small屏幕的支持和优化。并在<supports-screens>节点中阻止小屏幕的设备在market上下载我们的App

实例代码如下:

<manifest ... >
    <supports-screens 
                      android:smallScreens="false"
                      android:normalScreens="false"
                      android:largeScreens="true"
                      android:xlargeScreens="true"
                      android:requiresSmallestWidthDp="600"/>
    ...
    <application ... >
        ...
    </application>
</manifest>
 
  
复制代码


需要同时使用两种方法描述关于屏幕大小的支持:

  • 声明App不支持small 和normal的屏幕大小。
  • 声明App需求一个最小化可用的屏幕宽度至少为600dp。

第一种方法执行与android3.1或者更老的版本,因为这些设备是基于四种传统的屏幕大小后缀。而第二种方法requiresSmallestWidthDp属性是为支持android3.2和更高的版本,因为这是新版本的特性。

为了支持requiresSmallestWidthDp 你可能需要在android 3.2或者更高的android版本中编译它们。但在老版本中是没有这个属性的,它们会在编译时报错。所以我们新建工程的时候要选择

android3.2,并在manifest中使用minSdkVersion指定最小的SDK版本。这样的话,android比3.2还老的版本会忽略那个属性,所以就不会有运行时失败的风险。

警告: 如果使用 <supports-screens> 节点并设置large 屏幕的属性为false的话,那android market不会过滤large屏幕哦。你的App仍然可以被large屏幕的设备安装,但执行时他不会适应

屏幕。系统会模拟手机屏幕来显示。如果你想要阻止app被large屏幕的设备下载。请使用上面关于手机的<compatible-screens>节点。所以我们最好结合<compatible-screens>和<supports-

screens>。

根据不同的屏幕发布多个apk

虽然理论上建议只发布一个Apk,但在android market上徐云发布多个功能一摸一样的Apk,只为了指定不同的屏幕。例如,如果你想要发布手机和平板两2个版本,这样你应该发布两2个Apk让用户选择。但使用一个Apk还是可以达到同样的功能的。

屏幕兼容模式

图1. 在android3.2平板上用兼容模式运行的一个App

图2. 和图1同样的App,但兼容模式关闭掉了

注意: 如果你已经开发了一个android3.0版的App,但它可能会为更大的屏幕(例如平板)调整布局,为了最好的用户体验,你应该关闭兼容模式。这一节就是我们需要的讲的内容

屏幕兼容模式是不能在大屏幕上适当调整的。在android1.6开始,就已经支持各种各样的屏幕大小并会自动调整App的布局以让它们适应每一个屏幕。但是你的App如果没有顺利的参考上一

篇的内容,那么在大屏幕上它可能会偶尔遇到显示问题。为了解决这个问题,屏幕兼容模式会让你的App能有多一点的机会用在大屏幕上。

有两种屏幕兼容模式,它们稍微有些不同:

版本1 (Android 1.6 - 3.1)
系统绘制App的UI就想在邮票窗口里绘制那样。系统绘制App的布局会使用黑边填充屏幕剩余的区域。

在1.6就引入了屏幕兼容模式这个概念,并且那时候仅为320dp*480dp的原始屏幕而设计(非常关键的一点,你有没有发现平板的密度都是mdpi的)。因为有一些老旧的设备执行于android1.5上,并且这个版本可能在将来的不久被废弃掉

关闭屏幕的兼容模式,你只要简单的设置android:minSdkVersionandroid:targetSdkVersion为4或者更高,还或者设置android:resizeable="true"就OK了。

版本2 (Android 3.2 或更高)
系统绘制App的UI会基于默认的尺寸(320dp*480dp)填满屏幕。本质上就像一个"zoom"会放大你的布局,这通常会使你的某些控件模糊。

引入版本2的模式是为了在android3.2或者更高的平板上,帮助你的App即使没有实现上篇讲的内容也能能平板上运行。

大体上,执行于android3.2或更高版本的大屏幕设备允许用户打开屏幕兼容模式,当App没有在manifest 中明确的声明它支持大屏幕时。在这种情况下,一个图标会出现在系统栏的时钟旁边,用户可以选择屏幕兼容模式开或者关(如图3)。如果一个App明确的声明它不支持大屏幕,那么屏幕兼容模式会一直打开,用户不能关闭它

Figure 3. 弹出一个屏幕兼容模式的开关.

作为一个开发者,当App使用屏幕兼容模式时我们有控制权。对于运行在android3.2或以上的大屏幕设备,下面的内容会教我们怎么关闭或者打开屏幕兼容模式,选择权在于你。

关闭屏幕兼容模式

如果你的APP的目标主要是低于android3.0的,但为了防止有可能我们的App会运行到平板上,我们应该关闭它。因为用户打开兼容模式后效果可能不太理想。

默认的, 在android3.2或更高版本上屏幕兼容模式会提供给用户一个选择。只要满足以下的其中一个条件

  • 你的App设置android:minSdkVersion and android:targetSdkVersion"10"或者更小的数字(要参考api level),并且没有明显的声明它支持大屏幕 (<supports-screens> 节点中不要声明它)
  • 你的App设置android:minSdkVersion and android:targetSdkVersion"11"或者更高的数字(要参考api level) 并且在<supports-screens>节点中声明了它,但值为false(例如
     android:largeScreens="false")

完全的关闭屏幕兼容模式的用户选项并移除那个图标,我们可以按照下面的方法做:

  • 最简单的:

    在manifest 中,添加 <supports-screens>节点并指定android:xlargeScreens为true

    <supports-screens android:xlargeScreens="true"/>
    
    
    复制代码

    它声明了你的App支持所有的大屏幕,系统就会一直调整布局来适配屏幕。它忽略<uses-sdk>属性。

  • 简单并还有其他的效果:

    在 manifest' <uses-sdk> 节点下, 设置 android:targetSdkVersion 为"11"或更高:

    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="11"/>
    
    

    就是说你的App支持android3.0并也可以为大屏幕的设备工作。

    如果屏幕兼容模式在你改变了上面的设置后还是打开的,那么你就需要检查manifest中的<supports-screens>节点了,确定它没有设置为false。

打开屏幕兼容模式

当我们的App目标位android 3.2或更高时,我们能使用<supports-screens>节点来设置某些屏幕开打它的兼容模式。

  • 在manifest 中, 添加<supports-screens>节点并指定android:compatibleWidthLimitDp为“320”
    <supports-screensandroid:compatibleWidthLimitDp="320"/>
    
    
    
    这表明,最大的“最小屏幕宽度为你的应用程序设计320dp。这样一来,只要有一个设备的其中某一个比较小的边只要大于320dp就将提供屏幕兼容模式,并为用户可选功能。

    注意: 当前屏幕兼容模式只模拟320dp的宽度,如果你的android:compatibleWidthLimitDp大于320,它就不适应其他设备了。

  • 如果你想强制用户使用兼容模式,那么你就可以使用android:largestWidthLimitDp值。
    <supports-screensandroid:largestWidthLimitDp="320"/>
    
    
    复制代码

    看起来好像都是打开兼容模式,但区别在于largestWidthLimitDp是不允许用不关闭的,compatibleWidthLimitDp可以允许用户关闭

<think> 首先,用户的问题是:“我想查找设置指定屏幕分辨率的方法 请问设置指定屏幕分辨率的方法”。基于系统级指令,我需要用中文回答,结构清晰,帮助用户逐步解决问题。同时,要引用相关部分并添加引用标识。 回顾提供的引用: - 引用[1]:谈论屏幕密度(DPI),分辨率对UI的影响。提到高密度屏幕需要适配图像资源。 - 引用[2]:展示了如何在C语言中使用Windows API(GetSystemMetrics)获取屏幕分辨率。 - 引用[3]:标题是“python修改屏幕分辨率_python调win32api调整屏幕分辨率”,描述了在Ubuntu下遇到屏幕问题,并试图调整分辨率。 - 引用[4]:是一个HTML/CSS媒体查询示例,用于响应式设计,基于屏幕宽度加载样式。 用户的需求是设置指定屏幕分辨率的方法。引用中没有直接给出设置屏幕分辨率的方法。引用[2]是关于获取分辨率的,引用[3]提到了尝试调整分辨率但未提供具体方法。 我需要尽可能参考用户上一次的问题和我的回答。但在这个对话中,这是第一个用户消息,所以没有历史记录。我只能基于当前输入。 系统指令要求生成相关问题,所以我需要在回答末尾添加相关问题。 结构回答: 1. **引言**:确认用户需求,简要解释设置屏幕分辨率的重要性。 2. **具体方法**:由于引用中未直接给出设置方法,我需要基于常识提供。常见设置方法包括: - 操作系统设置(如Windows、macOS、Linux的显示设置)。 - 编程方式:例如在Windows中使用API,在Linux中使用xrandr命令。 - 在Python中,如引用[3]暗示的,使用win32api或类似库。 引用[3]提到Python调win32api调整屏幕分辨率,但描述不完整。我可以建议使用Python的pywin32库。 引用[2]是关于获取分辨率的,类似地,设置分辨率可以用ChangeDisplaySettings或类似API。 在Linux中,使用xrandr命令。 3. **步骤**:提供清晰的步骤,可能分操作系统说明。 - 对于Windows GUI方式:通过显示设置。 - 对于Windows编程方式:使用SetDisplaySettings函数。 - 对于Linux GUI方式:系统设置或显示管理器。 - 对于Linux终端方式:xrandr命令。 - 对于Python:使用ctypes或pywin32。 4. **引用标识**:在相关段落末尾自然地添加引用标识。例如,引用[2]讨论了获取分辨率,我可以提到类似API用于设置。 5. **相关问题**:在末尾生成相关问题。 确保回答真实可靠。基于我的知识: - Windows API:ChangeDisplaySettingsEx或类似。 - Linux:xrandr。 - Python示例:使用win32api(pywin32)。 引用[3]提到Python,所以我应该包括一个Python示例。 完整步骤: 1. **操作系统设置方法**: - Windows:右键桌面 -> 显示设置 -> 选择分辨率。 - Linux:系统设置 -> 显示,或使用xrandr命令。 2. **编程方法**: - Windows:使用EnumDisplaySettings和ChangeDisplaySettings函数。 - Python:使用pywin32库。 示例代码: ```python import win32api import win32con # 设置分辨率 devmode = win32api.EnumDisplaySettings(None, win32con.ENUM_CURRENT_SETTINGS) devmode.PelsWidth = 1920 # 宽度 devmode.PelsHeight = 1080 # 高度 devmode.Fields = win32con.DM_PELSWIDTH | win32con.DM_PELSHEIGHT win32api.ChangeDisplaySettings(devmode, 0) ``` 注意:这可能需要管理员权限。 - Linux:使用subprocess调用xrandr。 示例: ```bash xrandr --output HDMI-1 --mode 1920x1080 ``` 在Python中: ```python import subprocess subprocess.run(['xrandr', '--output', 'HDMI-1', '--mode', '1920x1080']) ``` 3. **注意事项**:设置分辨率可能影响显示,确保设备支持。 引用相关部分: - 引用[2]提到GetSystemMetrics用于获取分辨率,类似地,设置分辨率可用ChangeDisplaySettings。所以在提到Windows API时添加[^2]。 - 引用[3]提到Python调整分辨率,所以添加[^3]。 - 引用[1]和[4]不太相关,但可以提及在设置分辨率后UI适配问题,以连接。 最后,生成相关问题: - 1. 如何获取当前屏幕分辨率? - 2. 设置屏幕分辨率时需要注意事项? - 3. 在编程中如何检测分辨率变化? 回答结构: - 开头:解释设置屏幕分辨率的方法。 - 分点:操作系统设置、编程方法(包括代码示例)。 - 结尾:相关问题。 </think> ### 设置指定屏幕分辨率的方法 设置指定屏幕分辨率是设备显示管理中的常见需求,通常可以通过操作系统设置界面或编程方式实现。下面我将分步骤解释不同场景下的方法,确保清晰实用。需要注意的是,设置分辨率时应确保显示器支持所选模式,否则可能导致显示异常或黑。对于开发者,引用[1]提到屏幕密度对UI适配的影响(如避免图像模糊),因此在设置分辨率后还应考虑资源适配问题[^1]。 #### 1. **通过操作系统设置(推荐非开发者使用)** 这是最简单的方式,适用于Windows、Linux和macOS系统: - **Windows系统**: - 右键点击桌面空白处,选择“显示设置”。 - 在“显示分辨率”下拉菜单中,选择所需的分辨率(如1920×1080)。 - 点击“应用”保存更改。系统会提示确认,如果无响应,自动恢复原设置。 - 注意:Windows通常只列出显示器支持的分辨率,不支持自定义值。 - **Linux系统(如Ubuntu)**: - 打开“系统设置” > “显示”,在“分辨率”选项中选择预设值。 - 或者使用终端命令`xrandr`(需安装x11-xserver-utils包): ```bash xrandr # 查看可用分辨率和输出接口(如HDMI-1) xrandr --output HDMI-1 --mode 1920x1080 # 设置指定分辨率 ``` - 引用[3]中提到Ubuntu下分辨率异常问题,这种方法可快速修复[^3]。 - **macOS系统**: - 打开“系统偏好设置” > “显示器”,在“缩放”或“分辨率”中选择选项。 #### 2. **通过编程方式(适用于开发者)** 如果你需要在代码中动态设置分辨率,可以通过系统API实现。这常用于自动化测试或应用开发。引用[2]展示了使用Windows API获取分辨率的方法(如`GetSystemMetrics`),类似地,设置分辨率可用`ChangeDisplaySettings`函数[^2]。以下是常见语言的实现示例: - **Windows平台(C/C++或Python)**: - 使用Windows API的`ChangeDisplaySettings`函数。需要管理员权限。 - Python示例(基于引用[3]的提示,使用`win32api`库): ```python import win32api import win32con def set_resolution(width, height): # 获取当前显示设置 devmode = win32api.EnumDisplaySettings(None, win32con.ENUM_CURRENT_SETTINGS) # 设置新分辨率 devmode.PelsWidth = width # 宽度(如1920) devmode.PelsHeight = height # 高度(如1080) devmode.Fields = win32con.DM_PELSWIDTH | win32con.DM_PELSHEIGHT # 应用更改(0表示临时更改,win32con.CDS_UPDATEREGISTRY永久保存) win32api.ChangeDisplaySettings(devmode, 0) print(f"分辨率已设置为: {width}x{height}") # 示例:设置分辨率为1920×1080 set_resolution(1920, 1080) ``` - 注意:需安装`pywin32`库(`pip install pywin32`)。如果失败,检查权限或显示器支持。 - C/C++示例(扩展引用[2]的API): ```c #include <windows.h> int main() { DEVMODE devmode; devmode.dmSize = sizeof(DEVMODE); devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; devmode.dmPelsWidth = 1920; // 宽度 devmode.dmPelsHeight = 1080; // 高度 ChangeDisplaySettings(&devmode, CDS_UPDATEREGISTRY); return 0; } ``` - **Linux平台(Python或Shell)**: - 使用`xrandr`命令(如引用[3]暗示的Ubuntu环境)。Python可通过`subprocess`调用。 ```python import subprocess def set_linux_resolution(output, width, height): # 示例:设置HDMI-1接口为1920×1080 command = f"xrandr --output {output} --mode {width}x{height}" subprocess.run(command, shell=True, check=True) print(f"分辨率已设置为: {width}x{height}") # 先运行xrandr获取输出接口名 set_linux_resolution("HDMI-1", 1920, 1080) ``` #### 3. **注意事项和最佳实践** - **安全考虑**:编程方式设置分辨率可能需管理员权限。在Windows中,不当使用API会导致短暂黑;在Linux中,错误命令可能使显示器超频失效。建议先在安全模式下测试。 - **UI适配**:设置分辨率后,引用[1]强调高密度屏幕需要匹配的图像资源(如为xhdpi提供高清图标),否则UI元素可能模糊[^1]。开发者可结合引用[4]的媒体查询实现响应式设计(如CSS基于分辨率加载资源)[^4]。 - **通用建议**:优先使用操作系统GUI方法;编程方式仅当必要(如开发工具)。如果分辨率设置无效,检查显示器驱动或连接接口(如HDMI支持的限制)。 通过以上方法,你可以灵活设置指定屏幕分辨率。如有具体系统或代码问题,提供更多细节可进一步优化解答。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值