android: drawable Lewy margines i / lub dopełnienie


Odpowiedzi:


464

Jak wspomniano android:drawablePaddingcephus wymusi wypełnienie między tekstem a rysunkiem tylko wtedy, gdy przycisk jest wystarczająco mały.

Podczas układania większych przycisków można używać android:drawablePaddingw połączeniu z android:paddingLefti, android:paddingRightaby wymusić tekst i możliwość rysowania do wewnątrz w kierunku środka przycisku. Dostosowując osobno lewą i prawą wyściółkę, możesz bardzo szczegółowo dostosować układ.

Oto przykładowy przycisk, który używa dopełnienia, aby zbliżyć tekst i ikonę bliżej siebie niż byłoby to domyślnie:

<Button android:text="@string/button_label" 
    android:id="@+id/buttonId"
    android:layout_width="160dip"
    android:layout_height="60dip"
    android:layout_gravity="center"
    android:textSize="13dip"
    android:drawableLeft="@drawable/button_icon"
    android:drawablePadding="2dip"
    android:paddingLeft="30dip"
    android:paddingRight="26dip"
    android:singleLine="true"
    android:gravity="center" />  

21
android: paddingLeft = "30dip" android: paddingRight = "26dip" są tutaj kluczowe!
— IgorGanapolsky

4
nie ma to związku z pytaniem, ale android: gravity = "center" utrzyma tekst wyrównany do środka rysunku!
— cwhsu

1
Co się stanie, jeśli będziemy mieli drawable zarówno po lewej, jak i po prawej stronie, i będziemy musieli tylko dopasować prawo do rysowania?
— nmxprime

Używam tylko: android: paddingLeft, i to zmienia pozycję obrazu. android: drawablePadding służy do odstępu między obrazem a tekstem.
— Brave

Problemem tego kodu jest to, że powoduje, że passwordToggleDrawablelewa przerwa na wypełnianie staje się większa, ponieważ nie jest w stanie określić docelowego tylko lewego rysowania.
— Fruit

184

TextView ma android: drawablePadding mienia, które powinno załatwić sprawę:

Android: drawablePadding

Wypełnienie między rysunkami a tekstem.

Musi to być wartość wymiaru, która jest liczbą zmiennoprzecinkową dołączoną do jednostki, takiej jak „14,5 sp”. Dostępne jednostki to: px (piksele), dp (piksele niezależne od gęstości), sp (piksele skalowane na podstawie preferowanego rozmiaru czcionki), cale (cale), mm (milimetry).

Może to być również odniesienie do zasobu (w postaci „@ [pakiet:] typ: nazwa”) lub atrybutu motywu (w postaci „? [Pakiet:] [typ:] nazwa”) zawierającego wartość tego typu .

Odpowiada to symbolowi globalnego zasobu atrybutu drawablePadding.


61

android:drawablePaddingutworzy odstęp wypełniania między tekstem a rysunkiem, tylko jeśli przycisk jest wystarczająco mały, aby ściśnąć 2 razem. Jeśli przycisk jest szerszy niż łączna szerokość (dla drawableLeft / drawableRight) lub wysokość (dla drawableTop / drawableBottom), wówczas drawablePadding nic nie robi.

Ja też mam z tym problem. Moje przyciski są dość szerokie, a ikona wisi na lewej krawędzi przycisku, a tekst jest wyśrodkowany na środku. Moim jedynym sposobem obejścia tego problemu jest upieczenie marginesu na rysunku, dodając puste piksele do lewej krawędzi płótna w Photoshopie. Nie jest to idealne i też nie jest zalecane. Ale to na razie moje rozwiązanie stop-gap, bez odbudowywania TextView / Button.


dzięki za wyjaśnienie mojego problemu. Nie zdawałem sobie sprawy, że jest to spowodowane tylko wtedy, gdy przycisk jest wystarczająco szeroki
— peter.bartos

Mam ten sam problem. Mój przycisk jest szeroki, więc rysunek nie jest zbliżony do tekstu
— Milad Faridnia

tak, zadziałało dzięki
— dave o grady

43

Tak. użyj drawablePadding w następujący sposób,

<TextView
        android:id="@+id/tvHeader"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Settings and Contents"
        android:drawableLeft="@drawable/icon_success"
        android:drawablePadding="10dp" />

37

Stwórz swój drawable resources.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <inset android:drawable="@drawable/small_m" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
    <item>
        <inset android:drawable="@drawable/small_p" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
</selector>

2
@ Najlepszy artysta Używam wstawki w rysowalnych i działa dobrze na nowszych wersjach urządzeń. Mam na myśli, że nie działa w SDK 16, 17, ale działa w SDK 23. Czy jest jakiś pomysł?
— Bhavin Chauhan


Ładna odpowiedź i głosowanie za tym. Pomagasz mi rozwiązać problem, który długo mnie mylił.
— Anthonyeef

34

android:drawablePaddingjest najłatwiejszym sposobem nadania wypełnienia ikonie do rysowania, ale nie można podać określonej wypełnienia z jednej strony, takiej jak paddingRightlub paddingLeftikony do rysowania. Aby to osiągnąć, musisz w nią zagłębić. A jeśli złożysz podanie paddingLeftlub paddingRightdo Edittextniego, to Edittextwstawi wypełnienie do całości wraz z ikoną do rysowania.


12

zdefiniuj kształt dla swojego tekstu edycyjnego i nadaj mu dopełnienie Na przykład

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <padding
        android:left="5dp"
        android:right="5dp"
    />
    <solid android:color="#F6F6F6" />
    <stroke
        android:width="1px"
        android:color="#C3C3C3" />

    <corners
        android:bottomLeftRadius="1dp"
        android:bottomRightRadius="1dp"
        android:topLeftRadius="1dp"
        android:topRightRadius="1dp" />
</shape>

Dopełnienie zdefiniowane w tym kształcie pomoże w dopełnieniu do przeciągnięcia w lewo lub w prawo ---------------------- Zastosuj ten kształt w EditView

 <EditText
            android:id="@+id/example"
            android:layout_width="fill_parent"
            android:layout_height="36dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/shape2"
            android:drawableLeft="@drawable/icon1"
            android:drawablePadding="@dimen/txtDrwblPadding"
            android:ems="10"
         />

użycie tego zdefiniowanego kształtu jako tła da Twojemu EditText trochę stylu plus margines do drawableLeft.


12

android: drawable Padding to najprostszy sposób nadania wypełnienia ikonie do rysowania, ale nie można podać określonego wypełnienia z jednej strony, takiego jak paddingRight lub paddingLeft z drawable icon.Aby to osiągnąć, musisz się w to zagłębić. A jeśli zastosujesz paddingLeft lub paddingRight do Edittext, wówczas wstawi padding do całego Edittext wraz z ikoną do rysowania.

<TextView android:layout_width="match_parent"
    android:padding="5sp"
    android:id="@+id/date"
    android:gravity="center|start"
    android:drawableEnd="@drawable/ic_calendar"
    android:background="@drawable/edit_background"
    android:hint="Not Selected"
    android:drawablePadding="10sp"
    android:paddingStart="10sp"
    android:paddingEnd="10sp"
    android:textColor="@color/black"
    android:layout_height="wrap_content"/>

Powinieneś używać „dp”
— Mark Pazon

11
<TextView
    android:layout_width="wrap_content"
    android:layout_height="32dp"
    android:background="@drawable/a"
    android:drawableLeft="@drawable/concern_black"
    android:gravity="center"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:drawablePadding="10dp"
    android:text="text"/>

Uwaga: szerokość_szablonu musi być zawijana_zawartość i używać paddingLeft paddingRight drawablePadding, aby kontrolować odstęp. Jeśli określisz wartość layout_width, wartość będzie miała odstęp między ikoną a tekstem, myślę, że gdy nadasz parametrowi layout_width określoną wartość, dopełnienie będzie mierzyć.


9

Wrzucę też moją odpowiedź na ring. Jeśli chcesz to zrobić programowo, możesz wykonać następujące czynności.

final Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.somedrawable);
final boolean isLTR = ViewCompat.LAYOUT_DIRECTION_LTR == ViewCompat.getLayoutDirection(this);
final int iconInsetPadding = getResources().getDimensionPixelSize(R.dimen.icon_padding);

final Drawable insetDrawable = new InsetDrawable(drawable, isLTR ? 0 : iconInsetPadding, 0, isLTR ? iconInsetPadding : 0, 0);

Spowoduje to dodanie dopełnienia na końcu rysunku, gdzie koniec będzie oznaczał lewo / prawo, w zależności od tego, czy telefon jest w trybie LTR czy RTL.


7

Zamiast Buttonstosowania LinearLayoutz ImageVieworaz TextViewwewnątrz. W elementach podrzędnych takich jak ImageViewi TextViewużywaj android:duplicateParentState="true".


Będziesz potrzebować FrameLayout i Button (oraz ImageView / TextView wewnątrz ich własnego LinearLayout) do odtworzenia interfejsu użytkownika Button i przeniesienia onclicklistenerener () do części z przyciskami
— 3c71

1
Po co używać dodatkowego układu, jeśli masz już rysunkowyPadding w TextView.
— Parinda Rajapaksha

5

Powinieneś rozważyć użycie listy warstw

Utwórz plik do rysowania, taki jak ten, nazwij go ic_calendar.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <solid android:color="@android:color/transparent"/>
    </shape>
</item>
<item android:right="10dp">
    <bitmap android:gravity="center_vertical|left"
        android:src="@drawable/ic_calendar_16dp"
        android:tint="@color/red"
        />
</item>
</layer-list>

W pliku układu

<TextView
         android:id="@+id/tvDate"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:drawableLeft="@drawable/ic_calendar"
         android:textColor="@color/colorGrey"
         android:textSize="14sp" 
    />

4

Możesz użyć padding dla przycisku i możesz grać z padablePadding

 <Button
    style="@style/botonesMenu"
    android:padding="15dp"
    android:drawablePadding="-15dp"
    android:text="@string/actualizarBD"
    android:textAlignment="gravity"
    android:gravity="center"
    android:layout_row="1"
    android:layout_column="0"
    android:drawableTop="@drawable/actualizar"
    android:id="@+id/btnActualizar"
    android:onClick="actualizarBD" />

możesz użyć konkretnego paddingu w zależności od tego, gdzie umieścisz swój drawable, z Androidem: paddingLeft = "10dp" lub androidem: paddingBottom = "10dp" lub androidem: paddingRight = "10dp" lub androidem: paddingTop = "10dp"


2

Możesz użyć, android:drawableLeft="@drawable/your_icon"aby ustawić rysunek, który będzie wyświetlany po lewej stronie. Aby ustawić padding dla drawable, należy użyć android:paddingLeftlub, android:paddingRightaby ustawić odpowiednio lewe / prawe padding.

android:paddingRight="10dp"
android:paddingLeft="20dp"
android:drawableRight="@drawable/ic_app_manager"

1

Jeśli rozmiar zasobu do rysowania jest stały, możesz to zrobić w następujący sposób:

<Button
    android:background="@drawable/rounded_button_green"
    style="?android:attr/selectableItemBackground"
    android:layout_height="wrap_content"
    app:layout_widthPercent="70%"
    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"
    tools:text="example" />

Kluczem jest tutaj:

    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"

Oznacza to, że rozmiar zasobu do rysowania plus paddingRight to paddingLeft.

Możesz zobaczyć wynik w tym przykładzie


1
textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(this,drawable),null,null,null);

addressTitleView.setCompoundDrawablePadding();

Ten fragment kodu może rozwiązać pytanie, ale wyjaśnienie naprawdę pomaga poprawić jakość posta. Pamiętaj, że w przyszłości odpowiadasz na pytanie czytelników, a ci ludzie mogą nie znać przyczyn Twojej sugestii kodu.
— Rosário Pereira Fernandes

Działa to tylko w przypadku widoku tekstu, a nie np. Przycisku, który pozwala również ustawić drwable początkowe / końcowe
— Ixx,

1

po prostu przerób z:

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

    <corners android:radius="40dp"/>

    <solid android:color="@android:color/white"/>

</shape>

do

<layer-list
        xmlns:android="http://schemas.android.com/apk/res/android">
    <item
            android:right="@dimen/_2dp"
            android:left="@dimen/_2dp"
            android:bottom="@dimen/_2dp"
            android:top="@dimen/_2dp"
            >
        <shape
                xmlns:android="http://schemas.android.com/apk/res/android">

            <corners android:radius="40dp"/>

            <solid android:color="@android:color/white"/>

        </shape>
    </item>

</layer-list>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.