如何在android中以编程方式获取屏幕密度?
我的意思是:如何找到当前设备的屏幕dpi?
如何为Nexus 6准备资源?如果我将图像放到xxxhdpi,它们将缩小并降低质量.我把图像放到xxhdpi它们会扩大并失去质量.如果实际密度493ppi更接近xxhdpi~480dpi,为什么开发人员决定设置值为560dpi?
Nexus 6拥有令人印象深刻的5.96英寸四核高清屏幕,分辨率为2560 x 1440(493 ppi).这转换为~730 x 410 dp(密度无关像素).
Nexus 6的量化密度为560 dpi,介于xxhdpi和xxxhdpi主密度桶之间.
对于Nexus 6,该平台将缩减xxxhdpi资产,但如果这些资产不可用,那么它将扩大xxhdpi资产.
Run Code Online (Sandbox Code Playgroud)xxhdpi ~480dpi xxxhdpi ~640dpi
我创建了一个新的硬件配置文件,试图为Galaxy S8/S8 +制作和模拟器.我将屏幕尺寸设置为5.8/6.2英寸(取决于是否S8或S8 +,尽管事实上这似乎不会影响模拟器),屏幕分辨率为1440 x 2960,就像设备一样.模拟器看起来没有像在真实设备上那样.在真正的S8 +上测试我的应用程序显示它布局不佳,但在模拟器上它看起来相对有条理,我注意到它使用了我的Nexus 6模拟器(xxxhdpi)的尺寸.现在使用的尺寸值并不是什么大问题,因为我很高兴逐步淘汰Nexus 6,因为它已经不再生产了.
所以我在我的启动器Java类中添加了一些代码,它让我得到了模拟器的尺寸,这是我从S8仿真器得到的:{density=3.5, width=1440, height=2792, scaledDensity=3.5, xdpi=560.0, ydpi=560.0}
除了事实高度是2792而不是2960(我认为这是发生的),我相信我看到了问题 - 密度是3.5.可疑,这与Nexus 6的密度相同.所以我创建的模拟器不适用于Galaxy S8,这在我与真实的S8 +的比较中很明显,后者以扭曲的方式显示我的应用程序.据我所知,Galaxy S8的密度为4,而不是3.5.IDE说设备有560dpi.现在我需要能够创建一个密度为4的模拟器,并且我已经放下了相同的规格.我怎样才能做到这一点?如何在不使用真品的情况下测试Galaxy S8?IDE提供的此设备没有预配置的仿真器.
提前谢谢了.
我注意到我的应用程序在同一设备上显示略有不同的布局,具体取决于我是运行调试APK还是签名版本APK.经过多次刮擦,我已将问题隔离到设备密度特定的资源值.当我在调试模式下运行应用程序时,设备使用v alues-xxhdpi/dimens.xml中的维度,当我运行签名的APK时,它使用values-xxxhdpi/dimens.xml中的维度.有问题的设备是运行Android 7.0的三星Galaxy S7
为了证实这一点,我创建了一个新的空项目,其中只有一个hello world字符串.我在values/strings.xml,values-xxhdpi/strings.xml和values-xxxhdpi/strings.xml中为字符串定义了不同的值.结果如下.
为什么会这样?为什么android在调试模式下选择xxhdpi资源,在签名的APK中选择xxxhdpi资源?
问题:在同一分辨率屏幕上,不同设备上的布局显示不同.我在三星Galaxy S4(1080x1920)和LG G2(1080x1920)上测试过它.它的分辨率相同,那么为什么每个设备上的布局显示方式不同?
我已经在布局文件夹中,并没有其他分辨率的其他布局.
这是屏幕:
http://www.image-share.com/ijpg-2963-272.html
http://www.image-share.com/ijpg-2963-271.html
编辑#1
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/layoutMain"
tools:mContext="com.test.app.flock.mActivity">
<ImageView
android:id="@+id/imageViewImageBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<View
android:id="@+id/viewBackground"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background01" />
<View
android:id="@+id/viewFingerprint"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/fingerprint01"
android:visibility="gone" />
<Button
android:id="@+id/buttonScanning"
android:layout_width="162dp"
android:layout_height="130dp"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="41dp"
android:background="@android:color/transparent" />
<ImageView
android:id="@+id/imageViewScanner"
android:layout_width="162dp"
android:layout_height="130dp"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="41dp"
android:src="@drawable/line01"
android:visibility="gone" />
<TextView
android:id="@+id/textViewResult"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="180dp"
android:text="SCANNING"
android:textSize="30sp"
android:textColor="@android:color/white"
android:textStyle="bold"
android:gravity="center"
android:visibility="gone" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="112dp" …Run Code Online (Sandbox Code Playgroud) 根据 android 文档,密度应以dpi(每英寸点数)为单位,所有布局测量应以dp为单位。
使用一个简单的公式 android 可以将dp映射到实际像素。
px = dp * (dpi / 160),
160dpi ~ medium density screen which is the baseline
Run Code Online (Sandbox Code Playgroud)
那么为什么不直接使用ppi(每英寸像素)来描述屏幕密度呢?
我想以SeekBar编程方式在画布上绘制.我编写了代码来设置SeekBar基于设备密度的LayoutParams .我正在使用具有设备密度的开关盒
final DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
if(metrics.densityDpi <= DisplayMetrics.DENSITY_LOW){
zoomBarParams = new LinearLayout.LayoutParams(18,
LayoutParams.FILL_PARENT);
} else if (metrics.densityDpi <= DisplayMetrics.DENSITY_MEDIUM){
zoomBarParams = new LinearLayout.LayoutParams(24,
LayoutParams.FILL_PARENT);
}else if (metrics.densityDpi <= DisplayMetrics.DENSITY_HIGH){
zoomBarParams = new LinearLayout.LayoutParams(24,
LayoutParams.FILL_PARENT);
}else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XHIGH){
zoomBarParams = new LinearLayout.LayoutParams(31,
LayoutParams.FILL_PARENT);
}else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XXHIGH){
zoomBarParams = new LinearLayout.LayoutParams(60,
LayoutParams.FILL_PARENT);
}else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XXXHIGH){
zoomBarParams = new LinearLayout.LayoutParams(60,
LayoutParams.FILL_PARENT);
} else {
zoomBarParams = new LinearLayout.LayoutParams(60,
LayoutParams.FILL_PARENT);
}
Run Code Online (Sandbox Code Playgroud)
但这不适用于三星Note …
我面临下一个问题:
我有一个 values-xxhdpi 及其维度.xml。具有 480 dpi 的设备非常适合使用此文件夹。
问题是,例如三星 Galaxy S4 或 S5 从该文件夹中捕获值,并且在屏幕上看起来不太好,因为它们的分辨率为 420 dpi。所以我需要为这种类型或设备创建一个值。
我尝试添加 values-w410dp 并且工作正常,但是如果我添加此文件夹,则具有 480 dpi 的设备现在会从该文件夹中捕获 de 值,而不是来自 values-xxhdpi 的值。
请需要建议
谢谢
通过“设置/显示”放大屏幕,我发现我的 Galaxy s9+ 的屏幕密度从 430 dpi 变为超过 600 dpi。
这使得布局和图像从 xxhdpi 更改为 xxxhdpi。
如果我有一个固定大小为 16dp 的 textView,
在 xxhdpi 中它是 16 * 3 px,在 xxxhdpi 中将变成 16 * 4 px。
这使得我的布局(当然来自 editTexts 或 textViews 的文本)变得更大,因为设备的实际密度永远不会改变,谷歌(或制造商 samsumg)打算为此功能。
但我不希望这种情况发生在我的应用程序中。
我试图通过这样做来修复它;
Configuration configuration = activity.getResources().getConfiguration();
if (configuration.densityDpi != 430) {
configuration.densityDpi = 430;
}
DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
WindowManager wm = (WindowManager) activity.getSystemService(activity.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.densityDpi * metrics.density;
activity.getResources().updateConfiguration(configuration, metrics);
Run Code Online (Sandbox Code Playgroud)
这迫使屏幕密度变为 430,并且在 Galaxy s9+ 上运行良好。但事实上,并非所有设备的默认密度都是 430。
如何确定运行我的应用程序的设备的默认密度?
或者是否有配置可以忽略我的应用程序的放大效果?
我试图了解res/drawables图像应该如何使用不同的屏幕密度.现在我有一个1.5应用程序,例如,我有一个100x100像素的图像.当在Droid上使用时,它会缩放此图像,使其在该设备上看起来相对大小相同(所有其他布局缩放由我处理,使用dip单位).
所以现在我需要更新我的项目并添加三个文件夹,对吧?:
所以我要将我的100x100图像放在-mdpi文件夹中.如果我想为-hdpi文件夹制作一个版本 - 我怎么知道要扩大它的大小呢?我的意思是它看起来默认它应该大1.5倍.但是如果我把它做大2.0倍,或者我正在运行的设备的密度不是基线G1的1.5倍,会发生什么?我的布局不会在这些设备上开始看起来不同吗?
谢谢