android 取得屏幕物理宽高

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 取得屏幕物理宽高相关的知识,希望对你有一定的参考价值。

screenWidth = dMeter.widthPixels;
screenHeigh = dMeter.heightPixels;
用这两个取完之后
screenWidth =800
screenHeigh =1280
但是这好像是像素之类的~ 并不是我屏幕到底多少cm高宽~
其实我想取得的是cm 的
如何转换?求详解。

android 取得屏幕物理宽高的方法为:
1、在一个Activity的onCreate方法中,写入如下代码:
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
2、但是,需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。比如说,一部240x320像素的低密度手机,如果运行上述代码,获取到的屏幕尺寸是320x427。因此,研究之后发现,若没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度(160)对应的尺寸,这样的话就大大影响了程序的编码。所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens节点,具体的内容如下:
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />
参考技术A 可以参考手机屏幕的ppi(每英寸有多少个像素点来计算长度)。比如(1英寸=2.54cm)小米手机的ppi=344。那么你要想在1cm的屏幕位置显示东西就可以设置android:layout_marginLeft="(344÷2.54)dip"。这句就是距离屏幕左边1cm的距离。(手机屏幕的ppi可以网上查到。)
因为每个手机的ppi是根据手机采用的屏幕是哪个厂商提供的,所以你要想开发一个通用的公式不太容易。不过大部分的手机屏幕ppi都在340左右所以你可以根据你知道的手机做出针对性的布局文件。当然也可以在代码中获取ppi从而设置距离。但是就像大部分开发人员一样都是考虑像素的没几个考虑转换成长度单位的。不过你一定要这样做也可以。 望采纳!追问

哈哈~ 谢谢啦~ 不过还有个问题~ 我在activity上放了个surfaceView。 现在想两个同时显示。
setContentView(R.layout.activity_main); 但是我为了surfaceView写的类RulerView就不管用了。我写setContentView(new RulerView(this, null));它到时管用` 但是activity就不好使了

追答

你activity_main.xml布局里把这个surfacrView 加进去了么? 看你描述的应该是没有。你setContentView(R.layout.activity_main)是正确的,如果要在一个activity里面显示两个View就要给他们分配空间。比如两图片一个在布局里面写一个用java代码在activity里面写一个道理。我的建议是你在activity_main.xml里面添加你自定义的surfaceView。代码如下:比如你surfaceView.java类在cn.com.test包里面那么你就在activity_main.xml布局文件里面添加

然后在你的activity里面的onCreate(); 方法里面实例化这个surfaceView。
surfaceView surface=(surfaceView)findViewbyId(R.id.surfacr_view);
这样就能显示布局的画面和你自定义的surfaceView了。当然这个surfaceView就像一个单纯的View一样你把它放到activity_main布局的什么地方他就在什么地方显示。
不知道你想要的是这个效果么???
最后告诉你类名称最好首字母大写你的surfaceView是你打错了还是你就是写的小写 我是按照你写的给你讲的。 最最后 你的分什么时候给我啊 !!!望采纳。

本回答被提问者采纳
参考技术B 你不用知道。这个就够了。你根据这个调整组建大小就可以了。比如一个textview的width是屏幕width的十分之一,对任何屏幕,它都是十分之一,你不用关心屏幕几厘米 参考技术C 这个是屏幕分辨率
你要的屏幕高宽长度的话,自己用尺子量一下追问

。。。。 那我程序挂起~弹出一个msg。 告诉使用者自己拿尺子量一下?

追答

那我刚才又不知道你是在写程序

追问

哈哈~ 那我错了~ 不好意思。就想取个值~ 不知道这两个值之间有什么关系~

追答

没关系,这个参数要看使用者使用的屏幕,屏幕不一样,这个值就不一样

追问

嗯~ 是啊~ 可跟cm合不上~ 之间定有奥秘~

追答

不太懂,没研究过

参考技术D 取不到。即使是相同尺寸的屏幕分辨率也不一定相同,无法换算。只能参考手机说明书。追问

。。。不能把~ 也太不智能了~ 像素是分布在屏幕上的点~ 800px 就是有800个点~ 知道一个点多长是不是就能知道实际的cm数。。哎~

flutter获取屏幕宽高和某个控件 的宽高

flutter中经常需要获取很多系统宽高或者某个widget的宽高

1:手机屏幕的宽高,注意,系统提供两个方法,一个是MediuQuery.of(context).size.width,一个是window.physicalSize.width,这两个是有区别的,第一个是逻辑宽度,第二个是物理宽度,记住公式(物理宽度=逻辑宽度*密度系数),我们开发里面用的宽高基本上都是逻辑宽高,系统会帮我们自动转换成实际宽高

2:某个widget的宽高

final GlobalKey globalKey = GlobalKey();

container (
key: globalKey,
)

final width = globalKey.currentContext.size.width;
final height = globalKey.currentContext.size.height;
 

顶部状态栏高度

MediaQuery.of(context).padding.top

底部功能栏,现在有些手机没有了,老手机大部分都有

MediaQuery.of(context).padding.bottom

以上是关于android 取得屏幕物理宽高的主要内容,如果未能解决你的问题,请参考以下文章

Android获取屏幕宽高的三种方式

Android基础篇 Android获取屏幕宽高的方法

如何将获取的屏幕宽度之后传给css

Android开发中如何获取屏幕宽高

Android:如何获取屏幕的宽高

Android应用:StatusBar状态栏NavigationBar虚拟按键栏ActionBar标题栏Window屏幕内容区域等的宽高