Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發:獲取屏幕寬和高的兩種方法(px、dip、分辨率之間的關系及px與dip互相轉化)

Android開發:獲取屏幕寬和高的兩種方法(px、dip、分辨率之間的關系及px與dip互相轉化)

編輯:關於Android編程

獲取屏幕寬和高的兩種方法

方法一、代碼如下:
		WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
		Display display = wm.getDefaultDisplay();
		Log.i(tag, 屏幕尺寸1: 寬度 = +display.getWidth()+高度 = :+display.getHeight()
				);

方法二、代碼如下:
DisplayMetrics dm =getResources().getDisplayMetrics();
		int w_screen = dm.widthPixels;
		int h_screen = dm.heightPixels;
		Log.i(tag, 屏幕尺寸2:寬度 =  + w_screen + 高度 =  + h_screen + 密度 =  + dm.densityDpi);

方法一的方法已經被遺棄了,推薦用方法2的方法,除獲得屏幕的寬和高外還可以獲得屏幕的密度。這裡必須注意,獲得的尺寸單位為px,即像素,而不是屏幕的絕對尺寸。在G700上得到的參數如下:
	Line 1297: 12-08 11:39:09.037 I/yan     (13602): 屏幕尺寸1: 寬度 = 720高度 = :1280
	Line 1299: 12-08 11:39:09.037 I/yan     (13602): 屏幕尺寸2:寬度 = 720高度 = 1280密度 = 320

在Geek手機上參數如下:
	Line 1511: 01-06 03:11:20.839 I/yan     (30175): 屏幕尺寸1: 寬度 = 1080高度 = :1920
	Line 1513: 01-06 03:11:20.839 I/yan     (30175): 屏幕尺寸2:寬度 = 1080高度 = 1920密度 = 480

可以看到,同樣是5.0寸的屏幕,一個密度是320,一個密度是480.同樣的物理寬度,後者是1080個像素而前者是720個像素。

px與dip的概念及互相轉化

px即pixels,是絕對像素,有多少個像素點就是多少個像素點。dip即device independent pixel,設備獨立像素,無像素無關。二者轉換公式如下:
package org.yanzi.util;

import android.content.Context;

public class DisplayUtil {
	public static int dip2px(Context context, float dipValue){            
		final float scale = context.getResources().getDisplayMetrics().density;                 
		return (int)(dipValue * scale + 0.5f);         
	}            
	public static int px2dip(Context context, float pxValue){                
		final float scale = context.getResources().getDisplayMetrics().density;                 
		return (int)(pxValue / scale + 0.5f);         
	} 
}
轉換時牽涉到一個密度的概念,密度越大,單位物理尺寸上的像素點就越多,dip也就越大。從轉換公式上也可以看到,px近似等於dip*density。dip跟dp一個意思,在android開發中推薦像素使用dip概念。舉個簡單的例子,如果掃描矩形框的長度為300px,在density為320和480的手機屏幕上顯示效果是完全不一樣的,因此單位要使用dip。但是在使用canvas繪制東西時,所依照的坐標系、Rect等單位都是px,所以其尺寸要以dip為單位,而坐標要以px為單位。假設要以屏幕的中心為正方形的中心,畫一個邊長為D的正方形,設D = 240dip. 代碼如下:
		Point center_dip = new Point(DisplayUtil.px2dip(this, dm.widthPixels)/2,
				DisplayUtil.px2dip(this, dm.heightPixels)/2); //以dip為單位的中心

		square_screen = new Rect(DisplayUtil.dip2px(this, center_dip.x - D/2),
				DisplayUtil.dip2px(this,center_dip.y - D/2),
				DisplayUtil.dip2px(this,center_dip.x + D/2),
				DisplayUtil.dip2px(this,center_dip.y + D/2));
首先得到dip為單位的屏幕中心,然後以D(單位dip)得到單位為dip的正常性坐標,再將其轉換成單位為px的坐標,這樣在不同的手機上顯示效果就是一樣的。其實可以這麼看待dip,dip有點類似手機的物理尺寸,盡管實際上不是。dip = px/density,geek 5.0寸屏跟G700,得到的結果是一樣的:1080/3 = 720/2
總結:densityDpi 每英寸多少個像素點,density = densityDpi /160APP根據densityDpi的大小決定調用哪個文件夾下的圖片,關系如下:drawable-ldpi 底密度,通常是指120
drawable-mdpi 中等密度,通常是指160
drawable-xhdpi 超高密度,通常是指320
px = dip*density 在繪制矩形時,可以首先獲得屏幕寬度的dip,根據dip決定邊長D,然後用文中的方法確定其px坐標。來張效果圖:

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved