web-dev-qa-db-ja.com

オープンサイドAndroid stroke?

Android特定の側面のみにストロークを持つシェイプオブジェクトを作成できますか?

例えば、私が持っている:

<stroke 
 Android:width="3dip" 
 Android:color="#000000"
    Android:dashWidth="10dip" 
    Android:dashGap="6dip" />

これはこのCSSに似ています:

border: 3px dashed black;

片側だけにストロークを設定するにはどうすればよいですか?これは私がCSSでそれを行う方法です:

border-left: 3px dashed black;

Android XML?

88
Reed Morse

私はこれで良い解決策を達成しました:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- This is the line -->
    <item Android:top="-1dp" Android:right="-1dp" Android:left="-1dp">
      <shape>
            <solid Android:color="@Android:color/transparent" />
            <stroke Android:width="1dp" Android:color="#ffffff" />
      </shape>
    </item>

</layer-list>

これは、透明な背景が必要な場合にうまく機能しますが、まだストロークの色は開いています(私の場合、一番下の行だけが必要です)。背景色が必要な場合は、Maraguesの回答のように、単色の色を追加できます。

編集1

場合によっては、高密度デバイスの場合、低いディップ値を使用すると、非常に細いまたは見えないストロークまたは距離で終わることがあります。これは、ListViewディバイダーを設定するときにも発生する場合があります。

最も簡単な回避策は、1dpではなく1pxの距離を使用することです。これにより、すべての密度で線が常に表示されます。 最良の解決策は、各密度の次元リソースを作成し、各デバイスに最適なサイズを取得することです。

編集2

楽しいですが、6年後にこれを使用しようとしましたが、Lollipopデバイスでは良い結果が得られません。

おそらく現在の解決策は9パッチを使用することです。 Androidは、この問題を簡単に解決できるはずです。

118
htafoya

リストレイヤーを使用してこれを解決しました。2つの形状を組み合わせ、そのうちの1つは高さ1dpを下部に配置しました

optionscreen_bottomrectangle.xml:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- This is the line -->
<item>
      <shape>
            <solid Android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item Android:bottom="1dp">
     <shape>
           <solid Android:color="#252525" />
     </shape>
</item>
</layer-list>

次に、layout/main.xmlファイルで

<TextView
    Android:id="@+id/bottom_rectangle"
    Android:background="@drawable/optionscreen_bottomrectangle"
    Android:layout_width="fill_parent"
    Android:layout_height="0dp"
    Android:layout_below="@id/table_options"
    Android:layout_above="@id/exit_bar"/>

これは、table_optionsとexit_barの間のギャップを背景で埋め、exit_barが1dp行を出力する直前です。これは私のためにトリックをしました、私はそれが他の誰かを助けることを望みます。

回答を編集して、レイヤーを正しい順序に配置します。 Thxアレックス!

40
Maragues

私はこの質問がずっと前に投稿されたことを知っているので、この質問を投稿した人は答えを使用しませんが、それでも他人を助けるかもしれません。

 <?xml version="1.0" encoding="UTF-8"?>
    <!-- inset is used to remove border from top, it can remove border from any other side-->
    <inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:insetTop="-2dp"
        >
    <shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:id="@+id/rectangle">
        <stroke Android:width="1dp" Android:color="#b7b7b7" />
        <corners Android:bottomRightRadius="5dp"  Android:bottomLeftRadius="5dp"/>

        <solid Android:color="#454444"/>
    </shape>
    </inset>

insetタグを使用して、削除するサイドボーダーに負の値を指定します。

可能な値は次のとおりです。

Android:insetTop="-1dp" Android:insetBottom="-1dp" Android:insetLeft="-1dp" Android:insetRight="-1dp"

38
Nirmal Dhara

別の方法では、代わりにパディングを使用して他の応答を受け取ります。この小さなスニペットは、上部と下部に境界線を作成します。

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <!-- This is the line -->
    <item>
          <shape>
                <padding Android:left="0dp" Android:top="1dp" Android:right="0dp" Android:bottom="1dp"/>
                <solid Android:color="#898989" />
          </shape>
    </item>
    <!-- This is the main color -->
    <item>
         <shape>
             <solid Android:color="#ffffff" />
         </shape>
    </item>
</layer-list>
30
ug_

レイヤーリストのドロアブルは上から下に描画するため、@ Maraguesの答えは逆です(リストの最後のアイテムが上に描画されることを意味します)。

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- This is the line -->
<item>
      <shape>
            <solid Android:color="#535353" />
      </shape>
</item>
<!-- This is the main color -->
<item Android:bottom="1dp">
     <shape>
           <solid Android:color="#252525" />
     </shape>
</item>

</layer-list>

これにより、図形が線の色で効果的に塗りつぶされ、その上に背景色が描画され、最後の1dpが透けて見えるようになります。

26
Alex Pretzlav

次のコードを使用しました。

<?xml version="1.0" encoding="UTF-8"?>
<!-- inset is used to remove border from top, it can remove border from any other side-->
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:insetTop="-2dp" Android:insetLeft="-2dp" Android:insetRight="-2dp"
    >
    <shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:id="@+id/rectangle">
        <stroke Android:width="1dp" Android:color="@color/colorPrimary" />
        <solid Android:color="#0000"/>
        <padding Android:left="2dp" Android:top="2dp" Android:bottom="2dp" Android:right="2dp"/>
    </shape>
</inset>
2
Ken W.
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >


<item>
    <shape Android:shape="rectangle" >
        <stroke  Android:width="2dp"
                 Android:color="#BBBBBB" />
        <solid Android:color="@Android:color/transparent" />
    </shape>
</item>
<item  Android:bottom="2dp" >
    <shape Android:shape="rectangle" >
        <stroke  Android:width="2dp"
                 Android:color="@color/main_background_color" />
        <solid Android:color="@Android:color/transparent" />
    </shape>
</item>
2
sunny