我可以通过编程方式更改设备 DPI 吗?

6
我想知道是否可以更改设备的布局选择或图形选择/缩放,以便只影响我的应用程序。我能否设置设备DPI? 我这么做的原因是这款手机:http://www.gsmarena.com/samsung_p1000_galaxy_tab-3370.php 它的DPI非常低,只有240DPI,而它的PPI仅为170,应该被识别为160DPI的设备。我有一个相当大的布局-大型图形,在mdpi上看起来很好,但在hdpi上它们不适合,它们只是太大了。也许您有比更改设备DPI更好的解决方案?

无法更改设备dpi,您只能基于设备为应用程序设置dpi! - Dinesh
2
那个问题没有意义。你可以问如何以编程方式更改显示器的直径一样荒谬。DPI是硬件功能。每英寸有多少像素取决于硬件制造商放置的数量(这是假设你的意思是DPI = PPI)。 - mxk
DPI不是硬件值,我也不假设DPI等于PPI。DPI被用来描述屏幕应该使用哪些资源等内容,而PPI是真实的屏幕密度。 - Mikooos
这是一种硬件特性,如果你在谈论智能手机屏幕的DPI,你可能指的是PPI。引用维基百科的话:“因此,一个不那么误导的术语是每英寸像素数。视频显示器几乎都以点距为单位评级,这指的是组成像素自身的亚像素红、绿和蓝点之间的间距。”由于(亚)像素是任何液晶显示器的物理实体,因此对于这样的屏幕,DPI值是一个硬件常数。然而,Android确实允许您为不同的屏幕密度提供预先渲染或预先缩放的资源。 - mxk
请参考Hassy31的答案,那是你应该做的。 - mxk
3个回答

21

是的,这是可能的。以下内容将把dpi设置为240。虽然你需要以某种方式刷新活动,例如重新启动应用程序。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
metrics.density = 1.5f;
metrics.densityDpi = 240;
metrics.heightPixels = 1104;
metrics.widthPixels = 1920;
metrics.scaledDensity = 1.5f;
metrics.xdpi = 254.0f;
metrics.ydpi = 254.0f;
getResources().getDisplayMetrics().setTo(metrics);

4

1
我的做法是正确的,但是当我使用layout-large时,我希望有更多的空间,比如600dp。但是这个手机在竖屏模式下只有800px/1.5hdpi=400dp的空间。 - Mikooos
在这里他们说:http://developer.android.com/guide/practices/screens_support.html 大屏幕至少为640dp x 480dp,但该设备并非如此。而在表格底部有信息显示,具有600x1024分辨率的hdpi设备应选择normal限定符。那么这个设备是有问题的吗? - Mikooos
1
我曾经遇到过同样的问题。在同一密度下有几个不同分辨率的设备。在这种情况下,您可以通过编程方式选择布局。但是,这个过程会让你感觉像地狱一样,因为你必须为不同的分辨率创建很多布局。使用RelativeLayout创建布局将是解决这个问题的更好方案。 - Hassy31
我个人觉得用一个CSS来管理多个设备的显示方案更容易管理。该方案已进行跨平台测试,准确性在多个设备上得到验证。具体细节请参考http://www.jqui.net/tips-tricks/fixing-the-auto-scale-on-mobile-devices/。 - Val
至少对于已经root的手机,可以通过更改build.prop文件来进行修改。 - paulgavrikov
显示剩余2条评论

0

如果 Samsung Galaxy Tab GT-P1000 没有 layout-xhdpi,则会采用 large 布局。

尝试根据 文档 支持多个屏幕分辨率,为您的应用程序设计替代布局和可绘制对象。


布局应该先按大小定义,如果需要,则再按dpi定义。 - Mikooos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接