九补丁:
截屏:
布局 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 图形布局视图中,图像是完美分布的。
我尝试了几种不同的方法来尝试找出错误所在并尝试修复它或解决它。包括:使用 ImageViews 代替 Views(效果相同),使用 android:scaleType="fitXY"(相同问题),在运行时检查屏幕的宽度和“edit_tray”的宽度是否相同(它们是),使用两个不同的图像作为渐变(作为edit_tray背景)和图标(作为ImageView src)(创建另一个问题,两个图像没有相互重叠。通过在两者上设置绝对高度来修复)等。
答案、解决方法和真正的问题
我使用一些简单的 NinePatch 图像进行了一些测试,每边最多六个可拉伸区域。我注意到在至少一个测试用例(电话、模拟器、draw9patch、eclipse 中的图形布局)中显示它们存在一些问题。
我决定尝试水平扩展图像,以便在垃圾桶图标的边缘显示更多的线性渐变。我制作了 128x64 的图像(以前是 64x64)。我制作了更多可拉伸部分的边缘部分,以试图遏制图像上发生的任何糟糕的数学(?)。Draw9patch 报告了坏的部分,所以我把它放回只有两个像素,两边各一个。有效!图标现在直接位于屏幕中央!我不知道为什么,但没有改变图像的实际可拉伸部分,只将图像的宽度更改为 128,它现在可以工作了。
我尝试将图像的大小调整回大约 100px 宽以删除一些冗余像素,然后错误又回来了!它不仅回来了,而且图标被放置在与屏幕中心偏移的完全相同的位置。我不明白为什么会这样。
有人有想法么?这是一个错误吗?
考虑到我上面描述的解决方法,我目前有这个工作,但如果有人有任何建议,我正在听。