工作这么久了,接触到的东西也越来越多,有时候会发现 一个误区,很多东西记住了,一段时间不用就会忘记,继续使用的时候又需要查找相关的资料。后来发现很多技术性的东西不能只靠记忆,记忆的东西太久不用也会生疏,会忘记,特别是关于一些技术性的东西,忘记得更快。所以平时更应该学会一种解决问题的方法,在工作中锻炼这种能力,并且多总结,我想这就是我工作这么久没有这样做,才进入了误区。
在之前的项目中曾经要获取状态栏和标题栏的高度,在此记录一下,作为总结方便以后查阅
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);
}
}