码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2014-12-28 22:14:21      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:android开发   屏幕适配   分辨率   横竖屏问题   

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

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


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

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

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

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

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



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

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

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

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

使用了!

先上下效果图吧:

技术分享

工具类:

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

}

MainActivity.java

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文件中添加下述内容:

<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里添加这段东西:

<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:竖屏

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






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

标签:android开发   屏幕适配   分辨率   横竖屏问题   

原文地址:http://blog.csdn.net/coder_pig/article/details/42213211

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!