15

ナインパッチ:

ゴミ箱アイコン NinePatchイメージ

スクリーンショット:

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 のコンテンツにオーバーレイされます。

ゴミ箱アイコンには 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 幅に戻して余分なピクセルの一部を削除しようとしたところ、エラーが再発しました。戻ってきただけでなく、アイコンが画面の中心からオフセットされたまったく同じ場所に配置されました。なぜこのようなことが起こるのか理解できません。

誰にもアイデアはありますか?これはバグですか?

私は現在、上記の回避策を考慮してこれを機能させていますが、何か提案があれば聞いています.

4

4 に答える 4

5

これで行ったように、9 パッチ イメージを使用4 pointsして作成します。動作します。

ここに画像の説明を入力

9 パッチ画像を作成するためのヒント(デザイナーではなく、私のファンダを教えてください)

  • 左と上に点を置く
  • 間にテキストまたは画像がある場合は、画像の左右とその画像またはテキストの上下にポイントを置きます。
  • 左側のスペースの数と、両側 (左右と上下) のポイントの数が等しいことを常に確認してください。
  • チェックイン 2x ~ 6x を使用する前に、プレビューまたは右側を必ず 1 回チェックしてください。
于 2012-04-06T07:21:10.840 に答える
1

9パッチ描画ツールの使用経験から、画像の両側に1pxの自動オフセットがあります。この情報を考えると、この1ピクセルのオフセットだけを使用している場合、画像は実際には想像どおりに引き伸ばされていませんでした。

これは、2pxのオフセットを使用したときに完璧に機能したという事実からわかります。

また、9パッチの画像は、あなたが思うように正確にEclipseに表示される傾向があります...しかし、電話/エミュレーターでは異なって表示されます。

9パッチツールを学ぶことは、より大きなカスタマイズを可能にするので、間違いなく素晴らしいことです。もう1つのヒントは、Androidの9パッチを独自の変更に置き換えるようなことをしたい場合は、SDKに存在する9パッチをコピーして変更するだけです。何らかの理由で、SDKの9patchイメージには奇妙なオフセットがあります。これを行うと、9パッチから奇妙な応答が得られないことが保証されます。この例-間違った入力が与えられたときに、editTextの輪郭を赤で示します。

SDKイメージは、SDK-> platform-> [plateform-you-want]-> data->res-drawable-[you-choice]にあります。

SDK 9パッチのイメージを見て、9パッチツールがどのように機能するかを理解するのに役立てることもできます。

これがもう少し洞察を与えることを願っています。

ここにいくつかの良いリンクがあります:http: //developer.android.com/guide/developing/tools/draw9patch.html http://android10.org/index.php/articlesother/279-draw-9-patch-tutorial http: //jaanus.com/post/7878186745/how-does-androids-nine-patch-tool-work-from-a

于 2012-03-16T13:27:24.720 に答える
1

9 パッチ描画のバグか、丸めによるエラーかもしれません。

ただし、このアイコンを描画するアプローチは好きではありません。このタスク用に設計されていないものを使用して、画面要素を配置しようとしています。

別の方法で描画する必要があります。グラデーションの背景を持つコンテナー ビュー (FrameLayout) を作成します。次に、その位置の上にゴミ箱のある ImageView を置きます。これらの 2 つの画像はどちらも 9 パッチである必要はありません。グラデーションはビュー全体を塗りつぶし、ゴミ箱はスケーリングなしで描画されます。ゴミ箱ビューの領域にはオーバードローがありますが、CPU 時間は 9 パッチ領域の計算で浪費されません。

ゴミ箱アイコンを正確に配置するには、レイアウト システムを使用します。UI レイアウトは適切に調整されており、画面要素を配置する目的で作成されているため、期待どおりの結果が得られることは間違いありません。9 パッチ画像は他の目的に使用されます (ここで、ピクセルがあちこちに少しシフトしても問題ありません)。

于 2012-04-02T06:49:04.873 に答える
0

@jjNford が言ったように、この方法で画像を操作するのは悪い習慣です。

このタスクの最善の解決策は、背景が透明な「ゴミ箱」アイコンを作成shapeし、グラデーション付きのドローアブルを作成することです。したがって、不要なものを削除LinearLayoutしてのみ使用できImageViewます。

<ImageView
    android:id="@+id/edit_tray"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:src="@drawable/trash"
    android:background="@drawable/gradient_background"/>

shape drawable のドキュメント

編集

画像を確認してください。SE Xperia 2.3.3 では問題なく表示されます。

于 2012-04-03T07:03:51.210 に答える