Android 状态栏,标题栏,屏幕高度获取总结

工作这么久了,接触到的东西也越来越多,有时候会发现 一个误区,很多东西记住了,一段时间不用就会忘记,继续使用的时候又需要查找相关的资料。后来发现很多技术性的东西不能只靠记忆,记忆的东西太久不用也会生疏,会忘记,特别是关于一些技术性的东西,忘记得更快。所以平时更应该学会一种解决问题的方法,在工作中锻炼这种能力,并且多总结,我想这就是我工作这么久没有这样做,才进入了误区。


在之前的项目中曾经要获取状态栏和标题栏的高度,在此记录一下,作为总结方便以后查阅


1. Android应用显示区域简单介绍


状态栏:红色区域

标题栏:黄色区域

内容显示区域:绿色区域


状态栏

状态栏主要用来显示一些系统图标,应用的通知图标和系统时间。 Statusbar 模块就是控制和管理着这些图标,以及通知信息的显示和一些系统开关的。

状态栏的通知功能(包括时间,通知,系统状态等)

状态栏的日期显示

 

标题栏

显示应用的标题信息

标题栏可以不显示,不显示标题栏的方法:

1. 在activity的onCreate()函数中设置,

requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题栏

 
 

必须在setContentView(R.layout...)之前设置,否则会出错。

2.在AndroidManifest.xml文件设置,在需要配置不显示标题栏的具体activity中设置:

android:theme="@android:style/Theme.NoTitleBar">
 

2. 获取屏幕的宽和高

这里有两种方法可以获取

1. 使用Display类的getSize函数该方法返回屏幕的矩形大小,以像素为单位。Display提供关于屏幕尺寸和分辨率的信息,Display对象可以使用getDefaultDisplay函数获取,该方法返回在WindowManager实例上窗口的显示参数。

Point pt1 = new Point();
WindowManager wm = MainActivity.this.getWindowManager();
Display dp = wm.getDefaultDisplay();
dp.getSize(pt1);
tvScreenSize1.setText("屏幕宽高:" + pt1.x +" * " + pt1.y);

2.使用getMetrics,该方法传入DisplayMetrics对象,用来保描述此屏幕尺寸和分辨率的信息。

WindowManager wm = MainActivity.this.getWindowManager();
DisplayMetrics dm = newDisplayMetrics();
// 获取屏幕信息
wm.getDefaultDisplay().getMetrics(dm);
tvScreenSize2.setText("屏幕宽高:" + dm.widthPixels +" * " + dm.heightPixels);

3. 获取应用程序显示区域

应用程序通过函数getWindowVisibleDisplayFrame()来获取,它接收一个Rect类型的参数,用来存储获取的区域信息。getWindowVisibleDisplayFrame()是View类方法,该View的具体实例可以通过getWindow().getDecorView()获取到,decorView是window中的最顶层view,在这里我理解为可见的所有区域。代码如下:

Rect rt1 = new Rect();
View view = MainActivity.this.getWindow().getDecorView();
view.getWindowVisibleDisplayFrame(rt1);
tvAppSize.setText("应用程序宽高:" + rt1.width() +" * " + rt1.height());

4. 获取状态栏高度

状态栏的高度等于屏幕高度和应用显示区域的差值,代码如下:

intstatusHeight = rt1.top;
tvStatusHeight.setText("状态栏高度:" + statusHeight);

6. 标题栏高度

inttitleHeight = view.getTop() - statusHeight;
tvTitleHeight.setText("标题栏高度:" + titleHeight);

完整测试代码:
public class MainActivity extends Activity {

	private TextView tvScreenSize1 = null;
	private TextView tvScreenSize2 = null;
	private TextView tvAppSize = null;
	private TextView tvContentSize = null;
	private TextView tvStatusHeight = null;
	private TextView tvTitleHeight = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
//		requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题栏  
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tvScreenSize1 = (TextView)findViewById(R.id.tv_screen_1);
		tvScreenSize2 = (TextView)findViewById(R.id.tv_screen_2);
		tvAppSize = (TextView)findViewById(R.id.tv_app);
		tvContentSize = (TextView)findViewById(R.id.tv_content);
		tvStatusHeight = (TextView)findViewById(R.id.tv_status);
		tvTitleHeight = (TextView)findViewById(R.id.tv_title);
	}
	
	@SuppressLint("NewApi")
	@Override
	public void onWindowFocusChanged(boolean hasFocus) {
		// TODO Auto-generated method stub
		super.onWindowFocusChanged(hasFocus);
		Point pt1 = new Point();
		WindowManager wm = MainActivity.this.getWindowManager();
		Display dp = wm.getDefaultDisplay();
		dp.getSize(pt1); 
		tvScreenSize1.setText("屏幕宽高: " + pt1.x + " * " + pt1.y);
		
		DisplayMetrics dm = new DisplayMetrics();
		// 获取屏幕信息
		wm.getDefaultDisplay().getMetrics(dm);
		tvScreenSize2.setText("屏幕宽高: " + dm.widthPixels + " * " + dm.heightPixels);
		
		Rect rt1 = new Rect();
		View view = MainActivity.this.getWindow().getDecorView();
		view.getWindowVisibleDisplayFrame(rt1);
		tvAppSize.setText("应用程序宽高: " + rt1.width() + " * " + rt1.height());
		
		int statusHeight = rt1.top;
		tvStatusHeight.setText("状态栏高度: " + statusHeight);
		
		Rect rt2 = new Rect();
		view = MainActivity.this.getWindow().findViewById(Window.ID_ANDROID_CONTENT);
		view.getDrawingRect(rt2);
		tvContentSize.setText("应用程序内容宽高: " + rt2.width() + " * " + rt2.height());
		
//		Rect rt3 = new Rect();
//		view = MainActivity.this.getWindow().getDecorView();
//		view.getWindowVisibleDisplayFrame(rt3);
		
		int titleHeight = view.getTop() - statusHeight;
		tvTitleHeight.setText("标题栏高度: " + titleHeight);
	}
}



 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值