android屏幕高度、状态栏高度、titlebar高度详解

一、屏幕高度、状态栏高度、titlebar高度区分


二、获取整个屏幕的高度


DisplayMetrics dm = new DisplayMetrics();  
getWindowManager().getDefaultDisplay().getMetrics(dm);  
Log.e("Allence", "屏幕高:" + dm.heightPixels);

三、获取状态栏的高度

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("Allence", "状态栏-方法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("Allence", "状态栏-方法2:" + statusBarHeight2); 
三、标题栏(titlebar)高度的测量

1.如果设置了requestWindowFeature(Window.FEATURE_NO_TITLE)标题栏高度为0

2.获取标题栏高度的方法:

			      //屏幕  
		        DisplayMetrics dm = new DisplayMetrics();  
		        getWindowManager().getDefaultDisplay().getMetrics(dm);  
		        Log.e("WangJ", "屏幕高:" + dm.heightPixels);  
		  
		        //应用区域  
		        Rect outRect1 = new Rect();  
		        getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);  
		          
		        //View绘制区域  
		        Rect outRect2 = new Rect();  
		        getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect2);   
		        int viewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();   //要用这种方法  
		        
		        
		      //获取status_bar_height资源的ID  
		      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");  
		      if (resourceId > 0) {  
		          //根据资源ID获取响应的尺寸值  
		          statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);  
		      }  
		        
		        
		        titleHeight1 = viewTop - outRect1.top; 
		       		    	      		         
		         System.out.println(titleHeight1+"***************titleHeight1");

注意:在oncreat()方法中得到的titlebar的高度为0



四、随着手指移动的控件:

iv.setOnTouchListener(new OnTouchListener() {
			
			private int startx;
			private int starty;
	

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				 int ea = event.getAction();
		            DisplayMetrics dm = getResources().getDisplayMetrics();
		            int screenWidth = dm.widthPixels;
                            
//这里如果screenHeight的长度是屏幕的长度因为屏幕的绘制区小于屏幕的总长度,所以控件会划出屏幕下方,
//所以这里screenHeight应该是屏幕长度减去标题栏(titlebar)的长度和状态栏(statusBar)的长度
int screenHeight = dm.heightPixels-titleHeight1-statusBarHeight1;
            System.out.println(screenHeight);
            switch (ea) {
                case MotionEvent.ACTION_DOWN:
                startx = (int) event.getRawX();//获取触摸事件触摸位置的原始X坐标
                starty = (int) event.getRawY();
                case MotionEvent.ACTION_MOVE:
                    //event.getRawX();获得移动的位置
                    int dx = (int) event.getRawX() - startx;
                    int dy = (int) event.getRawY() - starty;
                    int l = v.getLeft() + dx;
                    int b = v.getBottom() + dy;
                    int r = v.getRight() + dx;
                    int t = v.getTop() + dy;


                    //下面判断移动是否超出屏幕
                    if (l < 0) {
                        l = 0;
                        r = l + v.getWidth();
                    }
                    if (t < 0) {
                        t = 0;
                        b = t + v.getHeight();
                    }
                    if (r > screenWidth) {
                        r = screenWidth;
                        l = r - v.getWidth();
                    }
                    if (b > screenHeight) {
                        b = screenHeight;
                        t = b - v.getHeight();
                    }
                    
                    v.layout(l, t, r, b);
                    Log.e("sss", "onTouch: " +l+"=="+t+"=="+r+"=="+b);
                    startx = (int) event.getRawX();
                    starty = (int) event.getRawY();
                    v.postInvalidate();
//                     v.invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    break;



}
return true;
}
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值