谈到android屏幕分辨率,大家都知道,但是怎么正确的获取屏幕的分辨率呢?android2.2\2.3\4.0\4.1使用的方法一样吗?

答案是否定的。事物是发展变化的,android也不例外,android2.2、2.3因为标配是有触摸屏按钮的,也就是说触摸屏上BACK、HOME、MEAN是在触摸屏分辨率识别范围之外的。但是在android4.0以后,已经取消了,开始使用软件按钮了,在屏幕的下方会占掉一定的高度,因此使用同样的方法去取屏幕分辨率,可能得到的值会不大一样。

笔者使用的android4.0平台,屏幕分辨率是1280X800写了一个能稍微智能一点,能正确获取屏幕分辨率的方法,主要修改代码:


[Java] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 @@ - 26 , 12 + 26 , 17 @@ import android.app.ProgressDialog; import android.app.AlertDialog; import android.content.DialogInterface; import android.util.Log; + import android.util.DisplayMetrics; + import java.lang.reflect.Method; + import android.os.Build; + import android.view.Display; public class MainActivity extends Activity { public Button Btn_Music, Btn_Movie, Btn_DVD, Btn_CMMB; public TextView src_title; private static final boolean DEBUG = true ; private int all_src, cur_src; + private int screen_w, screen_h; public static SerialService localService = null ; @@ - 182 , 6 + 187 , 8 @@ public class MainActivity extends Activity { setContentView(R.layout.src_main); + getDisplayScreenResolution(); + connected = 0 ; connect_retry_cnt = 0 ; mConnectCheckTask = new TimerTask() { @@ - 303 , 6 + 310 , 47 @@ public class MainActivity extends Activity { } } + public int getDisplayScreenResolution() + { + int ver = Build.VERSION.SDK_INT; + + DisplayMetrics dm = new DisplayMetrics(); + android.view.Display display = getWindowManager().getDefaultDisplay(); + display.getMetrics(dm); + + screen_w = dm.widthPixels; + + Log.d(TAG, "Run1 first get resolution:" +dm.widthPixels+ " * " +dm.heightPixels+ ", ver " +ver); + if (ver < 13 ) + { + screen_h = dm.heightPixels; + } + else if (ver == 13 ) + { + try { + Method mt = display.getClass().getMethod( "getRealHeight" ); + screen_h = (Integer) mt.invoke(display); + } catch (Exception e) { + e.printStackTrace(); + } + } + else if (ver > 13 ) + { + try { + Method mt = display.getClass().getMethod( "getRawHeight" ); + screen_h = (Integer) mt.invoke(display); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + Log.d(TAG, "Run2 Calibration resolution:" +screen_w+ " * " +screen_h); + + return 0 ; + } + + void HideSrcAll() { //src_title.setVisibility(View.GONE); Btn_Music.setVisibility(View.GONE);

运行打印如下:
[Java] 纯文本查看 复制代码 ?
1 2 3 4 5 6 7 8 01 - 01 09 : 37 : 40.989 I/ActivityManager( 174 ): Start proc com.jeavox.Serial for activity com.jeavox.Serial/.MainActivity: pid= 807 uid= 10036 gids={} 01 - 01 09 : 37 : 41.059 D/OpenGLRenderer( 361 ): Flushing caches (mode 1 ) 01 - 01 09 : 37 : 41.189 D/OpenGLRenderer( 361 ): Flushing caches (mode 0 ) 01 - 01 09 : 37 : 41.209 D/MainActivity( 807 ): Run1 first get resolution: 1280 * 740 , ver 15 01 - 01 09 : 37 : 41.209 D/MainActivity( 807 ): Run2 Calibration resolution: 1280 * 800 01 - 01 09 : 37 : 41.279 D/ViewRootImpl( 807 ): pckname = com.jeavox.Serial 01 - 01 09 : 37 : 41.299 D/ViewRootImpl( 807 ): pckname = com.jeavox.Serial 01 - 01 09 : 37 : 41.319 E/SerialService( 807 ): ###################->>>>>> service create <<<<<<<

在android4.0以前,display.getMetrics(dm);就能够获取正确的屏幕分辨率,4.0、4.1的就不行。所以在Run1 first get resolution:1280 * 740,而使用getRawHeight新方法修正后能得到正确的分辨率Run2 Calibration resolution:1280 * 800 。在android4.0 SDK自带的Setting apk里ScreenAdaption.java里面也有获取屏幕分辨率的接口:主要代码如下,大同小异,
[Java] 纯文本查看 复制代码 ?
1 2 3 4 WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE); android.view.Display display = wm.getDefaultDisplay(); int width = display.getRawWidth(); int height = display.getRawHeight();

过使用笔者提供的接口,可以正确的获取不同android版本的设备获取到正确的屏幕分辨率,难度不是很大,方法简单,其实都是android现成的东西,但是对还不了解的同学来说还是很有好处的。
转自: http://blog.csdn.net/sundesheng125/article/details/8314945


可以使用的代码应该是这些:
private int screen_w, screen_h;

public int getDisplayScreenResolution(){
int ver = Build.VERSION.SDK_INT;

DisplayMetrics dm = new DisplayMetrics();
Display display = getWindowManager().getDefaultDisplay();
display.getMetrics(dm);

screen_w= dm.widthPixels;

Log.d("TAG", "Run1 first get resolution:"+dm.widthPixels+" * "+dm.heightPixels+", ver "+ver);
if (ver < 13)
{
screen_h = dm.heightPixels;
}
else if (ver == 13)
{
try {
Method mt = display.getClass().getMethod("getRealHeight");
screen_h = (Integer) mt.invoke(display);
} catch (Exception e) {
e.printStackTrace();
}
}
else if (ver > 13)
{
try {
Method mt = display.getClass().getMethod("getRawHeight");
screen_h = (Integer) mt.invoke(display);

} catch (Exception e) {
e.printStackTrace();
}
}
Log.d("TAG", "Run2 Calibrationresolution:"+screen_w+" * "+screen_h);
return 0;
}


http://www.apkbus.com/android-85719-1-1.html

http://www.2cto.com/kf/201212/177347.html







更多相关文章

  1. android 围绕中心旋转动画
  2. android studio中常用的导入jar包以及添加远程依赖的方式
  3. android widget 开发实例
  4. android开发之Google工程师多图详解Android架构
  5. Flutter——踩坑之旅(现有Android项目和现有iOS项目引入同一个Flu
  6. 使用kotlin编写Android第一个Activity
  7. Android(安卓)TabActivity Essentials
  8. Android中几种常见的定时刷新方式
  9. android lint 是什么

随机推荐

  1. Android 启动过程详解
  2. (二)Android事件分发机制 - ViewGroup篇
  3. Android字体(一)
  4. Android消息循环实现原理分析
  5. Google Play Store 应用无法安装解决方案
  6. android bitmap compress(图片压缩)
  7. Ubuntu安装Android的SDK
  8. Android(安卓)greenDao开源数据库框架
  9. Android(安卓)Display System -- Surface
  10. Android(安卓)UI界面刷新与交互