2012-05-03 9 views
24

を動作していません幅2dpの長方形。なぜサイズを設定していないのですか?私は左側にオレンジ色の長方形の透明な描画可能オブジェクトを作成したいと思います。私はそれがサイズを変更するかどうちょうど見るために高さを追加しようとしました形状Drawableのサイズは私がの幅を設定したい非常に単純な形状を持っている

<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?

+0

どのように?それは魅力のように働く。レイアウトの設定に問題がある可能性がありますか?レイアウトに高さと幅のwrap_contentがあるかどうかを確認してください。 – Daler

+0

かなりシンプルです。 は無視され、常にビューを塗りつぶす図形が作成されます。 – afk5min

+0

必ずしもdrawableTop/Bottom/etc属性では必ずしもそうではありません。 –

答えて

1

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

ドキュメント(http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape)言う:

<サイズ>

形状の大きさ。 (...)

注:形状はコンテナのサイズに比例します。デフォルトでは、ここで定義されている寸法に比例します。 ImageViewでシェイプを使用するときは、android:scaleTypeを "center"に設定することでスケーリングを制限することができます。

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

+4

幅/高さは整数だと言いますが、投稿した内容はパーセンテージ(0..1)、コンテナの寸法(0..view.width)と同じように聞こえますか?それとも、あなたはそれが意味をなさないと言っているのですか?あなたはそれがどのように機能しているかを知っていて、それをドキュメントよりもよく説明できますか私はあなたのことを十分に理解していません。いずれにしても、恐ろしい文書をクリアするか、コードを修正して実際に幅と高さにするためにバグがあるかもしれません。 – chubbsondubs

5

ちょうどuser983447の答えを指定する - サイズ属性は本当に割合を意味します。レイヤーリスト内のすべての図形のサイズを設定する必要があります。layout_weight属性がLinearLayoutのように、スケーリング時に比率として使用されます。だから、それに名前を付けること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> 
+0

gpu overdrawのためにパフォーマンスが悪い(2行のピクセルが2行しかない場合、2つの図形がすべてのピクセルに塗りつぶされます) – Gilian

+0

@Gilianは私が間違っていれば修正しますが、このxmlはaaptを介してDrawableのサブクラスにコンパイルされます。コンパイルは単なるJavaクラスであり、パフォーマンスはgpuの観点から見た9パッチまたはビットマップの場合と同じになります。だから設計がそれを必要とするなら、周りに道はありません –

0

はこれを使用していました。

<?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> 

は、ビューの背景を設定するには、このdrawable.and rectangle.xmlを置きます。

3

次の理由により、最初のAndroiderのレイヤリストが非常に邪悪であることが判明しました。一見すると、ほとんどの人はアイテムの上、下、右、左の属性が上、下、右、左からであると思うでしょう。次の値の場合:

<item android:top="10dp"> 

それぞれのコンテナの先頭から10dpの始点をネットします。これはそうではありません。それを上、下、右、左のOFFと考えてください。 <item android:top="10dp">はまだ始点10dpをオフにしますが、底を設定したいときはどうなりますか?

<item android:bottom="20dp"> 

これはTOP、容器の底部のOFF 20dpのではなく、下から20dpであなたの一番下を得ることはありません。

ので、100dpコンテナで例えば、あなたが40dpで20dpから始まる先頭エッジを持つ矩形と下端を望んだ場合:

<item android:top="20" android:bottom="60dp"> 
+0

これは私が質問を投稿したときに私が実際に理解したものです。コンテナのサイズを知らなくても親コンテナに一致するように展開するシェイプを決して定義することはできないため、すべての値(つまり上、左、下、右)のすべてを上に、左に、この特定のケースでは、固定サイズにする必要があったため、幅/高さを使用して寸法を設定したいと考えましたが、ドキュメントには幅/高さの座標系が説明されていません。 – chubbsondubs

+0

ありがとう、これは素晴らしい説明でした!私が間違っていた場所を理解させ、最終的に問題を解決してください!あなたのために親指を! +1 – Alexiscanny

1

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

描画可能なコンテナ(ImageView、TextViewなど)にレイアウトパラメータWRAP_CONTENTが設定されている場合、描画可能な描画状態が変更されるとコンテナのサイズが変更されます。

はそこ

ImageViewのが唯一の更新/ state_selectedに描画可能な寸法によってその次元のサイズを変更するImageViewのdrawingState実装におけるAndroidのフレームワークのバグですが、上のそれは​​で作業することができ

4

をstate_activatedません。あなたが背景の重力を設定することはできないようです。しかし、あなたは前景にすることができます。私はAPI 21,23、および24(よくスタジオデザインのプレビューで)をチェックし、以下の場所に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> 

UPDATE

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

をスニペット:それは、レイアウト設計ツールで動作しているように見えますが、それはエミュレータで同じに見えていません。 UPDATE 2:この答えはいくつかの票を持っているので、あなたは私が実際に新しい指標ドットを示すために使用されるかどうか確認することがあります:それはあなたのための作業をdoesntの https://gist.github.com/CapnSpellcheck/4d4638aefd085c703b9d990a21ddc1eb