/** * 根据屏幕宽度设置高度值 */ 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(),这种方法已经不推荐了java
2.使用getSize():android
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这个成员,它有以下几个经常使用值:spa
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
获取方法:code
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)就得出对角线的长度了。ip
densityDpi是每英寸的点数(dots-per-inch)是打印机经常使用单位(于是也被称为打印分辨率),而不是每英寸的像素数get
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:it
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); }
咱们在布局文件中使用的dp/dip就是它。官方推荐使用dp是由于它会根据你设备的密度算出对应的像素。
公式为:pixel = dip*density
须要注意的是,咱们在Java代码中对控件设置宽高是不能够设置单位的,而其自带的单位是像素。因此若是动态修改控件大小时,
咱们的任务就来了,那就是将像素转换为dp。io
//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); }