android 双屏获取每个屏幕的分辨率以及屏幕的方向

做了一个双屏的APK,分辨率老是不对,我这边获取的1920*1080但是硬件本身是1366*768

我甩脱给底层,底层在甩锅给我,持续了半个月,实在是忍无可忍,我决定花时间研究下这个

扒了一下android API的源码,确实是有一个获取每个屏幕分辨率的方法,副屏的分辨率不能使用主屏的方法来获取

给大家看看源码

  @Override
    public void onClick(View v) {
        Context context = v.getContext();
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        final Display display = (Display) v.getTag();
        Resources r = context.getResources();
        AlertDialog alert = builder
                .setTitle(r.getString(
                        R.string.presentation_alert_info_text, display.getDisplayId()))
                .setMessage(display.toString())
                .setNeutralButton(R.string.presentation_alert_dismiss_text,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                .create();
        alert.show();
    }

这个是点击按钮弹窗显示屏幕相关的信息,里面

final Display display = (Display) v.getTag();

 

先看一下获取屏幕的方法

   DisplayManager mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
            Display[] displays = mDisplayManager.getDisplays();
            MyLog.diff("33333=====当前屏幕的个数====" + displays.length);
            int screenNum = displays.length;
            if (screenNum < 2) { //单个屏幕
                return;
            }

看到这里,应该就明白了,果断追下去,去找尺寸,分辨率封装在Mode里面,

Display display = displays[1];  //0表示主屏,1 表示副屏
int width = display.getMode().getPhysicalWidth();
int height = display.getMode().getPhysicalHeight();

根据不同的系统版本,这个调用方法有所变动

android 5.0没有getModel(),这个方法,可以直接调用getWidth(),方法,

android 7.0,就可以直接采取display.getModel().getPhysicalWidth();   

获取屏幕的方向

  调用getProperties(String info);这个方法,传递上面的两个常量值即可得到参数

  不过,主屏返回的是 0 ,90,180, 270

             副屏返回的是0,1,2,3,4,

             0对应是0 度

             1对应的是90

             2对应的是180

             3对应的是270

             4对应的是和主屏一样的角度,然后剩下的,你去判断主屏的方向就可以了,单独处理

           

    public static final String PROOERTY_INFO = "persist.sys.displayrot";   //主屏幕的旋转方向
    public static final String PROOERTY_OTHER_INFO = "persist.orientation.vhinit";   //副屏幕的旋转方向

    //判断设备是否连网线  0:没有连接   1:已经连接
    public static final String JUJLE_ETH_LINE_DEV_ORDER = "cat /sys/class/net/eth0/carrier";

    //    获取和设置SystemProperties属性的代码
    public static String getProperty(String key, String defaultValue) {
        String value = defaultValue;
        try {
            Class c = Class.forName("android.os.SystemProperties");
            Method get = c.getMethod("get", String.class, String.class);
            value = (String) (get.invoke(c, key, defaultValue));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return value;
        }
    }

这里贴一下判断副屏方向的代码,主屏就不需要了,因为可以直接根据宽高来判断

 /**
     * 

* 1 横屏 * -1 竖屏 * 0 方屏 * * @return */ public int getScreenRoate() { int screenRoate = 0; String roate = RootCmd.getProperty(RootCmd.PROOERTY_OTHER_INFO, "0"); screenRoate = Integer.parseInt(roate); /** * 0 0度 * 1 旋转90度 * 2 旋转180度 * 3 旋转270度 * 4 和主屏一样的角度 */ if (screenRoate == 0 || screenRoate == 2) { //横屏 screenRoate = 1; } else if (screenRoate == 1 || screenRoate == 3) { //竖屏 screenRoate = -1; } else if (screenRoate == 4) { //副屏和主屏一个方向 int mainWidth = SharedPerManager.getScreenWidth(); int mainHeight = SharedPerManager.getScreenHeight(); if (mainWidth > mainHeight) { //横屏 screenRoate = 1; } else if (mainWidth < mainHeight) { //竖屏 screenRoate = -1; } else if (mainWidth == mainHeight) { //方屏 screenRoate = 0; } } return screenRoate; }

 

不是看源码,真的不知道还有这个方法,分享给大家.

 

 

 

 

 

你可能感兴趣的:(安卓前端,java,android)