New UI-获取手机屏幕尺寸与常用分辨率,屏幕适配,横竖屏问题
——转载请注明出处:coder-pig,欢迎转载,请勿用于商业用途!
小猪Android开发交流群已建立,欢迎大家加入,无论是新手,菜鸟,大神都可以,小猪一个人的
力量毕竟是有限的,写出来的东西肯定会有很多纰漏不足,欢迎大家指出,集思广益,让小猪的博文
更加的详尽,帮到更多的人,O(∩_∩)O谢谢!
小猪Android开发交流群:小猪Android开发交流群群号:421858269
新Android UI实例大全目录:http://blog.csdn.net/coder_pig/article/details/42145907
先要说一点,我们能通过编程获取到的手机屏幕尺寸,只是分辨率哦!!!真正的屏幕尺寸,
多少寸这样要么自己测,要么上网查!编程获取到的尺寸只是分辨率,切记!!!
下面提供一个工具类,提供三种获取手机分辨率与屏幕密度的方法,方法一已经过时,不建议
使用了!
先上下效果图吧:
工具类:
GetScreenParameter.java
package com.jay.example.getscreendemo; import android.app.Activity; import android.content.Context; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; public class GetScreenParameter { //方法一已经过时了,虽然可以使用,但不建议使用 public static void getResolution1(Context mContext) { Display mDisplay = ((Activity) mContext).getWindowManager() .getDefaultDisplay(); int W = mDisplay.getWidth(); int H = mDisplay.getHeight(); Log.i("getResolution1", "Width = " + W + "px"); Log.i("getResolution1", "Height = " + H + "px"); } //方法二是通过getWindowManager来获取屏幕尺寸的 public static void getResolution2(Context mContext) { DisplayMetrics mDisplayMetrics = new DisplayMetrics(); ((Activity) mContext).getWindowManager().getDefaultDisplay() .getMetrics(mDisplayMetrics); int W = mDisplayMetrics.widthPixels; int H = mDisplayMetrics.heightPixels; float density = mDisplayMetrics.density; // 屏幕密度(0.75 / 1.0 / 1.5) int densityDpi = mDisplayMetrics.densityDpi; // 就是屏幕密度 *160而已,屏幕密度DPI(120 / 160 / 240) Log.i("getResolution2", "Width = " + W + "px"); Log.i("getResolution2", "Height = " + H + "px"); Log.i("getResolution2", "density = " + density); Log.i("getResolution2", "densityDpi = " + densityDpi); } //方法三是通过getResources来获取屏幕尺寸的 public static void getResolution3(Context mContext) { DisplayMetrics mDisplayMetrics = new DisplayMetrics(); mDisplayMetrics = mContext.getResources().getDisplayMetrics(); int W = mDisplayMetrics.widthPixels; int H = mDisplayMetrics.heightPixels; float density = mDisplayMetrics.density; // 屏幕密度(0.75 / 1.0 / 1.5) int densityDpi = mDisplayMetrics.densityDpi; // 就是屏幕密度 *160而已,屏幕密度DPI(120 / 160 / 240) Log.i("getResolution3", "Width = " + W + "px"); Log.i("getResolution3", "Height = " + H + "px"); Log.i("getResolution3", "density = " + density); Log.i("getResolution3", "densityDpi = " + densityDpi); } }
package com.jay.example.getscreendemo; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GetScreenParameter.getResolution1(MainActivity.this); GetScreenParameter.getResolution2(MainActivity.this); GetScreenParameter.getResolution3(MainActivity.this); } }
对于一些屏幕密度低的小屏手机,比如240*320的手机,计算出来的尺寸可能为:320*427,而网上也有解决方法,
原因好像是:没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度
(160)对应的尺寸,于是乎要获得正确的物理尺寸,只需要在AndroidManifest.xml文件中添加下述内容:
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:resizeable="true" android:anyDensity="true"/>
相信大家创建完工程后,都可以看到res目录下的drawable有几种
这个时候你就可能有一些疑问了,这些文件夹都是干嘛的为什么要分那么多个?
答:这些文件夹都是放drawable资源的,你可以理解为放图片的,分那么多个是为了
针对不同屏幕密度的手机加载不同的图片资源,之所以这样做,是因为,同一张图片在
不同屏幕密度手机下可能出现不同的结果,这显然和我们的原意相违背;于是乎Android
会根据手机dpi的不同加载对应文件夹下的图片资源!
后面写跟着的xdpi就是会加载对应文件夹下的图片资源!
当然,这也不是绝对的,比如我们把所有的图片都丢在了drawable-hdpi下的话,即使手机
本该加载ldpi文件夹下的图片资源,但是ldpi下没有,那么加载的还会是hdpi下的图片!
另外,还有一种情况:比如是hdpi,mdpi目录下有,ldpi下没有,那么会加载mdpi中的资源!
原则是使用最接近的密度级别!
ps:另外如果你想禁止Android不跟随屏幕密度加载不同文件夹的资源,只需在AndroidManifest.xml
文件中添加android:anyDensity="false"字段即可!
相信屏幕适配都是大家头疼的一个问题吧,这里的话就说下界面开发时要注意的地方吧!
①画界面的时候使用RelativeLayout + LinearLayout的weight(权重)属性来编写!
②多用match_parent和warp_content,如果必须写死控件的大小的话,用dp而不要用px(像素)
对于文字大小则用sp,如果我们不设置textSize的话,默认大小是14sp!
(如果文字大小大于15sp的话也可以用dp,自己喜欢!)
③针对不同屏幕密度的手机提供不同大小的图片,从低到高的比依次为:3,4,6,8;
例如:ldpi下的图片为36*36,那么mdpi就为48*48,同理hdpi为72*72,xhdpi为96*96
④针对不同的手机使用不同的布局,只需要创建一个布局文件夹,命名为:
layout-480x320这样的格式,然后写相应的布局文件,layout-320x240这样,Android系统会根据
不同的手机分辨率加载不同的布局!另外还要在AndroidManifest.xml里添加这段东西:
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />不然会没有效果的!
⑤对于局部拉伸的图片,比如最常见的聊天时的TextView,文字过长就可能引起拉伸变形,那么
这些时候就应该使用9-patch工具对图片进行处理了!
ps:关于9patch工具的使用,可到:9patch(9妹)的用法
layout-port:横屏 layout-land:竖屏
手机加载的时候会判断横竖屏,接着加载不同的布局
New UI-获取手机屏幕尺寸与分辨率,屏幕适配,横竖屏问题
原文地址:http://blog.csdn.net/coder_pig/article/details/42213211