Android Scaling&密度问题

时间:2013-05-21 21:09:37

标签: android xamarin.android

更新:有些研究表明华硕Transformer TF700T(高端)的像素密度应该在224左右,所以报告的159个android的值要么是错误的,要么是以某种方式修改(/system/build.prop中的lcd-density键),由于某种原因我找不到。

我正在开发两款几乎相同的平板电脑,包括华硕Transformer和10.1“。

高端型号具有以下规格(其中dm = ApplicationContext.Resources.DisplayMetrics):

dm.Density = 1.5
dm.DensityDpi = High
dm.WidthPixels = 1920
dm.HeightPixels = 1128
dm.Xdpi = 159.8951
dm.Ydpi = 159.5811

并且低端模型具有:

dm.Density = 1
dm.DensityDpi = Default
dm.WidthPixels = 1280
dm.HeightPixels = 752
dm.Xdpi = 160.1576
dm.Ydpi = 160

高端型号具有差异性。密度/密度差为1.5 /高,这使得在10.1英寸屏幕内的高分辨率b / c。但是要获得1.5的值,不会Xdpi / Ydpi = 240,这样 (方程式见http://developer.android.com/guide/practices/screens_support.html

px = dp * (dpi / 160) 

其中

scale = (dpi / 160)

所以

240/160 = 1.5 

160的Xdpi / Ydpi与1.5密度(缩放)系数不对应,即160/160 = 1,是否正确?

DPI和缩放因子之间的这种差异导致我两种平板电脑之间存在一些尺寸不匹配, b / c我正在使用的函数(Context.Resources.GetDimension)在高端平板电脑上将值放大太多(或者在低端平板电脑上放得太小,这取决于我在“正常/良好”大小的基础上)。

也就是说,如果第一个平板电脑上的密度为1,或者xdpi / Ydpi为240,我就不会遇到这个问题。这些值似乎没有连接,因为它们应该是连接的。这可能是因为华硕可能已将LCD密度设置为159,以获得更高的分辨率(在/system/build.prop中 - 我查找了ro.sf.lcd_density键(带有ROM工具箱)以确认但不能找到它。)


以下是一些打印输出供参考,来自自定义视图的构造函数:

高端平板电脑:

Context.Resources.GetDimension(control_panel_height_id) = 75
Context.Resources.GetDimension(grid_cell_boarder_width_id) = 1.5
Context.Resources.GetDimension(list_title_height_id) = 40.5
Context.Resources.GetDimension(list_title_text_size_id) = 21
Context.Resources.GetDimension(list_item_text_size_1_id) = 18
Context.Resources.GetDimension(list_item_text_size_2_id) = 15
Context.Resources.GetDimension(month_label_text_size_id) = 33

低端平板电脑:

Context.Resources.GetDimension(control_panel_height_id) = 50
Context.Resources.GetDimension(grid_cell_boarder_width_id) = 1
Context.Resources.GetDimension(list_title_height_id) = 27
Context.Resources.GetDimension(list_title_text_size_id) = 14
Context.Resources.GetDimension(list_item_text_size_1_id) = 12
Context.Resources.GetDimension(list_item_text_size_2_id) = 10
Context.Resources.GetDimension(month_label_text_size_id) = 22

视图的布局声明是

<AppName.Droid.Views.Custom.CustomView
  xmlns:calendar="http://schemas.android.com/apk/res/namespace"
  android:id="@+id/CustomView1"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#1100FF00"
  calendar:control_panel_height="@dimen/control_panel_height"
  calendar:grid_cell_boarder_width="@dimen/grid_cell_boarder_width"
  calendar:list_title_height="@dimen/list_title_height"
  calendar:list_title_text_size="@dimen/list_title_text_size"
  calendar:list_item_text_size_1="@dimen/list_item_text_size_1"
  calendar:list_item_text_size_2="@dimen/list_item_text_size_2"
  calendar:month_label_text_size="@dimen/month_label_text_size"/>

,它引用的尺寸定义为

<resources>
  <dimen name="control_panel_height">50dip</dimen>
  <dimen name="grid_cell_boarder_width">1dip</dimen>
  <dimen name="list_title_height">27dip</dimen>
  <dimen name="list_title_text_size">14dip</dimen>
  <dimen name="list_item_text_size_1">12dip</dimen>
  <dimen name="list_item_text_size_2">10dip</dimen>
  <dimen name="month_label_text_size">22dip</dimen>
</resources>

2 个答案:

答案 0 :(得分:0)

注意:我不接受我自己的回答,所以希望知道发生了什么的人会有所帮助。我发布这个答案b / c它确实解决了我的问题,但仍然没有解决一些潜在的问题和谜团。


好吧,经过我自己的一些计算后,看起来高端设备的Xdpi / Ydpi值更准确,而低端设备的报告值高于计算值。两者的物理尺寸均为

length = 7.12"
width = 10.35"

所以,我们有高端平板电脑

Xdpi = 1920 / 10.35 = 185.5
Ydpi = 1128 / 7.12 = 158.4

和低端的

Xdpi = 1280 / 10.35 = 123.7
Ydpi = 752 / 7.12 = 105.6

华硕文档指出

dpi (high-end) = 224
dpi (low-end) = 149

我确实知道android“ buckets ”设备分为4组,基于密度:低,中,高,非常高,并指定(抽象)dpi值(在/system/build.prop中),其预设值基于: 120,160,240和320

尽管有这些值,但android确实正确地报告了每个的密度(比例因子),这是

Density (high-end) = 1.5
Density (low-end) = 1

因此,正如android(http://developer.android.com/guide/practices/screens_support.html)建议支持多个屏幕一样,我为dimens.xml的两个版本制作了两个Values文件夹(其中定义了大小):

Resources/Values-Hdpi/dimens.xml
Resources/Values-Mdpi/dimens.xml

并相应地调整了值,其中Values-Hdpi / dimens.xml具有较小的值以补偿1.5比例因子,而值-Mdpi / dimens.xml具有“标准化”值,其缩放为1.现在两个平板电脑正确显示正确的尺寸。 但是,这不是dp / dip指标的含义,因此不需要明确定义这些单独的值集吗?

答案 1 :(得分:0)

看起来你像我一样做了。我的意思是你认为AOS使用DisplayMetrics选择资源,但事实并非如此。还有一个配置。因此,例如我认为我的HTC是AOS的HDPI,因为DisplayMetrics真的是hdpi / 240。但是通过配置它的NORMAL。 pls look at stackoverflow.com/questions/15837469/…也许你会觉得它很有用 所以也许你的平板电脑必须使用res / large-mdpi和另一个res / large-hdpi。