我正在尝试为计算器应用程序创建自己的按钮。
我的麻烦在于,我发现很难支持所有不同的屏幕尺寸。
基本上我有很多按钮,就像这样创建
<Button android:text="Button" android:id="@+id/button1"
android:background="@drawable/test"
android:layout_height="60dip" android:layout_width="60dip" android:layout_margin="5dip"></Button>
我的背景是XML drawable
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Bottom 2dp Shadow -->
<item>
<shape android:shape="rectangle">
<gradient android:startColor="#E0E0E0"
android:endColor="#373737"
android:angle="315" />
<corners android:radius="20dip" />
</shape>
</item>
<!-- White Top color -->
<item android:top="5dip" android:left="5dip" android:right="5dip"
android:bottom="5dip">
<shape android:shape="rectangle">
<gradient android:startColor="#9E9E9E" android:endColor="#C5C5C5"
android:angle="270" />
<corners android:radius="20dip" />
</shape>
</item>
基本上是圆角的背景,看起来像斜面,还有一些渐变,让它看起来很漂亮!
<3> 3.2 HVGA上的按钮尺寸正确但是当我查看3.7 FWVGA中的按钮时,宽高比会丢失,并且尺寸与3.2相同,但由于在此屏幕上有更多像素可供使用,因此图像尺寸不正确。
无论如何要保持这种情况下的一致性???
答案 0 :(得分:8)
问题
正如您已经提到的,问题是有更多可用的屏幕空间。这意味着您必须根据填充可用空间来调整按钮的大小,例如用4个按钮填充显示器的可用宽度,并缩放它们的高度,使图形的纵横比保持不变。
您在这里使用的是dp
单位,这在定义布局时绝对可以。但在这种情况下,它告诉布局“这个东西有一个固定大小的XX dp”(你可以把dp看作一个固定单位,固定数量只是由显示布局的设备决定)。你不想要一个固定的大小。您希望按钮以动态方式拉伸。
解决方案
为上述布局提供解决方案:您可以使用LinearLayout
及其layout_weight
属性。这里有一些简短(不完整)的示例代码来说明原理:
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<Button android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<Button android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<Button android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
这里会发生什么?
首先,我们创建一个外部LinearLayout
,它填充整个父宽度(=整个屏幕宽度),并根据内容调整它的高度。标准的东西。
然后我们添加4个按钮。这里的相关部分是layout_weight
。这告诉每个按钮“尽可能地填充可用空间”。由于现在每个人都试图伸展,我们必须定义每个按钮获得多少空间。这是给layout_weight
的数字。在这里,每个按钮的数字相同。这意味着每个按钮的尺寸与其他任何尺寸相同。那么布局如何确定多少空间呢?它计算它的子项的总重量,这里是4,并根据child_weight / total_weight的比率给每个子项空间。所以每个按钮占宽度的1/4。 (你也可以分配任何其他数字,如果你给每个按钮增加重量3,每个按钮将获得宽度的3/12,根据数学仍然是1/4 :))
还有一个问题:为什么layout_width="0dp"
?据我所知,这只是阻止了一些不必要的内部计算。您需要知道的是,在使用layout_weight
属性时,使用0dp作为缩放维度。如果你想了解更多,你可以研究一下。
<强>样品强>
以下是实践中的两个截图:
2.7“QVGA
3.7“FWVGA
答案 1 :(得分:0)
您可以使用“配置限定符”并根据分辨率声明不同的布局,只需创建如下子文件夹:
drawable-mdpi
drawable-hdpi
因此,您可以根据密度更好地对齐。
另一种解决方案是扩展“Button”类并创建一个自定义小部件,通过调用getWindowManager()。getDefaultDisplay()并在“onCreate()”方法中更改其大小,根据屏幕大小进行对齐。