New UI-获取手机屏幕尺寸与常用分辨率,屏幕适配,横竖屏问题

——转载请注明出处:coder-pig,欢迎转载,请勿用于商业用途!

 

 來源:

http://blog.csdn.net/coder_pig/article/details/42213211

 

小猪Android开发交流群已建立,欢迎大家加入,无论是新手,菜鸟,大神都可以,小猪一个人的

力量毕竟是有限的,写出来的东西肯定会有很多纰漏不足,欢迎大家指出,集思广益,让小猪的博文

更加的详尽,帮到更多的人,O(∩_∩)O谢谢!

小猪Android开发交流群:小猪Android开发交流群群号:421858269

新Android UI实例大全目录:http://blog.csdn.net/coder_pig/article/details/42145907

 

 

1)获取手机屏幕尺寸与屏幕密度:

先要说一点,我们能通过编程获取到的手机屏幕尺寸,只是分辨率哦!!!真正的屏幕尺寸,

多少寸这样要么自己测,要么上网查!编程获取到的尺寸只是分辨率,切记!!!

下面提供一个工具类,提供三种获取手机分辨率与屏幕密度的方法,方法一已经过时,不建议

使用了!

先上下效果图吧:


工具类:

GetScreenParameter.java

 

  1. package com.jay.example.getscreendemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.util.DisplayMetrics;  
  6. import android.util.Log;  
  7. import android.view.Display;  
  8.   
  9. public class GetScreenParameter {  
  10.   
  11.     //方法一已经过时了,虽然可以使用,但不建议使用  
  12.     public static void getResolution1(Context mContext) {  
  13.         Display mDisplay = ((Activity) mContext).getWindowManager()  
  14.                 .getDefaultDisplay();  
  15.         int W = mDisplay.getWidth();  
  16.         int H = mDisplay.getHeight();  
  17.         Log.i("getResolution1""Width = " + W + "px");  
  18.         Log.i("getResolution1""Height = " + H + "px");  
  19.     }  
  20.   
  21.       
  22.     //方法二是通过getWindowManager来获取屏幕尺寸的  
  23.     public static void getResolution2(Context mContext) {  
  24.         DisplayMetrics mDisplayMetrics = new DisplayMetrics();  
  25.         ((Activity) mContext).getWindowManager().getDefaultDisplay()  
  26.                 .getMetrics(mDisplayMetrics);  
  27.         int W = mDisplayMetrics.widthPixels;  
  28.         int H = mDisplayMetrics.heightPixels;  
  29.         float density = mDisplayMetrics.density; // 屏幕密度(0.75 / 1.0 / 1.5)  
  30.         int densityDpi = mDisplayMetrics.densityDpi; // 就是屏幕密度 *160而已,屏幕密度DPI(120 / 160 / 240)  
  31.         Log.i("getResolution2""Width = " + W + "px");  
  32.         Log.i("getResolution2""Height = " + H + "px");  
  33.         Log.i("getResolution2""density = " + density);  
  34.         Log.i("getResolution2""densityDpi = " + densityDpi);  
  35.     }  
  36.   
  37.       
  38.     //方法三是通过getResources来获取屏幕尺寸的  
  39.     public static void getResolution3(Context mContext) {  
  40.         DisplayMetrics mDisplayMetrics = new DisplayMetrics();  
  41.         mDisplayMetrics = mContext.getResources().getDisplayMetrics();  
  42.         int W = mDisplayMetrics.widthPixels;  
  43.         int H = mDisplayMetrics.heightPixels;  
  44.         float density = mDisplayMetrics.density; // 屏幕密度(0.75 / 1.0 / 1.5)  
  45.         int densityDpi = mDisplayMetrics.densityDpi; // 就是屏幕密度 *160而已,屏幕密度DPI(120 / 160 / 240)  
  46.         Log.i("getResolution3""Width = " + W + "px");  
  47.         Log.i("getResolution3""Height = " + H + "px");  
  48.         Log.i("getResolution3""density = " + density);  
  49.         Log.i("getResolution3""densityDpi = " + densityDpi);  
  50.     }  
  51.   
  52. }  


MainActivity.java

 

 

  1. package com.jay.example.getscreendemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6.   
  7. public class MainActivity extends Activity {  
  8.   
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.activity_main);  
  13.         GetScreenParameter.getResolution1(MainActivity.this);  
  14.         GetScreenParameter.getResolution2(MainActivity.this);  
  15.         GetScreenParameter.getResolution3(MainActivity.this);  
  16.     }  
  17. }  


用法很简单,这里只是打印到logcat里,大家可以按自己的需求进行修改,另外还有一点要注意的是:

对于一些屏幕密度低的小屏手机,比如240*320的手机,计算出来的尺寸可能为:320*427,而网上也有解决方法,

原因好像是:没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度

(160)对应的尺寸,于是乎要获得正确的物理尺寸,只需要在AndroidManifest.xml文件中添加下述内容:

 

  1. <supports-screens  
  2. android:smallScreens="true"  
  3. android:normalScreens="true"  
  4. android:largeScreens="true"  
  5. android:resizeable="true"  
  6. android:anyDensity="true"/>  

 

 

就可以解决这个问题了!

 

 

 

2)手机分辨率问题:

相信大家创建完工程后,都可以看到res目录下的drawable有几种

这个时候你就可能有一些疑问了,这些文件夹都是干嘛的为什么要分那么多个?

答:这些文件夹都是放drawable资源的,你可以理解为放图片的,分那么多个是为了

针对不同屏幕密度的手机加载不同的图片资源,之所以这样做,是因为,同一张图片在

不同屏幕密度手机下可能出现不同的结果,这显然和我们的原意相违背;于是乎Android

会根据手机dpi的不同加载对应文件夹下的图片资源!

 


 

后面写跟着的xdpi就是会加载对应文件夹下的图片资源!

当然,这也不是绝对的,比如我们把所有的图片都丢在了drawable-hdpi下的话,即使手机

本该加载ldpi文件夹下的图片资源,但是ldpi下没有,那么加载的还会是hdpi下的图片!

另外,还有一种情况:比如是hdpi,mdpi目录下有,ldpi下没有,那么会加载mdpi中的资源!

原则是使用最接近的密度级别!

ps:另外如果你想禁止Android不跟随屏幕密度加载不同文件夹的资源,只需在AndroidManifest.xml

文件中添加android:anyDensity="false"字段即可!

 

 

 

3)屏幕适配的问题:

相信屏幕适配都是大家头疼的一个问题吧,这里的话就说下界面开发时要注意的地方吧!

①画界面的时候使用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里添加这段东西:

 

  1. <supports-screens   
  2. android:smallScreens="true"   
  3. android:normalScreens="true"   
  4. android:largeScreens="true"   
  5. android:xlargeScreens="true"   
  6. android:anyDensity="true" />  

不然会没有效果的!

 

 

⑤对于局部拉伸的图片,比如最常见的聊天时的TextView,文字过长就可能引起拉伸变形,那么

这些时候就应该使用9-patch工具对图片进行处理了!

ps:关于9patch工具的使用,可到:9patch(9妹)的用法

 

 

 

4.横竖屏加载不同布局:

layout-port:横屏   layout-land:竖屏

手机加载的时候会判断横竖屏,接着加载不同的布局

 

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()