getResources().getDisplayMetrics().heightPixels获取到的屏幕高度不对

 

两台手机做dailog弹窗高度自定义时发现始终适配不了,经测试发现 getResources().getDisplayMetrics().heightPixels获取到的屏幕高度不对。

正确的获取姿势是

DisplayMetrics dm = new DisplayMetrics();
mContext.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
int dwidth = dm.widthPixels;
int dheight = dm.heightPixels

 

kotlin code

package com.rosolution.lyweb.tools

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.util.DisplayMetrics
import android.util.TypedValue

/**
 * 测量高宽
 */
class DisplayUtils  {
    //var dm: DisplayMetrics? = null
    companion object {
        private var context : Context?=null
        var dminstance: DisplayMetrics? = null
        private var instance: DisplayUtils? = null
            get() {
                if (field == null) {
                    field = DisplayUtils()
                }
                return field
            }
        @SuppressLint("NewApi")
        @Synchronized
        fun get(context: Context): DisplayUtils{

            this.context = context
            dminstance = context.resources.displayMetrics
            if( context is Activity ) {
                context.windowManager.defaultDisplay.getRealMetrics(dminstance)
            }
            //细心的小伙伴肯定发现了,这里不用getInstance作为为方法名,是因为在伴生对象声明时,内部已有getInstance方法,所以只能取其他名字
            return instance!!
        }

    }
    //获取屏幕宽度
    fun getWidth():Int{
        return dminstance!!.widthPixels
    }
    //获取屏幕高度
    fun getHeight():Int{
        return dminstance!!.heightPixels
    }
    //dp转像素
    fun dip2px(dpValue: Double): Int {
        val scale = dminstance!!.density
        return (dpValue * scale + 0.5f).toInt()
    }
    //sp转px
    fun sp2px(spValue:Float):Int{
        return (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spValue, dminstance)).toInt()
    }





}