密度独立性

时间:2012-06-24 14:27:00

标签: android android-layout resolution

我的应用程序中心有一个圆圈。 480x800的分辨率一切都是完美的,但在320x480的分辨率下,圆圈太小了。我在drawable-hdpi文件夹中有一个circle.png,有470px x 470px。我试图在drawable-mdpi文件夹中添加一个带有310x310的circle.png,但结果是一样的。 这是布局xml的代码:

<ImageView
    android:id="@+id/indicator"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"

    />

在每个分辨率下,圆圈与显示器的左右边缘之间的距离是否只有几个像素?

http://imageshack.us/photo/my-images/857/apppv.jpg/

编辑:我最终以这种方式解决了这个问题:

LayoutParams lp = indicator.getLayoutParams();
lp.width = (int) (disW-(disW*0.06));
lp.height = (int) (disW-(disW*0.06));
indicator.setLayoutParams(lp);

//效果非常好,宽高比正确。

EDIT2:这根本不是一个解决方案,因为缩放图像的图像质量非常糟糕......但我发现了两个教程: http://developer.sonymobile.com/wp/2011/06/27/how-to-scale-images-for-your-android%E2%84%A2-application/ http://android.creid.eu/how-to-resize-an-image-and-preserve-quality/

我必须找出哪种方法最好......

3 个答案:

答案 0 :(得分:1)

如果您作为链接附加的圆形图像,则是您选择的样式。你可以使用这个xml。并将此drawable称为相对布局或背景,同时指定其布局:高度和布局:xml中的宽度。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
    <gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" android:angle="270"/>
</shape>

答案 1 :(得分:1)

我的第一个想法是清理你的决议。

您的图片具有数字上难以处理的尺寸。 470 = 2 * 5 * 47.虽然从纯粹的数论 - 理论的角度来看,47是一个引人入胜的数字,但这对你没有好处,因为它不能被分解为你的利益。你的另一个维度,310 = 2 * 5 * 31,并不是更好。问题是你正在使用47和31的(相对来说)大素数。我不知道你的主图像是什么样的,但是,假设你只有470x和310x可以使用它,它我的建议是将470x向上扩展,即向上扩展到480x,并从中得出所有较小的图像。我的推理如下。

我的图像尺寸方法

谷歌最近(好吧,好吧,不久之后)让他们的文件一起行动并产生了一流的design guide for Android。特别是,页面上有一个关于Supporting Multiple Screens的漂亮小图:

Android densities

我想总结一下这个图形如下:

  • xdpi:8(我知道,我知道,我跳过'h'。我觉得这里很蠢)
  • hdpi:6
  • mdpi:4
  • ldpi:3

但我不同意他们使用mdpi作为“基线”。相反,我设计所有主图像的宽度和高度尺寸是至少24的倍数 - 上面整数的LCM(最小公倍数)。有时添加因子5是很方便的,这会使LCM达到120.如果这看起来太大,我可能会使用72而不是 - 一个很棒的数字,其中有一堆2和3。

无论如何,当我选择一个'基线'时,我所选择的是一个数字,其中包括少数2s和3s,有时是5.然后我将该基线乘以2的幂通常为4或8,以确定主图像的大小。这使我能够以多种不同的方式缩放母版以满足设计需求。顺便说一句,这就是Apple等人决定的事情。 (你有没有注意到iPhone的480 = 2 * 2 * 2 * 2 * 2 * 3 * 5?对于320你用3换掉另外2个。)

无论如何,480的主图像尺寸对你来说应该是有用的,因为它似乎在你的绝对大小方面(如果我错了就纠正我),并且开始时的微小尺度应该是'你会花费任何保真度来支付你的费用,因为你只是要缩减它,或者Android会。> / / p>

尽管所有这些并没有直接解决你的问题,但我认为它会帮助你解决一些问题并将事情带到更灵活的基础上。

这是我的第一个想法:)

使用LinearLayout实现百分比

我的第二个想法是带来一些布局技巧。这将更简单一些,并将更直接地解决您的“平等边界”问题。

使用根据此pesudo-XML组织的LinearLayout:

<LL width=match height=wrap horizontal>
<View width=0 height=0 weight=.05 invisible/>
<ImageView width=wrap height=wrap src=mycircle/>
<View width=0 height=0 weight=.05 invisible/>
</LL>

不可见视图将充当间隔符,其宽度将由布局引擎在运行时确定,并且总计.05 + .05 = .1 =屏幕宽度的10%,迫使您的圆圈占据剩下的90%。 (当然,您可以将.05调整为您喜欢的任何内容。)然后,Android会选择适当的?dpi并将其强制设置为屏幕大小的90%。您在选择上面的各种图像尺寸时所付出的努力将在图像缩放时保持真实性。

这是我对你问题的最佳方法的看法。将奇数球47和31素数作为图像尺寸的因子切换为有利于附近数字(48和32),它们是低素数2,3和5的复合物,然后使用不可见的间隔视图强制使用Android的布局引擎。

祝你好运!

答案 2 :(得分:0)

这个简单的图形可以使用9个补丁。 这里有一个非常好的解释是什么是9补丁以及如何使用它。 http://radleymarx.com/blog/simple-guide-to-9-patch/