XMLドローアブルを使用した垂直線


162

ドローアブルとして使用する垂直線(1dpの太さ)を定義する方法を理解しようとしています。

水平のものを作るには、それは非常に簡単です:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
    <stroke android:width="1dp" android:color="#0000FF"/>
    <size android:height="50dp" />     
</shape>

問題は、この線を垂直にする方法ですか?

はい、1pxの長方形の図形を描くなどの回避策はありますが、複数の<item>要素で構成される場合、描画可能なXMLが複雑になります。

誰もがこれでチャンスがありますか?

更新

事件は未解決です。ただし、Android文書の十字軍に参加している人にとっては、これが役立つ場合があります。 「Android XMLマニュアルがない」

更新

正しいとマークした方法以外に方法はありませんでした。それはトリックを少し「重い」と感じますが、答えを知っている場合は共有することを忘れないでください;)

回答:


394

形状の代わりに、次のことを試すことができますView

<View
    android:layout_width="1dp"
    android:layout_height="fill_parent"
    android:background="#FF0000FF" />

私はこれを水平線にのみ使用しましたが、垂直線にも機能すると思います。

使用する:

<View
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:background="#FF0000FF" />

水平線。


4
ありがとうマーク:)!私はこれを達成するためにビューを使用できることを知っています。問題は、テーブルセルの背景のドローアブルとして使用したい、もう少し複雑なビューをアセンブルしていることです。そこには、さまざまな種類の形状/グラデーション/ラインがあります。ビューを使用することは解決策ですが、別の描画「レイヤー」に配置する必要があります。これにより、サイズ変更などに遭遇したときに、足元で自分を撃つ可能性があります。「シェイプ "xml、たぶんグーグルの誰かが私たちを啓発することができますか?:)
Kaspa 2010

1
marginRight / StartおよびLeft / Endを使用することも、側面のスペースを確保するために興味深い場合があります。
ジョージ

108

回転タグ内にシェイプをネストできます。

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90">
    <shape 
        android:shape="line">
        <stroke
            android:width="1dp"
            android:color="#ff00ff"
            android:dashWidth="1dp"
            android:dashGap="2dp" />
    </shape>
</rotate>

ただし、唯一の問題は、レイアウトxmlで定義されたレイアウトパラメータが、元の形状の描画に使用される寸法になることです。行の高さを30 dpにする場合は、レイアウトxmlでlayout_widthを30 dpに定義する必要があります。ただし、その場合、最終的な幅も30 dpになるため、ほとんどの状況では望ましくない可能性があります。これは基本的に、幅と高さの両方が同じ値、つまり線に必要な長さの値でなければならないことを意味します。これを修正する方法がわかりませんでした。

これは「Androidの方法」による解決策のようですが、寸法の問題に対する修正または回避策がない限り、ほとんどの人にとってこれはおそらく機能しません。実際に必要なのは、<shape />または<stroke />の方向属性です。

次のような回転タグの属性で別のドローアブルを参照してみることもできます。

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90"
    android:drawable="@drawable/horizontal_line" />

しかし、私はこれをテストしておらず、同じ問題があることを期待しています。

-編集-

ああ、私は実際に修正を見つけました。レイアウトxmlで負のマージンを使用して、不要な余分なスペースを取り除くことができます。といった:

<ImageView
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_marginLeft="-15dp"
    android:layout_marginRight="-15dp"
    android:src="@drawable/dashed_vertical_line" />

4
負のマージンは99%のデバイスで機能しますが、これを行うと強制的に閉じるデバイスが存在します。一部のデバイスはマイナスのマージンを膨らませるのに問題があります
ケントアンデルセン

2
@cephus最初のコードを使用しますが、ビューの上に行が必要です。私の視点の中心にあります。重力(形状xmlファイル内)を設定するにはどうすればよいですか?
Behzad 2013年

20

あなたは回転属性を使うことができます

 <item>
    <rotate
        android:fromDegrees="90"
        android:toDegrees="90"
        android:pivotX="50%"
        android:pivotY="50%" >
        <shape
            android:shape="line"
            android:top="1dip" >
            <stroke
                android:width="1dip"
                 />
        </shape>
    </rotate>
</item>

6
@commonswareの答えは通常の縦線で十分なので、これは間違いなくより良い(または最良の)答えです。破線を作成したくない場合(たとえば)、これが正しく機能する唯一の回答です。
Subin Sebastian 2015

16
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle" >
    <stroke android:width="1dp" android:color="@color/white" />
    <size android:width="2dp" />
</shape>

仕事は私のためです。fill_parentまたはdp高さで固定サイズのビューの背景として配置します


11

私は別の解決策を思いつきました。アイデアは、最初にドローアブルを線にしたい色で塗りつぶし、次に左または右のパディングを使用しながら領域全体を背景色で塗りつぶすことです。明らかに、これはドローアブルの左端または右端の垂直線に対してのみ機能します。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@color/divider_color" />
    <item android:left="6dp" android:drawable="@color/background_color" />
</layer-list>

左、右、下に境界線がある背景が必要でしたが、これでうまくいきました。ありがとう!
Andrii Chernenko 2013

これで、LinearLayout(showDividers="middle")にきちんとした仕切りを作成できました。2 dpの分周器を取得するには、android:left="3dp"ここで指定する必要がありました。
Jonik 2013

ヒント:このドローアブルをより一般的に使用する@android:color/transparentには、ハードコーディングの代わりにを使用します @color/background_color
Jonik 2013

実際、私の垂直分割線のニーズに対しては、このソリューションはさらに簡単です。:)
Jonik 2013

@Jonik確かに、これは固定高さビューでのみ機能し、では機能しませんwrap_content
Eric Kok

10

私はこれが最も簡単な解決策だと思います:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:gravity="center">
        <shape android:shape="rectangle">
            <size android:width="1dp" />
            <solid android:color="#0000FF" />
        </shape>
    </item>

</layer-list>

素晴らしい。そのディメンションも制御android:heightするsize場合は、に追加します。
ジュリオピアン

4

ビューを動的/プログラムで追加する必要があったため、ビューを追加するのは面倒でした。ビューの高さがWRAP_CONTENTだったため、四角形のソリューションを使用できませんでした。私はブログのポスト見つけ、ここで私はそれを実装して、onDrawを上書きのTextViewを拡張()とラインで塗装については、それがうまく動作します。以下の私のコードを参照してください:

public class NoteTextView extends TextView {
    public NoteTextView(Context context) {
       super(context);
    }
    private Paint paint = new Paint();
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(Color.parseColor("#F00000FF"));
        paint.setStrokeWidth(0);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawLine(0, 0, 0, getHeight(), paint);
    }
}

左側に垂直線が必要でしたが、ドローラインパラメータをdrawLine(startX, startY, stopX, stopY, paint)使用すると、ビューを横切る方向に直線を描くことができます。それから私の活動では、 NoteTextView note = new NoteTextView(this); これが役に立てば幸いです。


3

その非常に簡単な... android xmlに垂直線を追加する...

<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:rotation="90"
android:background="@android:color/darker_gray"/>

親の高さがwrap_contentに設定されているため、高さにfill_parentを使用できない場合、これはうまく機能します。
セルゲイアルドゥホフ2014年

2

依存します。垂直線が必要な場所ですが、たとえば垂直境界線が必要な場合は、親ビューにカスタムドローアブルの背景を持たせることができます。そして、あなたはこのようにドローアブルを定義することができます:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape
            android:shape="rectangle">
            <stroke android:width="1dp" android:color="#000000" />
            <solid android:color="#00ffffff" />

        </shape>
    </item>

    <item android:right="1dp">
        <shape android:shape="rectangle">
            <solid android:color="#00ffffff" />
        </shape>
    </item>

</layer-list>

この例では、ビューの右側に1dpの細い黒い線が作成され、このドローアブルが背景になります。


2
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:bottom="-3dp"
        android:left="-3dp"
        android:top="-3dp">

        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimary" />
            <stroke
                android:width="2dp"
                android:color="#1fc78c" />
        </shape>

    </item>

</layer-list>

2

このオプションについて誰も言及していないようです:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@color/white" android:width="1dp"/>
</layer-list>

1

形状を使用できますが、線の代わりに長方形にします。

android:shape="rectangle">
<stroke
    android:width="5dp"
    android:color="#ff000000"
    android:dashGap="10px"
    android:dashWidth="30px" />

そしてあなたのレイアウトでこれを使用してください...

<ImageView
    android:layout_width="7dp"
    android:layout_height="match_parent"
    android:src="@drawable/dashline"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layerType="software"/>

ダッシュのサイズによっては、幅を1行にするために幅を調整する必要がある場合があります。

これが乾杯に役立つことを願っています


1
add this in your styles.xml

        <style name="Divider">
            <item name="android:layout_width">1dip</item>
            <item name="android:layout_height">match_parent</item>
            <item name="android:background">@color/divider_color</item>
        </style>

        <style name="Divider_invisible">
            <item name="android:layout_width">1dip</item>
            <item name="android:layout_height">match_parent</item>
        </style>

then wrap this style in a linear layout where you want the vertical line, I used the vertical line as a column divider in my table. 

     <TableLayout
                android:id="@+id/table"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:stretchColumns="*" >

                <TableRow
                    android:id="@+id/tableRow1"
                    android:layout_width="fill_parent"
                    android:layout_height="match_parent"
                    android:background="#92C94A" >

                    <TextView
                        android:id="@+id/textView11"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp" />
    //...................................................................    

                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider_invisible" />
                    </LinearLayout>
        //...................................................................
                    <TextView
                        android:id="@+id/textView12"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp"
                        android:text="@string/main_wo_colon"
                        android:textColor="@color/white"
                        android:textSize="16sp" />
  //...............................................................  
                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider" />
                    </LinearLayout>

    //...................................................................
                    <TextView
                        android:id="@+id/textView13"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp"
                        android:text="@string/side_wo_colon"
                        android:textColor="@color/white"
                        android:textSize="16sp" />

                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider" />
                    </LinearLayout>

                    <TextView
                        android:id="@+id/textView14"
                        android:paddingBottom="10dp"
                        android:paddingLeft="5dp"
                        android:paddingRight="5dp"
                        android:paddingTop="10dp"
                        android:text="@string/total"
                        android:textColor="@color/white"
                        android:textSize="16sp" />
                </TableRow>

                <!-- display this button in 3rd column via layout_column(zero based) -->

                <TableRow
                    android:id="@+id/tableRow2"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#6F9C33" >

                    <TextView
                        android:id="@+id/textView21"
                        android:padding="5dp"
                        android:text="@string/servings"
                        android:textColor="@color/white"
                        android:textSize="16sp" />

                    <LinearLayout
                        android:layout_width="1dp"
                        android:layout_height="match_parent" >

                        <View style="@style/Divider" />
                    </LinearLayout>

    ..........
    .......
    ......

0

垂直線を作成するには、幅が1 dpの長方形を使用します。

<shape>
    <size
        android:width="1dp"
        android:height="16dp" />
    <solid
        android:color="#c8cdd2" />
</shape>

線の色を指定するにはstroke、を使用しないでくださいsolid(「塗りつぶし」の色)。


-1
 <View
        android:layout_width="2dp"
        android:layout_height="40dp"

        android:background="#ffffff"
        android:padding="10dp" />`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.