web-dev-qa-db-ja.com

図形描画可能サイズが機能しない

私は幅を設定したい非常にシンプルな形状を持っています:

<shape Android:shape="rectangle">
    <solid Android:color="@color/orange"/>
    <size Android:width="2dp"/>
</shape>

ただし、これをEditTextの背景に割り当てると、幅2dpの長方形ではなく、オレンジ色の背景のみが表示されます。サイズの設定が機能しないのはなぜですか?左側にオレンジ色の長方形の透明なドロアブルを作成したい。私もこれをセレクタにラップしています:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_focused="true">
        <shape Android:shape="rectangle">
            <solid Android:color="@color/orange"/>
            <size Android:width="2dp" Android:height="6dp"/>
        </shape>
    </item>
    <item>
        <shape Android:shape="rectangle">
            <solid Android:color="@Android:color/transparent"/>
        </shape>
    </item>
</selector>

サイズを変更するかどうかを確認するために、高さを追加しようとしました。そうではありません。サイズを完全に無視するようなものです。 WTF?

36
chubbsondubs

私にとって、アイテムの重力を「中央」に設定することで問題は解決しました。例えば:

<item Android:id="@Android:id/progress" Android:gravity="center">
    <clip>
        <shape>
            <size Android:height="2dp"/>
            <solid Android:color="@color/my_color"/>
        </shape>
    </clip>
</item>
17
Simple UX Apps

User983447の答えを指定するだけです-サイズ属性は実際には割合を意味します。レイヤーリスト内のすべてのシェイプのサイズを設定する必要があり、スケーリング時に比率として使用されます-layout_weightLinearLayoutの属性。そのため、sizeではなくweightという名前を付ける方がよい

以下は、size属性を使用せずに上下の白い線を実装する回避策です。

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item>
        <shape>
            <solid Android:color="#fff" />
        </shape>
    </item>
    <item Android:top="1dp" Android:bottom="1dp">
        <shape>
            <solid Android:color="#888" />
        </shape>
    </item>
</layer-list>
9
AlexD

foregroundで動作します。背景の重力を設定できないようです。ただし、フォアグラウンドで実行できます。 API 21、23、24をチェックし(まあ、Studioデザインプレビューで)、次のようにImageViewに黒丸のドットを配置します。

<shape Android:shape="oval" xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="@color/colorPrimary" />
    <size Android:height="8dp" Android:width="8dp" />
</shape>

レイアウトスニペットで

    <ImageView
            Android:foreground="@drawable/list_new_dot"
            Android:foregroundGravity="right|center_vertical"
            tools:src="@drawable/model_1_sm"
            />

[〜#〜] update [〜#〜]:レイアウト設計ツールでは機能しているように見えますが、エミュレータ。 UPDATE 2:この回答には数票あるため、新しいインジケータドットを表示するために実際に使用したものを確認することをお勧めします。 https://Gist.github.com/CapnSpellcheck/4d4638aefd085c703b9d990a21ddc1eb

8
androidguy

レイヤーリストは、次の理由で初めてAndroiderにとって非常に不正であることがわかりました。一見すると、ほとんどの場合、アイテムのtop、bottom、right、left属性はFROM、top、bottom、right、leftであると考えられます。ここで、次の値:

<item Android:top="10dp">

それぞれのコンテナの上部から開始点10dpを取得しますか。これはそうではありません。上、下、右、左のOFFと考えてください。 <item Android:top="10dp">は、開始点を10dpオフに設定しますが、ボトムを設定したい場合はどうなりますか?

<item Android:bottom="20dp">

これは、TOPから20dpのボトムを取得するのではなく、コンテナのボトムから20dpオフのボトムを取得します。

したがって、たとえば100dpコンテナの場合、20dpから始まる上端と40dpの下端を持つ長方形が必要な場合:

<item Android:top="20" Android:bottom="60dp">
4
user3442825

形状のサイズ属性は、drawable.getIntrinsicWidthとgetIntrinsicHeightの値を提供します。

ドロウアブルのコンテナ(例:ImageView、TextView)にレイアウトパラメータWRAP_CONTENTがある場合、ドローアブルdrawingStateが変更されるとコンテナの寸法が変更されます。

しかしAndroid ImageView drawingState実装のフレームワークにバグがあります

ImageViewは、state_selectedの描画可能ディメンションによってのみディメンションを更新/サイズ変更しますが、state_activatedには適用しません。

1
user882729

同様の問題がありました。

ドキュメント( http://developer.Android.com/guide/topics/resources/drawable-resource.html#Shape )は次のように述べています:

<サイズ>

形状のサイズ。 (...)

注:形状は、デフォルトでここで定義された寸法に比例して、コンテナビューのサイズに合わせて拡大縮小されます。 ImageViewで図形を使用する場合、Android:scaleTypeを「center」に設定することでスケーリングを制限できます。

私が正しく理解していれば、それは「サイズ」タグがサイズを設定するためではなく、比率を設定するためであることを意味します。

1
user983447

これを使用しました。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle" >

<stroke
    Android:color="@color/lgray"
    Android:width="1dip" />

<corners
    Android:bottomLeftRadius="0dip"
    Android:bottomRightRadius="0.1dip"
    Android:topLeftRadius="0dip"
    Android:topRightRadius="0.1dip" />

<solid Android:color="@color/White" />

</shape>

これをrectangle.xmlにdrawable。に追加し、ビューの背景を設定します。

0
Harshid