一.屏幕实际宽度、高度、像素密度的获取
public static String getDisplayMetrics(Context cx) {
String str = "";DisplayMetrics dm = new DisplayMetrics();
//取得DisplayMetrics对象方法一
//dm = cx.getApplicationContext().getResources().getDisplayMetrics();
//取得DisplayMetrics对象方法二
((Activity)cx).getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;
float density = dm.density;
float xdpi = dm.xdpi;
float ydpi = dm.ydpi;
str += "The absolute width:" + String.valueOf(screenWidth) + "pixels\n";
str += "The absolute heightin:" + String.valueOf(screenHeight) + "pixels\n";
str += "The logical density of the display.:" + String.valueOf(density)
+ "\n";
str += "X dimension :" + String.valueOf(xdpi) + "pixels per inch\n";
str += "Y dimension :" + String.valueOf(ydpi) + "pixels per inch\n";
return str;
}
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
mDisplayWidth = display.getWidth();
mDisplayHeight = display.getHeight();
二、计算像素密度
参考:http://www.2cto.com/kf/201504/391287.html
<code>手机型号:G700
手机分辨率:
1280
*
720
(注:手机两个直角边上分别放置了
1280
及
720
个像素点)
手机尺寸大小:
5
英寸(手机斜边长度)
假设a,b分别为两个直角边,c为斜边,由勾股定理可得出计算方式:sqrt(a*a+b*b)/c
计算结果:sqrt(
1280
*
1280
+
720
*
720
)/
5
≈
293
.72dpi
根据google官方文档说明得出,当前手机最接近320dpi,则将其归纳在xhdpi手机范围内,即1dp=2px;
</code>
<code>手机型号:模拟器
手机分辨率:
800
*
480
(注:手机两个直角边上分别放置了
800
及
480
个像素点)
手机尺寸大小:
3.7
英寸(手机斜边大小)
计算结果:sqrt(
800
*
800
+
480
*
480
)/
3.7
≈
252
.15dpi
根据google官方文档(图
1
-
1
)得出,当前手机接近240dpi,则将其归纳在hdpi手机范围内,即1dp=
1
.5px。
参照以上方式可将市场上大多数手机划分为
5
个像素密度等级,分别为:
ldpi:120dpi,像素密度与dp转换关系为:1dp =
0
.75px
mdpi:160dpi ,像素密度与dp转换关系为:1dp = 1px
hdpi:240dpi,像素密度与dp转换关系为:1dp =
1
.5px
xhdpi:320dpi,像素密度与dp转换关系为:1dp = 2px
xxhdpi:480dpi,像素密度与dp转换关系为:1dp = 3px
</code>
适配方法一:
不同密度的手机加载不同drawable下的图片:drawable-hdpi、drawable-ldpi、drawable-mdp……放不同像素点的图片
适配方法二:
加载放在不同的value文件夹下的dimen:res/value-800x480、res/value-1280x720等
适配方法三:
加载不同布局,res/layout-800x480、res/layout-1280x720
适配方法四:
java代码适配:
TextView tv = (TextView) findViewById(R.id.tv);
//获取封装当前手机屏幕信息对象,用于存放宽高值
DisplayMetrics metrics = new DisplayMetrics();
//给当前屏幕设置宽高
getWindowManager().getDefaultDisplay().getMetrics(metrics);
//获取高度
Constant.srceenHeight = metrics.heightPixels;
//获取宽度
Constant.srceenWidth = metrics.widthPixels;
Log.i(tag, "Constant.srceenHeight = "+Constant.srceenHeight);
Log.i(tag, "Constant.srceenWidth = "+Constant.srceenWidth);
//宽高各占50%
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
(int)(Constant.srceenWidth*0.5+0.5),
(int)(Constant.srceenHeight*0.5+0.5));
tv.setLayoutParams(layoutParams);
//获取封装当前手机屏幕信息对象,用于存放宽高值
DisplayMetrics metrics = new DisplayMetrics();
//给当前屏幕设置宽高
getWindowManager().getDefaultDisplay().getMetrics(metrics);
//获取高度
Constant.srceenHeight = metrics.heightPixels;
//获取宽度
Constant.srceenWidth = metrics.widthPixels;
Log.i(tag, "Constant.srceenHeight = "+Constant.srceenHeight);
Log.i(tag, "Constant.srceenWidth = "+Constant.srceenWidth);
//宽高各占50%
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
(int)(Constant.srceenWidth*0.5+0.5),
(int)(Constant.srceenHeight*0.5+0.5));
tv.setLayoutParams(layoutParams);
权重适配,与layout_width设置想相关
在manifest中配置屏幕要求:
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true" />
关于屏幕适配写的很好:http://blog.csdn.net/jiangwei0910410003/article/details/40509571