首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android缩放与密度问题

Android缩放与密度问题
EN

Stack Overflow用户
提问于 2013-05-21 21:09:36
回答 1查看 2.4K关注 0票数 1

Update:一些研究发现华硕变压器TF700T (高端)的像素密度应该在224个左右,所以159个安卓报告的值要么是错误的,要么是被修改了(lcd密度键在/system/build.port),但由于某种原因我找不到。

我有两个几乎相同的平板电脑,我正在开发,两个ASUS变压器的,和两个10.1“。

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

代码语言:javascript
复制
dm.Density = 1.5
dm.DensityDpi = High
dm.WidthPixels = 1920
dm.HeightPixels = 1128
dm.Xdpi = 159.8951
dm.Ydpi = 159.5811

低端模型有:

代码语言:javascript
复制
dm.Density = 1
dm.DensityDpi = Default
dm.WidthPixels = 1280
dm.HeightPixels = 752
dm.Xdpi = 160.1576
dm.Ydpi = 160

高端模型存在差异。密度/密度Ydpi为1.5 /高,这对10.1“屏幕内高分辨率的b/c是有意义的。但要得到1.5的值,Xdpi/Ydpi = 240就不会这样(方程见support.html)

代码语言:javascript
复制
px = dp * (dpi / 160) 

哪里

代码语言:javascript
复制
scale = (dpi / 160)

所以

代码语言:javascript
复制
240/160 = 1.5 

160的Xdpi/Ydpi不对应1.5密度(标度)因子,即160/160 = 1,对吗?

新闻部和标度系数之间的差异导致我在这两块平板电脑之间出现了一些尺寸不匹配,我使用的函数(Context.Resources.GetDimension)在高端平板电脑上的值过高(或者在低端,取决于我基于哪个“正常/好”大小)。

也就是说,如果密度是1,或者xdpi/Ydpi是240,我就不会有这个问题了。这些值似乎不像它们应该的那样是相互关联的。这可能是因为ASUS可能已经将LCD密度设置设置为159,以获得更高的分辨率(in /system/build.port-我查找了ro.sf.lcd_density键(使用ROM工具箱)来确认,但找不到)。

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

高端片剂:

代码语言:javascript
复制
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

低端片剂:

代码语言:javascript
复制
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

视图的布局声明位于

代码语言:javascript
复制
<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"/>

它引用的酒窝定义为

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2013-05-22 19:12:24

注意:,我不会接受我自己的答案,所以希望有人知道这是怎么回事,我会尝试一下。我贴出了这个答案b/c -它确实解决了我的问题,但仍然没有解决一些潜在的问题和谜团。

嗯,在我自己做了一些计算之后,看起来高端设备的Xdpi/Ydpi值更精确,而低端设备报告的值高于计算值。两者都有物理尺寸

代码语言:javascript
复制
length = 7.12"
width = 10.35"

所以,我们要买高端平板电脑

代码语言:javascript
复制
Xdpi = 1920 / 10.35 = 185.5
Ydpi = 1128 / 7.12 = 158.4

对于低端的那个

代码语言:javascript
复制
Xdpi = 1280 / 10.35 = 123.7
Ydpi = 752 / 7.12 = 105.6

Asus文档称

代码语言:javascript
复制
dpi (high-end) = 224
dpi (low-end) = 149

我确实意识到,android“桶装”设备基于密度分为4组:低、中、高、甚高,并在此基础上分配带有预设值的(抽象) dpi值(in /system/build.支柱):120、160、240和320

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

代码语言:javascript
复制
Density (high-end) = 1.5
Density (low-end) = 1

因此,正如android (support.html)为支持多个屏幕而建议的那样,我为两个版本的dimens.xml创建了两个值文件夹(其中定义了大小):

代码语言:javascript
复制
Resources/Values-Hdpi/dimens.xml
Resources/Values-Mdpi/dimens.xml

并相应地调整了值--Hdpi/ddens.xml有较小的值以补偿1.5的缩放因子,而值-Mdpi/ddens.xml的值“规范化”为1。这两块平板现在都正确地显示了正确的大小。,这不是dp/dip度量的目的吗,这样就不需要显式地定义这些独立的值集了吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16679526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档