オープンサイドAndroidストローク?


93

特定の側にのみストロークを持つ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でこれをどのように行いますか?

回答:


126

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

<?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ディバイダーを設定するときにも発生する可能性があります。

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

編集2

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

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


これもうまくいきましたが、なぜ-1dpの代わりに-2dpを使わなければならなかったのか正確にはわかりません。後者を使用した場合でも、細い線が表示されました。
Edu Zamora

1
@EduZamoraはい、高密度デバイスでは-1dpが期待どおりに機能しないようです
htafoya

すべての辺の境界線も取得していますが、境界線だけではありません。
Cheok Yan Cheng

@YanChengCHEOKは1dpではなく1pxで試してください。
htafoya 2012

@htafoyaこれは素晴らしいソリューションです。ありがとう!
abriggs 2013年

52

この質問はずっと前に投稿されたので、この質問を投稿した人は回答を使用しませんが、それでも他の人の役に立つかもしれません。

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


ええ、私がやったことをしないで、残りの答えを読まずに、挿入タグをストロークタグに入れてください。(回答BTW OPに感謝します。完璧なソリューション)
キラン

エレガント!私はこのソリューションが大好きです
Hao Qi

41

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

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が1 dp行を印刷する直前に表示されます。これは私にとってトリックでした、それが誰かを助けることを願っています。

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


自分で本当に答えたい場合は、答えを投稿しない方が便利です。他の開発者が既に回答があることを確認すると(この場合は実際には回答はありません)、回答する傾向はありません。
MrSnowflake、2010年

31

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

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

4
角を丸くする必要がある場合、これは断然最良の答えです。
MacKinley Smith 14

これも私にものすごく助けてくれました。ぜひ試してみてください
Boy

@ug_これが最良のアプローチだと思います。完全に機能します。ありがとう
Lalit Sharma

動作します。Android Studio(v1.1)プレビューペインでは完全に間違っているように見えますが、デバイスでは問題ありません。
MuratÖgat2015

26

レイヤーリストのドローアブルは上から下に描画されるため、@ 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>

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


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

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

<?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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.