一、获取控件宽度和高度
/**
* 根据屏幕宽度设置高度值
*/
private int getHeight() {
//获取屏幕宽度
DisplayMetrics dm = new DisplayMetrics();
double densityDpi = dm.density;
//获取屏幕信息
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels;
int height = (int) (screenWidth - 5 * densityDpi) / 6;//每个图片的宽度
return height;
}
//控件设置高度
android.view.ViewGroup.LayoutParams lp = holder.layout_items.getLayoutParams();
lp.height = getHeight();
二、获取屏幕分辨率
1.使用的getHeight()与getWidth(),这种方法已经不推荐了
2.使用getSize():
private void getDisplayInfomation() {
Point point = new Point();
getWindowManager().getDefaultDisplay().getSize(point);
Log.d(TAG,"the screen size is "+point.toString());
}
3.使用getRealSize()
private void getDisplayInfomation() {
Point point = new Point();
getWindowManager().getDefaultDisplay().getSize(point);
Log.d(TAG,"the screen size is "+point.toString());
getWindowManager().getDefaultDisplay().getRealSize(point);
Log.d(TAG,"the screen real size is "+point.toString());
}
三、屏幕密度
屏幕密度与DPI这个概念紧密相连,DPI全拼是dots-per-inch,即每英寸的点数。也就是说,密度越大,每英寸内容纳的点数就越多。
android.util包下有个DisplayMetrics类可以获得密度相关的信息。
最重要的是densityDpi这个成员,它有如下几个常用值:
DENSITY_LOW = 120
DENSITY_MEDIUM = 160 //默认值
DENSITY_TV = 213 //TV专用
DENSITY_HIGH = 240
DENSITY_XHIGH = 320
DENSITY_400 = 400
DENSITY_XXHIGH = 480
DENSITY_XXXHIGH = 640
获取方法:
private void getDensity() {
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
Log.d(TAG,"Density is "+displayMetrics.density+" densityDpi is "+displayMetrics.densityDpi+" height: "+displayMetrics.heightPixels+
" width: "+displayMetrics.widthPixels);
}
计算屏幕尺寸:
首先求得对角线长,单位为像素。
然后用其除以密度(densityDpi)就得出对角线的长度了。
densityDpi是每英寸的点数(dots-per-inch)是打印机常用单位(因而也被称为打印分辨率),而不是每英寸的像素数
private void getScreenSizeOfDevice() {
DisplayMetrics dm = getResources().getDisplayMetrics();
int width=dm.widthPixels;
int height=dm.heightPixels;
double x = Math.pow(width,2);
double y = Math.pow(height,2);
double diagonal = Math.sqrt(x+y);
int dens=dm.densityDpi;
double screenInches = diagonal/(double)dens;
Log.d(TAG,"The screenInches "+screenInches);
}
修改方法,引用PPI:
private void getScreenSizeOfDevice2() {
Point point = new Point();
getWindowManager().getDefaultDisplay().getRealSize(point);
DisplayMetrics dm = getResources().getDisplayMetrics();
double x = Math.pow(point.x/ dm.xdpi, 2);
double y = Math.pow(point.y / dm.ydpi, 2);
double screenInches = Math.sqrt(x + y);
Log.d(TAG, "Screen inches : " + screenInches);
}
四、DIP
我们在布局文件中使用的dp/dip就是它。官方推荐使用dp是因为它会根据你设备的密度算出对应的像素。
公式为:pixel = dip*density
需要注意的是,我们在Java代码中对控件设置宽高是不可以设置单位的,而其自带的单位是像素。所以如果动态修改控件大小时,
我们的任务就来了,那就是将像素转换为dp。
//pixel = dip*density;
private int convertDpToPixel(int dp) {
DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();
return (int)(dp*displayMetrics.density);
}
private int convertPixelToDp(int pixel) {
DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();
return (int)(pixel/displayMetrics.density);
}