XML çizilebilir kullanarak dikey çizgi


162

Ben çizilebilir olarak kullanılacak bir dikey çizgi (1dp kalınlığında) tanımlamak için nasıl anlamaya çalışıyorum.

Yatay bir tane yapmak için oldukça basittir:

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

Soru şu, bu çizgi nasıl dikey hale getirilir?

Evet, 1px kalınlığında bir dikdörtgen şekil çizme, ancak birden çok <item>öğeden oluşuyorsa çekilebilir XML'yi karmaşık hale getirme gibi geçici çözümler vardır .

Bununla şansı olan var mı?

GÜNCELLEME

Dava hala çözülmedi. Ancak, bir Android dokümantasyon Haçlı Seferi'ndeki herkes için - bunu yararlı bulabilirsiniz: Eksik Android XML Kılavuzu

GÜNCELLEME

Doğru olarak işaretlediğimden başka bir yol bulamadım. Bu biraz "ağır" hissediyor olsa da hile yapar, bu yüzden eğer cevabı bilmek unutmayın paylaşmayı unutmayın;)

Yanıtlar:


394

Bir şekil yerine şunları deneyebilirsiniz View:

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

Bunu sadece yatay çizgiler için kullandım, ancak dikey çizgiler için de işe yarayacağını düşünürdüm.

kullanın:

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

yatay bir çizgi için.


4
teşekkürler Mark :)! Bunu başarmak için bir görüş kullanabileceğimin farkındayım. Mesele şu ki, bir tablo hücresinin arka planı için çekilebilir olarak kullanmak istediğim biraz daha karmaşık bir görünüm oluşturuyorum. Orada farklı şekil / degradeler / çizgiler vardır. Bir bakış açısı kullanmak bir çözüm olabilir, ancak farklı bir çizim "katmanı" koymak zorunda kalacağım ve yeniden boyutlandırma vb. Karşı karşıya geldiğinde potansiyel olarak kendinizi ayağından vuruyor vb. Sadece " şekil "xmls, belki Google'dan biri bizi aydınlatabilir? :)
Kaspa

1
Kenarlarda yer açmak için marginRight / Start ve Left / End kullanmak bazen ilginçtir.
George

108

Şeklinizi bir döndürme etiketinin içine yerleştirebilirsiniz.

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

Ancak, tek sorun, mizanpaj xml dosyasında tanımlanan mizanpaj parametrelerinin orijinal şekli çizmek için kullanılan boyutlar olmasıdır. Satırınızın 30dp uzunluğunda olmasını istiyorsanız, xml düzeninizde 30dp bir layout_width tanımlamanız gerekir. Ancak bu durumda son genişlik de 30dp olacaktır, bu da çoğu durumda istenmeyen bir durumdur. Bu aslında hem genişliğin hem de yüksekliğin aynı değer olması gerektiği anlamına gelir, çizgi için istediğiniz uzunluğun değeri. Bunu nasıl düzeltebileceğimi bilemedim.

Bu "android yolu" çözümü gibi görünüyor, ama bahsettiğim boyutlar sorunu için bazı düzeltme veya geçici çözüm olmadıkça, bu muhtemelen çoğu insan için işe yaramaz. Gerçekten ihtiyacımız olan şey <şekil /> veya <kontur /> yönelim özelliğidir.

Ayrıca, döndürme etiketinin niteliklerinde başka bir çizilebilir öğeye başvurmayı deneyebilirsiniz, örneğin:

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

Ancak bunu test etmedim ve aynı sorunlara sahip olmasını bekliyorum.

-- DÜZENLE --

Aslında bir çözüm buldum. İstenmeyen ekstra alandan kurtulmak için düzen xml'nizde negatif bir kenar boşluğu kullanabilirsiniz. Gibi:

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

4
negatif kenar boşluğu cihazların% 99'u için çalışacaktır .... sadece biliyorum, eğer bunu yaparsanız Kapatmaya zorlayacak cihazlar var. Bazı cihazlar negatif bir marjı şişirmede sorun yaşıyor
Kent Andersen

2
@cephus İlk kodunuzu kullanıyorum, ancak görünümün üstündeki satıra ihtiyacım var. Benim görüşümün merkezinde. Bunun için bir yerçekimi nasıl ayarlayabilirim (şekil xml dosyasının içinde)?
Behzad

20

Rotate özelliğini kullanabilirsiniz

 <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
Bu kesinlikle daha iyi (veya en iyi) bir cevaptır, çünkü @ commonsware'in cevabı normal dikey çizgiler için yeterlidir. Kesik çizgiler oluşturmak istemiyorsak (örneğin diyelim), düzgün çalışan tek cevap budur.
Subin Sebastian

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>

Benim için çalışıyor . Fill_parent veya dp yüksekliğinde sabit boyutlu görünümün arka planı olarak koy


11

Farklı bir çözüm buldum. Buradaki fikir, çekilebilir çizgiyi önce çizginin olmasını istediğiniz renkle doldurmak ve ardından sol veya sağ dolgu kullanırken tüm alanı arka plan rengiyle tekrar doldurmaktır. Açıkçası bu sadece çekmecenizin en solunda veya sağında dikey bir çizgi için çalışır.

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

Sol, sağ, alt kenarlıklı arka plana ihtiyacım vardı ve bu benim için çalıştı, teşekkürler!
Andrii Chernenko

Harika, bununla LinearLayout ( showDividers="middle") içinde düzgün bölücüler oluşturmayı başardım . 2dp bölücü almak için android:left="3dp"burada belirtmem gerekiyordu.
Jonik

İpucu: Bu çekilebilirliği daha genel hale getirmek için sabit kodlama @android:color/transparentyerine kullanın @color/background_color.
Jonik

Aslında dikey bölücü ihtiyaçlarım için bu çözüm daha da basit . :)
Jonik

@Jonik Tabii, ama bu sadece sabit bir yükseklik görünümü ile çalışır, ile değil wrap_content.
Eric Kok

10

Bence bu en basit çözüm:

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

Olağanüstü. Ekle android:heightiçin sizede bu boyutu kontrol etmek istiyorsanız.
Giulio Piancastelli

4

Ekstra bir görünüm eklemek hantal olurdu, bu yüzden görünümlerimi dinamik / programatik olarak eklemek gerekiyordu. Görünüm yüksekliğim WRAP_CONTENT idi, bu yüzden dikdörtgen çözümü kullanamadım. Burada TextView genişletme, onDraw () geçersiz kılma ve satırda boyama hakkında bir blog yazısı buldum , bu yüzden bunu uyguladım ve iyi çalışıyor. Aşağıdaki koduma bakın:

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);
    }
}

Solda dikey bir çizgiye ihtiyacım vardı, ancak çizim parametreleri drawLine(startX, startY, stopX, stopY, paint)herhangi bir düz çizgiyi görünüm boyunca herhangi bir yönde çizebilirsiniz. Sonra aktivitemde NoteTextView note = new NoteTextView(this); bunun yardımcı olduğunu umuyorum.


3

çok basit ... android xml dikey bir çizgi eklemek için ...

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

Üst yükseklik wrap_content olarak ayarlandığından yükseklik için fill_parent kullanamadığınızda bu harika çalışır.
Sergey Aldoukhov

2

Dikey çizgiye sahip olmak istediğiniz yere bağlıdır, ancak örneğin dikey bir kenarlık istiyorsanız, üst görünümün arka planının özel bir çizilebilir olmasını sağlayabilirsiniz. Ve sonra çekmeceyi şu şekilde tanımlayabilirsiniz:

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

Bu örnek, görünümün sağ tarafında 1dp ince siyah bir çizgi oluşturacak ve arka plan olarak bu çizilebilir olacaktır.


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

Kimse bu seçenekten bahsetmemiş gibi görünüyor:

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

Bir şekil kullanabilirsiniz, ancak bir çizgi yerine onu dikdörtgen yapın.

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

ve Düzeninizde bunu kullanın ...

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

Çizgilerin boyutuna bağlı olarak, tek bir satıra almak için genişlikle oynamanız gerekebilir.

Umarım şerefe yardımcı olur


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

Dikey bir çizgi yapmak için, 1dp genişliğinde bir dikdörtgen kullanın:

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

Kullanmayın stroke, kullanımı solidçizginin rengini belirtmek için ( "dolgu" renktir).


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

        android:background="#ffffff"
        android:padding="10dp" />`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.