NinePatch:
截图:
布局XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#ffffff">
<LinearLayout
android:id="@+id/edit_tray"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
<View
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/trash"/>
</LinearLayout>
</RelativeLayout>
期望结果:
“edit_tray”是UI元素,可进行开关控制。当关闭编辑模式时,“edit_tray”(包括垃圾桶图标)会被隐藏。当打开编辑模式时,“edit_tray”会被显示,并覆盖在ScrollView内容上。
垃圾桶图标由两个元素组成:图标本身和它后面的线性渐变。NinePatch图像包含三个可伸缩区域和一个静态区域以适应这些元素。图像中央的垃圾桶图标是静态的,应该直接出现在屏幕底部的水平中心位置。渐变应该从一边延伸到另一边并覆盖在屏幕底部。
问题?
NinePatch图像在图像水平两侧仅包含一个像素的可伸缩区域。理论上,这样的效果应该是垃圾桶图标会直接出现在中心(左边的1个像素等于右边的1个像素)。然而,如上面的截图所示,情况并非如此。注意:该截图来自我的测试手机——T-Mobile G2。在模拟器中也可以看到同样的问题。但是,在draw9patch预览和eclipse图形布局视图中,图像是完全分配的。
我尝试了几种不同的方法,试图找出错误在哪里,并尝试修复它或解决它。包括:使用ImageView而不是View(相同效果),使用android:scaleType="fitXY"(相同问题),在运行时检查屏幕宽度和“edit_tray”宽度是否相同(它们是相同的),使用两个不同的图像作为渐变(作为edit_tray背景)和图标(作为ImageView src)(会导致另一个问题,即两个图像未重叠。通过在两个图像上设置绝对高度来解决)。等等。
答案、解决方法和真正的问题
我使用一些具有每侧最多六个可伸缩区域的简单NinePatch图像进行了一些测试。我注意到在至少一个测试情况下(手机、模拟器、draw9patch、eclipse图形布局)存在一些显示问题。
我决定尝试水平扩展图像,以便在垃圾桶图标的边缘显示更多线性渐变。我将图像大小调整为128x64(之前为64x64)。我使更多的边缘成为可拉伸部分,以尝试遏制可能发生在图像上的任何错误计算。Draw9patch报告了糟糕的部分,因此我将它放回到只有两个像素,一个在每侧。它奏效了!图标现在直接位于屏幕中心!我不知道为什么,但是只要改变图像的宽度到128,而不改变图像的可拉伸部分,它现在就能工作。我尝试将图像重新调整到大约100像素宽以去除一些冗余像素,结果错误又出现了!不仅如此,图标的位置与屏幕中心相同的偏移量。我无法理解为什么会这样。
有人有任何想法吗?这是一个错误吗?
目前,我通过上述的解决方法解决了这个问题,但如果有人有任何建议,我会倾听。