-
2019-10-18 22:18:02
转载自:https://www.jianshu.com/p/19243c9c66b8
QRect desktopRect = QApplication::desktop()->availableGeometry(); int iTitleBarHeight = style()->pixelMetric(QStyle::PM_TitleBarHeight); // 获取标题栏高度 setGeometry(0, iTitleBarHeight, desktopRect.width(), desktopRect.height() - iTitleBarHeight); // 设置窗体充满桌面客户区 setFixedSize(desktopRect.width(), desktopRect.height() - iTitleBarHeight); // 固定窗体大小
更多相关内容 -
MFC对话框标题栏的隐藏和高度设置
2019-02-18 14:12:26该示例演示MFC对话框的标题栏隐藏、显示和高度、边框的调整。 -
获取分辨率,状态栏标题栏高度
2012-06-29 17:29:21获取屏幕分辨率的方法,获取状态栏高度以及标题栏高度的方法 -
Android如何获取屏幕、状态栏及标题栏的高度详解
2020-08-29 03:18:49在日常开发中,经常会遇到获取屏幕高度、状态栏高度等需求,所以下面这篇文章就给大家总结介绍了关于Android如何获取屏幕、状态栏及标题栏高度的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们可以参考下... -
Android完美获取状态栏高度、标题栏高度、编辑区域高度的获取
2019-04-12 17:16:13日常开发中我们经常会因为绘图、绘制自定义组件、定位组件或者是计算布局高度需要减去状态栏高度等需要来获取Activity界面中状态栏、标题栏的高度。但很多人马上要拿起来就用还是会遇到各种各样的问题,一时要查很多...日常开发中我们经常会因为绘图、绘制自定义组件、定位组件或者是计算布局高度需要减去状态栏高度等需要来获取Activity界面中状态栏、标题栏的高度。但很多人马上要拿起来就用还是会遇到各种各样的问题,一时要查很多资料,很是不爽!今天也是猛然发现这个问题费了不少时间,终于有所收获,特地记录下来,希望给遇到同样问题的你一点帮助,也给以后留个笔记。废话少说,开始正题吧——
一、Activity界面区域划分
先上一张图统一一下认识,有图好说话:
简单说明一下(上图Activity采用默认Style,状态栏和标题栏都会显示):最大的草绿色区域是屏幕界面,红色次大区域我们称之为“应用界面区域”,最小紫色的区域我们称之为“View绘制区域”;屏幕顶端、应用界面区之外的那部分显示手机电池网络运营商信息的为“状态栏”,应用区域顶端、View绘制区外部显示Activity名称的部分我们称为“标题栏”。
二、状态高度的测量
状态栏是显示显示手机状态(如电池电量、网络状态、时间、运营商信息等)的区域,一般内容型应用都会显示保留状态栏,但是游戏界面如果还保留状态栏就不合适了,因为游戏界面要响应各种手势,而状态栏也会响应一些手势,有可能引发错误操作,所以一般在游戏界面都会隐藏状态栏,使游戏界面全屏显示,关于设置全屏请查看《Android设置Activity全屏的两种方式及Theme属性解析》,继续看状态栏高度测量:
状态栏高度的测量我在这里提供4种方法:
(1)通过系统尺寸资源获取
状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使用的,例如像通常使用系统资源那样android.R.dimen.status_bar_height。但是系统给我们提供了一个Resource类,通过这个类可以获取资源文件,借此可以获取到status_bar_height:
/** * 获取状态栏高度——方法1 * */ int statusBarHeight1 = -1; //获取status_bar_height资源的ID int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { //根据资源ID获取响应的尺寸值 statusBarHeight1 = getResources().getDimensionPixelSize(resourceId); } Log.e("WangJ", "状态栏-方法1:" + statusBarHeight1);
看结果:
(2)通过R类的反射
大家都知道Android的所有资源都会有惟一标识在R类中作为引用。我们也可以通过反射获取R类的实例域,然后找status_bar_height:
/** * 获取状态栏高度——方法2 * */ int statusBarHeight2 = -1; try { Class<?> clazz = Class.forName("com.android.internal.R$dimen"); Object object = clazz.newInstance(); int height = Integer.parseInt(clazz.getField("status_bar_height") .get(object).toString()); statusBarHeight2 = getResources().getDimensionPixelSize(height); } catch (Exception e) { e.printStackTrace(); } Log.e("WangJ", "状态栏-方法2:" + statusBarHeight2);
看结果:
(3)借助应用区域的top属性
这就用到了开题时的那张屏幕区域划分图片,状态栏位于屏幕最顶端,其位置从(0,0)开始,故而应用区域的顶端位置(高度 = Y坐标 - 0)即为状态栏的高度:
/** * 获取状态栏高度——方法3 * 应用区的顶端位置即状态栏的高度 * *注意*该方法不能在初始化的时候用 * */ Rect rectangle= new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle); //高度为rectangle.top-0仍为rectangle.top Log.e("WangJ", "状态栏-方法3:" + rectangle.top);
看结果:
*注意* 如果单单获取statusBar高度而不获取titleBar高度时,这种方法并不推荐大家使用,因为这种方法依赖于WMS(窗口管理服务的回调)。正是因为窗口回调机制,所以在Activity初始化时执行此方法得到的高度是0,这就是很多人获取到statusBar高度为0的原因。这个方法推荐在回调方法onWindowFocusChanged()中执行,才能得到预期结果。
(4)借助屏幕和应用区域高度
还是看屏幕区域划分图,是不是状态栏占满了屏幕中除应用区域之外的全部呢?所以直接上代码:
/** * 获取状态栏高度——方法4 * 状态栏高度 = 屏幕高度 - 应用区高度 * *注意*该方法不能在初始化的时候用 * */ //屏幕 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); //应用区域 Rect outRect1 = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1); int statusBar = dm.heightPixels - outRect1.height(); //状态栏高度=屏幕高度-应用区域高度 Log.e("WangJ", "状态栏-方法4:" + statusBar);
看结果:
有人看完会说,What Are You弄啥嘞,小学数学题!秀智商?——呵呵,是的!其实3、4这两种方法其实本质是一样,所以如果单单获取statusBar高度而不获取titleBar高度时也不推荐大家使用,理由同上方法3。三、标题栏高度的测量
搞懂了上边的原理,标题栏高度的测量也就手到擒来啦,依旧是屏幕区域划分图。这里也给出两种方法,先给出公共代码吧,就是获取各区域(*注意*依旧是在Activity的回调方法onWindowFocusChanged()中执行,才能得到预期结果):
//屏幕 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); Log.e("WangJ", "屏幕高:" + dm.heightPixels); //应用区域 Rect outRect1 = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1); Log.e("WangJ", "应用区顶部" + outRect1.top); Log.e("WangJ", "应用区高" + outRect1.height()); //View绘制区域 Rect outRect2 = new Rect(); getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect2); Log.e("WangJ", "View绘制区域顶部-错误方法:" + outRect2.top); //不能像上边一样由outRect2.top获取,这种方式获得的top是0,可能是bug吧 int viewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); //要用这种方法 Log.e("WangJ", "View绘制区域顶部-正确方法:" + viewTop); Log.e("WangJ", "View绘制区域高度:" + outRect2.height());
先看一下信息:
以手到擒来了吧,有没有遇到获取View绘制区时列出来的那个outRect2.top=0的问题呢?原因我们还没搞懂呢,哪位大侠搞懂了留言给个贡献值啊,求教了!
(1)top-top
直接看代码,文笔不好(其实是懒得写字):
/** * 获取标题栏高度-方法1 * 标题栏高度 = View绘制区顶端位置 - 应用区顶端位置(也可以是状态栏高度,获取状态栏高度方法3中说过了) * */ int titleHeight1 = viewTop - outRect1.top; Log.e("WangJ", "标题栏高度-方法1:" + titleHeight1);
看结果:
(你要是也想秀智商,可以吧注释括号里的拿出来再做一种方法哦,我就不秀了,再秀你都嫌我恶心了^_^)
(2)高度-高度
还是看代码,有注释:
/** * 获取标题栏高度-方法2 * 标题栏高度 = 应用区高度 - View绘制区高度 * */ int titleHeight2 = outRect1.height() - outRect2.height(); Log.e("WangJ", "标题栏高度-方法2:" + titleHeight2);
看结果:
四、注意事项
*注意*
(1)不管你是否设置全屏模式,或是不显示标题栏,在使用获取状态栏高度方法1和获取状态栏高度方法2都会测量到状态栏的高度,理解原理就不难解释——系统资源属性是固定的、真实的,不管你是否隐瞒(隐藏或者显示),它都在那里;
(2)但是若使用获取状态栏高度方法3和获取状态栏高度方法4,以及获取标题栏高度方法1和获取标题栏高度方法2,都是依赖于WMS,是在界面构建后根据View获取的,所以显示了就有高度,不显示自然没高度了。
如果你没时间验证(或者是懒),我就勉为其难给你验证一下吧:
先设置Activity全屏:
<activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
屏幕各区域获取不变;
输出StatusBar和titleBar高度信息:
int titleHeight1 = viewTop - outRect1.top; Log.e("WangJ", "验证Statue高度:" + titleHeight1); Log.e("WangJ", "验证Title高度:" + outRect1.top);
看结果:
就这么多把,感觉解释得挺清楚了。
---------------------
作者:衷水木
原文:https://blog.csdn.net/a_running_wolf/article/details/50477965 -
Android 获取屏幕高度,标题高度,状态栏高度(实例代码)
2020-09-04 22:26:44getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view就是程序不包括标题栏的部分,然后就可以知道标题栏的高度了 -
Android-获取手机屏幕大小屏幕分辨率屏幕密度导航栏高度标题栏高度
2019-08-13 05:23:21获取手机屏幕大小,屏幕分辨率,屏幕密度,导航栏高度,标题栏高度 -
Delphi 获取菜单高度、标题栏高度、边框高度函数GetSystemMetrics
2019-09-21 14:37:02项目中需要获取不同分辨率德菜单高度,必应搜索了一下,可以用GetSystemMetrics函数实现,代码如下:欢迎加入Delphi知识局QQ群:32422310 unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System....项目中需要获取不同分辨率德菜单高度,必应搜索了一下,可以用GetSystemMetrics函数实现,代码如下:欢迎加入Delphi知识局QQ群:32422310
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus; type TForm1 = class(TForm) MainMenu1: TMainMenu; N11: TMenuItem; N2221: TMenuItem; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var MenuItemHeight:integer; begin MenuItemHeight:= GetSystemMetrics(SM_CYMENUCHECK); end; end.
如果菜单折叠,可用以下代码:
type TMenuBarInfo = record cbSize: DWORD; rcBar: TRect; hMenu: HMENU; hwndMenu: HWND; fBarFocused: Byte; fFocused: Byte; end; {$EXTERNALSYM GetMenuBarInfo} function GetMenuBarInfo(hend: HWND; idObject, idItem: ULONG; var pmbi: TMenuBarInfo): BOOL; stdcall; implementation function GetMenuBarInfo; external user32 name 'GetMenuBarInfo'; procedure TForm1.Button1Click(Sender: TObject); var MenuHeight: Integer; MenuBarInfo: TMenuBarInfo; begin MenuBarInfo.cbSize := SizeOf(MenuBarInfo); if GetMenuBarInfo(Handle, OBJID_MENU, 0, MenuBarInfo) then MenuHeight := MenuBarInfo.rcBar.Bottom - MenuBarInfo.rcBar.Top else ... ... end;
或者
procedure TForm1.Button1Click(Sender: TObject);
var
pm : TTPMParams;
DisplayPoint : TPoint;
r: TRect;
begin
Systemparametersinfo( spi_getworkarea, 0, @r, 0 );
r.top := r.bottom + 1;
r.bottom := screen.height;DisplayPoint := Point( 699, r.top );
with pm, pm.rcexclude do
begin
Top := r.top;
Bottom := r.bottom;
Left := 0;
Right := screen.width;
cbSize := SizeOf(pm);
end;
TrackPopupMenuEx( PopupMenu1.Handle, TPM_VERTICAL or TPM_HORIZONTAL,
DisplayPoint.x, DisplayPoint.y, Handle, @pm );
end;该函数也可以用于获取屏幕分辨率
GetSystemMetrics(
nIndex: Integer {参数, 详见下表}
): Integer;
举例 - 获取屏幕分辨率:var
cx,cy: Integer;
begin
{通过 GetSystemMetrics 函数获取屏幕分辨率}
cx := GetSystemMetrics(SM_CXSCREEN);
cy := GetSystemMetrics(SM_CYSCREEN);
ShowMessageFmt('Width:%d; Height:%d', [cx,cy]);
{通过 Screen 对象获取屏幕分辨率}
cx := Screen.Width;
cy := Screen.Height;
ShowMessageFmt('Width:%d; Height:%d', [cx,cy]);
end;procedure TForm1.Button9Click(Sender: TObject); var frameh,captionh,menuh: Integer; str:string; begin //边框高 frameh := GetSystemMetrics(SM_CXFRAME); //标题高 captionh := GetSystemMetrics(SM_CYCAPTION); //菜单高 menuh:=GetSystemMetrics(SM_CYMENU); str:= inttostr( frameh)+' '+inttostr(captionh)+' '+inttostr(menuh) ; memo1.text:=str; end;
-
主流安卓APP(TIM、QQ)的标题栏高度值是多少?
2018-09-27 13:37:51安卓默认的标题栏高度相对于现在主流的APP来说实在是高了些,想把自己的入门APP做的精美一些,参考了腾讯的TIM,觉得他的标题栏非常的美观协调,想问问各位大神,TIM的标题栏的高度值是多少? 标题栏高度值是这个... -
Android之获取屏幕的尺寸像素及获取状态栏标题栏高度
2021-06-03 16:06:03// 状态栏和标题栏的总高度 这样我们就获取了状态栏和状态栏加标题栏的总高度了,那么,显而易见,标题栏的高度就是用总高度减去状态栏的高度即可!!!【注】android屏幕都是以像素为单位的,进行相关计算或者设置...在Android的实际开发中,会经常用到获取屏幕的尺寸的问题,以便设置一些布局在屏幕上的固定位置,从而适配各个屏幕的设备。
今天我就来讲一下怎么得到当前设备的屏幕像素吧:
一、在Activity中:
Display display = getWindowManager().getDefaultDisplay();//得到当前屏幕的显示器对象
Point size = new Point();//创建一个Point点对象用来接收屏幕尺寸信息
display.getSize(size);//Point点对象接收当前设备屏幕尺寸信息
int width = size.x;//从Point点对象中获取屏幕的宽度(单位像素)
int height = size.y;//从Point点对象中获取屏幕的高度(单位像素)
Log.v("zxy", "width="+width+",height="+height);//width=480,height=854可知手机的像素是480x854的
二、不在Activity中:
通过WINDOW_SERVICE对象获得默认的Display对象
WindowManager wm = (WindowManager) Context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();//然后获得屏幕像素就和第一个方法的一样了
三、如果没有getSize()方法,就通过getWidth()和getHeight()来获得,因为getSize()是新API引入的:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth(); // 获得宽度像素
int height = display.getHeight(); // 获得屏幕高度像素
上面这些代码,就是获得屏幕的尺寸信息的,然后可以通过所获取的宽度或高度去乘以一个百分比来设置一个控件的宽高,从而达到适配的作用。
当然还有一种方式获得屏幕的像素的,就是通过DisplayMetrics对象来获得,这个的意思就是获得一个界面度量对象,用来获得当前屏幕的高和宽,实现方式如下:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;//获得屏幕高度
int width = metrics.widthPixels;//获得屏幕宽度
好了,获取屏幕的像素大小就说到这了,顺便补充一个常用的开发技术:
获取状态栏和标题栏的高度
废话不多说,直接贴代码吧:
Rect frame = new Rect();//创建一个空的矩形对象
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);//获得顶层窗口的装饰视图,即状态栏,然后把状态栏显示的框架填充给刚刚我们创建的矩形对象,再通过矩形对象来获取状态栏高度
int statusBarHeight = frame.top;// 获取状态栏高度:frame.top
Log.v("zxy1", statusBarHeight+"");//打印出来的值为:38,即状态栏高度为38px
View v = getWindow().findViewById(Window.ID_ANDROID_CONTENT);// /获得根视图,
int allHeight = v.getTop();// 状态栏和标题栏的总高度
这样我们就获取了状态栏和状态栏加标题栏的总高度了,那么,显而易见,标题栏的高度就是用总高度减去状态栏的高度即可!!!【注】android屏幕都是以像素为单位的,进行相关计算或者设置宽高时注意转化单位,这里给出一个dp转px的方法:
public int Dp2Px(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
直接拿来用就行啦~~~
转载请注明出处---------
-
自定义deepin标题栏高度与标题栏最大最小化按钮宽度与高度
2021-01-22 22:47:33由于deepin下默认的标题栏对于第三方程序较丑,需要另外设置标题栏高度(本来是最好取消该系统标题栏,但是我并未找到对应方法,只能退而求其次)。 =>本方法在deepin20.1版本上测试有效,参照这篇博客, mkdir -... -
Android获取状态栏高度、标题栏高度、编辑区域高度的获取
2017-11-19 12:00:34http://blog.csdn.net/a_running_wolf/article/details/50477965日常开发中我们经常会因为绘图、绘制自定义组件、定位组件或者是计算布局高度需要减去状态栏高度等需要来获取Activity界面中状态栏、标题栏的高度。... -
winform 如何正确的获取窗体的标题栏高度
2019-10-02 18:11:04最近我需要知道鼠标在一个控件里的相对位置,鼠标相对于屏幕的位置我是可以知道的,所以只要...最后经过分析,是由于获取标题栏高度不正确导致的,当搜索如何获取标题栏高度时 所有的答案都是child.Height - chil... -
Andorid状态栏标题栏高度的坑
2018-11-02 15:17:54处理点击事件来进行对一个View的移动时,记得要把状态栏的高度去掉,还有标题栏的高度去掉(如果主题是没有标题的,则不需要),还有一点 Window.ID_ANDROID_CONTENT这个布局包含了状态栏跟标题栏 计算状态栏 //... -
Win10窗口标题栏高度及滚动条宽度怎么设置.docx
2021-09-27 02:22:20Win10窗口标题栏高度及滚动条宽度怎么设置.docx -
微信小程序顶部导航栏自定义,根据不同手机自适应距离状态栏高度,防止标题栏高度歪歪扭扭
2019-03-26 19:12:04微信小程序顶部导航栏自定义,根据不同手机自适应距离状态栏高度 一、微信小程序顶部导航栏自定义 "navigationStyle": "custom" app.json "window": { "backgroundTextStyle": "dark", ... -
[C#]获取窗口客户区域、标题栏高度、菜单栏高度、边框宽度正确方法
2019-09-30 09:41:00一直以来都没真正理解窗体宽高和菜单宽高以及客户区域的宽高,今天测试一下发现收获了很多知识,在C#中如果FormStyle是FixedSingle,那么窗体这个this.Width就是客户区域+标题栏,先前一直以为菜单栏和客户区域分布... -
GTKTitleBar:GNOME扩展,删除非GTK软件的标题栏(最大化时)
2021-05-03 01:47:29GTK标题栏-删除非GTK软件的标题栏 当您最大化Spotify和Qt5应用程序的窗口时,此扩展程序仅会删除它们的标题栏。 与Unite(另一个具有类似功能的扩展)不同,它不会删除GTK应用程序的窗口按钮。 对系统的默认行为... -
Qt5窗口标题栏高度
2016-11-08 09:49:00// 获取标题栏高度 setGeometry(0, iTitleBarHeight, desktopRect.width(), desktopRect.height() - iTitleBarHeight); // 设置窗体充满桌面客户区 setFixedSize(desktopRect.width(), desktopRect.height() ... -
gnome3 调整标题栏高度
2018-10-06 17:54:00适用于:gtk 3.20 + 1. 在用户主目录 ~/.config/gtk3.0/ 下新建gtk.css文件; 2. 复制如下css值; 1 headerbar.default-decoration { 2 padding-top: 3px; ... /* 标题栏高度 */ 5 ... -
获取标题栏高度的资源
2010-06-30 17:01:12获取标题栏高度 获取标题栏高度 获取标题栏高度 获取标题栏高度 -
状态栏高度和标题栏高度
2015-12-31 21:40:43参考于:...//得到状态栏的高度statusHeight Rect frame = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int statusHeight = frame.to -
android 获取状态栏高度, 获取标题栏高度
2016-03-24 15:01:23android 获取状态栏高度, 获取标题栏高度 -
获取状态栏高度、获取标题栏高度、获取编辑区域高度
2018-02-23 18:09:52* 获取状态栏高度——方法3 * 应用区的顶端位置即状态栏的高度 * 注意 该方法不能在初始化的时候用 * */ Rect rectangle= new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame... -
Delphi无标题栏改变窗口大小..rar
2019-04-18 08:51:46Delphi无标题栏改变窗口大小..rar` -
Qt对话框标题栏修改技巧
2018-09-21 15:36:31Qt对话框标题栏修改技巧 包括隐藏标题栏、标题栏透明等。 -
qt 的顶部标题栏(ActionBar)
2015-12-29 10:24:37顶部标题栏(ActionBar),这个项目是基于qt for android的版本,不过也适用于桌面版本。