ナインパッチ:
スクリーンショット:
レイアウト 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 のコンテンツにオーバーレイされます。
ゴミ箱アイコンには 2 つの要素があります。アイコン自体と、その背後にある線形グラデーションです。NinePatch 画像には、これらの要素に対応する 3 つの伸縮可能領域と 1 つの静的領域が含まれています。グラフィックの中央にあるごみ箱アイコンは静的で、水平方向の中央と画面の下部に直接表示されます。グラデーションは、画面の下部の一方の端からもう一方の端まで伸びる必要があります。
不具合?
NinePatch 画像には、画像の水平方向の両側に伸縮可能な領域が 1 ピクセルだけ含まれています。その結果、ゴミ箱アイコンが中央に直接表示されます (左側に 1 ピクセル == 右側に 1 ピクセル)。ただし、上のスクリーンショットでわかるように、そうではありません。注: このスクリーンショットは、私のテスト用電話である T-Mobile G2 から取得したものです。エミュレーターでも同じ効果が見られます。ただし、draw9patch プレビューと eclipse グラフィカル レイアウト ビューでは、画像は完全に分散されています。
バグの場所を突き止め、修正または回避するために、いくつかの方法を試しました。含む: Views の代わりに ImageViews を使用する (同じ効果)、android:scaleType="fitXY" を使用する (同じ問題)、実行時に画面の幅と「edit_tray」の幅が同じであることを確認する (同じである)、グラデーション (edit_tray 背景として) とアイコン (ImageView src として) に 2 つの異なる画像を使用する (2 つの画像が互いにオーバーレイされないという別の問題が発生します。両方に絶対高さを設定することで修正されます) など。
答え、回避策、および本当の質問
片面あたり最大 6 つの伸縮可能な領域を持ついくつかの単純な NinePatch 画像を使用して、いくつかのテストを行いました。少なくとも 1 つのテスト ケース (電話、エミュレーター、draw9patch、Eclipse のグラフィカル レイアウト) でそれらを表示する際に問題があることに気付きました。
画像を水平方向に拡大して、ゴミ箱アイコンの端に線形グラデーションがより多く表示されるようにすることにしました。画像を 128x64 (以前は 64x64) にしました。画像に発生していた悪い計算 (?) を抑えるために、伸縮可能な部分のエッジ部分を増やしました。Draw9patch が不良セクションを報告したので、両側に 1 つずつ、2 つのピクセルだけに戻しました。出来た!アイコンが画面中央に表示されるようになりました!理由はわかりませんが、画像の実際の伸縮可能な部分を変更せずに、画像の幅を 128 に変更するだけで機能するようになりました。
画像のサイズを約 100px 幅に戻して余分なピクセルの一部を削除しようとしたところ、エラーが再発しました。戻ってきただけでなく、アイコンが画面の中心からオフセットされたまったく同じ場所に配置されました。なぜこのようなことが起こるのか理解できません。
誰にもアイデアはありますか?これはバグですか?
私は現在、上記の回避策を考慮してこれを機能させていますが、何か提案があれば聞いています.