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

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

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


小猪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. }  
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);
	}

}

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. }  
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);
	}
}

用法很简单,这里只是打印到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"/>  
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
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" />  
<supports-screens 
android:smallScreens="true" 
android:normalScreens="true" 
android:largeScreens="true" 
android:xlargeScreens="true" 
android:anyDensity="true" />
不然会没有效果的!


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

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

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




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

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

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值