得到屏幕大小的方法大全(你知道有几种?)

本文总结了五种在Windows环境下获取屏幕尺寸的方法,包括使用GetSystemMetrics、GetDeviceCaps、SystemParametersInfo、EnumDisplaySettings和GetWindowRect函数。这些方法各有特点,适用于不同场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在计算机就像买白菜一样,规格各异。有时候需要检测电脑的屏幕大小,以适应软件的需求。现总结如下,欢迎大家添加,一是增张我的见识,二是方便大家查询。
 
1.使用GetSystemMetrics()函数:如:
int   cx   =   GetSystemMetrics(SM_CXFULLSCREEN); //得到宽度
int   cy   =   GetSystemMetrics(SM_CYFULLSCREEN); //
得到高度
注意SM_CXSCREENSM_CYSCREEN与上面的区别。
2.使用GetDeviceCaps()函数,如:
int   cx   =   ::GetDeviceCaps(dc.m_hDC,HORZRES); 
int   cy   =   ::GetDeviceCaps(dc.m_hDC,VERTRES);
3.使用SystemParametersInfo()函数,如:
CRect rt;
SystemParametersInfo(SPI_GETWORKAREA, 0, r,t 0);
4.使用EnumDisplaySettings()函数,如:
DEVMODE dm;
dm.dmSize = sizeof(DEVMODE) ;
EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&dm);
int  cx   =  dm.dmPelsWidth;
int  cx   =  dm.dmPelsHeight;
5.使用GetWindowRect()函数,如:
CWnd * pwndDesktop = GetDesktopWindow();
CRect rt;
pwndDesktop->GetWindowRect(&rt);
int cx =rt.Width();
Int cy = rt.Height();
 
附加:
1.int cx = GetSystemMetrics(SM_CXFULLSCREEN); 
int cy = GetSystemMetrics(SM_CYFULLSCREEN);
通过上边两个函数获取的是显示屏幕的大小,及不包括任务栏等区域。
 
int   cx   =   GetSystemMetrics(   SM_CXSCREEN   );   
int   cy   =   GetSystemMetrics(   SM_CYSCREEN   );
这两个函数获取的是真正屏幕的大小。
 
用前两个函数获取的大小可能是1024*687    而用下边两个获取的就是1024*768
2. 得到任务栏大小: 
CWnd* pTaskWnd = FindWindow( _T("Shell_TrayWnd"), NULL ); 
if( pTaskWnd ) pTaskWnd->ShowWindow( FALSE ); 
3.任务栏是否隐藏: 
LONG lStyle = GetWindowLong( pTaskWnd->GetSafeHwnd(), GWL_STYLE ); 
if( lStyle & WS_VISIBLE ) 
{ 
//可见 
} 
else 
{ 
//隐藏 
}
<think>好的,我现在需要回答用户关于Android UI适配方法的问题。首先,我得回想一下自己了解的知识点。用户可能希望得到一个全面的介绍,但作为新手,可能需要分步骤解释。 记得Android适配主要涉及屏幕尺寸、分辨率、像素密度这些因素。常见的适配方法几种,比如使用约束布局、尺寸单位的选择、资源限定符、图片适配、百分比布局、以及新的View适配方式如Jetpack Compose。但不确定是否遗漏了什么。 首先,约束布局ConstraintLayout确实能够通过相对定位来适配不同屏幕,应该提到。然后尺寸单位,dp和sp是基本,但可能不够,所以需要补充使用wrap_content和match_parent。资源限定符的话,比如不同dpi的drawable目录,或者layout-sw600dp这样的尺寸限定符。图片适配建议使用矢量图,比如SVG转Vector,或者WebP格式减少体积。百分比布局可能已经被弃用,但可以用新的替代方案如ConstraintLayout的百分比属性。还有文字大小的适配,可以用sp单位配合屏幕缩放,或者用第三方库调整。还有主题适配,比如夜间模式,但可能不属于UI适配的主要部分,可以简略带过。 另外,现在Jetpack Compose确实提供了更灵活的UI构建方式,可能属于现代方法。需要提到屏幕方向适配,使用不同的layout-land布局。还有测试方面,建议使用模拟器多设备测试。可能还有刘海屏适配,比如设置viewport属性,但用户可能更关注基础方法,所以放在后面或者简略说明。 需要确保每个方法都有简要说明和示例,比如代码或xml示例,但用户可能不需要太详细的代码,只要方法名称和原理。结构上应该分点列出,每个点有小标题和解释,使用中文术语,避免专业术语过多导致理解困难。同时注意LaTeX格式的正确使用,比如数学公式的变量用$包裹,但这个问题可能不涉及数学公式,但需遵循系统指令中的格式要求。检查是否有遗漏的方法,比如使用尺寸值资源,dimens.xml文件,针对不同屏幕提供不同的尺寸值。这也是资源限定符的一部分,可以合并进去。 总结一下,大概可以分为以下几个点: 1. 使用灵活的布局(ConstraintLayout、LinearLayout权重) 2. 尺寸单位选择(dp、sp,结合wrap_content/match_parent) 3. 资源限定符(不同dpi、尺寸、方向的资源目录) 4. 图片适配(矢量图、.9图、WebP) 5. 文字大小适配(sp、自定义字体缩放) 6. 百分比布局(ConstraintLayout的Guideline和百分比) 7. 使用Jetpack Compose 8. 多设备测试和刘海屏适配 可能需要调整顺序,按重要性和常用程度排列。例如,布局和尺寸单位应该放在前面,资源限定符次之,图片适配也很重要。Jetpack Compose作为较新的方法,可以放在后面。测试和刘海屏适配作为补充内容。 还要注意每个方法的优缺点,例如dp在跨设备时可能不够精确,需要结合其他方法。同时,适配刘海屏可能需要设置特定的属性,如android:windowLayoutInDisplayCutoutMode。 最后,确保回答结构清晰,分点明确,语言简洁,适合不同层次的开发者理解。可能还需要提到一些最佳实践,比如避免使用绝对布局,使用权重分配空间等。</think>Android UI适配主要解决不同屏幕尺寸、分辨率和像素密度的兼容性问题。以下是常用的适配方法: ### 1. 灵活布局方案 ```xml <!-- 使用ConstraintLayout实现比例布局 --> <androidx.constraintlayout.widget.ConstraintLayout> <Button app:layout_constraintHorizontal_bias="0.3" app:layout_constraintWidth_percent="0.5"/> </androidx.constraintlayout.widget.ConstraintLayout> ``` - **优势**:通过比例约束实现自适应 - **组合方案**:结合`LinearLayout`的`layout_weight`属性分配剩余空间 ### 2. 尺寸单位规范 | 单位 | 适用场景 | 示例 | |------|-------------------|--------------------| | dp | 控件尺寸 | `16dp`边距 | | sp | 文字大小 | `14sp`字体 | | wrap | 内容自适应 | `wrap_content`宽度 | | match| 填充父容器 | `match_parent`高度 | ### 3. 资源限定符适配 ``` res/ ├── values-sw320dp/ // 小屏设备 ├── values-sw600dp/ // 7寸平板 ├── values-sw720dp/ // 10寸平板 └── layout-land/ // 横屏布局 ``` - **dimens.xml**:定义不同屏幕的尺寸值 - **图片适配**:提供`hdpi/xhdpi/xxhdpi`等多套切图 ### 4. 矢量图形方案 ```xml <!-- 使用矢量图避免位图失真 --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> </vector> ``` - **格式选择**:优先使用VectorDrawable - **兼容方案**:SVG转Vector工具 + 兼容库 ### 5. 文字适配方案 - **基础方案**:使用`sp`单位自动适配系统字体缩放 - **高级方案**:通过`AutoSizeTextView`等第三方库实现精确控制 ### 6. 百分比适配方案 ```xml <!-- 使用Guideline实现百分比布局 --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:orientation="vertical" app:layout_constraintGuide_percent="0.3"/> ``` ### 7. 现代适配方案 **Jetpack Compose**: ```kotlin Box(modifier = Modifier .fillMaxWidth(0.8f) .aspectRatio(1f)) { Text("自适应内容") } ``` - **优势**:声明式UI + 自动响应式布局 ### 8. 特殊场景适配 - **刘海屏适配**:设置`windowLayoutInDisplayCutoutMode` - **折叠屏适配**:使用`Jetpack WindowManager`检测屏幕状态 ### 最佳实践组合 1. 基础布局:`ConstraintLayout` + 百分比约束 2. 尺寸定义:`dp/sp` + 多dimens方案 3. 图片资源:矢量图为主,位图提供3套基准切图 4. 文字处理:`sp`配合动态缩放库 5. 测试验证:使用Android Studio的多设备预览功能 ```groovy // 推荐基础配置 android { defaultConfig { vectorDrawables.useSupportLibrary = true } compileOptions { coreLibraryDesugaringEnabled true // 支持新版API } } ``` 通过组合使用这些方法,可以构建出适配90%以上Android设备的UI界面,建议根据项目需求选择3-4种核心方案进行深度整合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值