2015-06-19 11 views
17

Czy można odcień paska DrawableLeft w przyciskach Androida? Mam czarny szufladę Chciałbym odcień biały. Wiem, jak to osiągnąć z widokiem obrazu (obrazek po lewej), ale chcę to zrobić za pomocą domyślnego przycisku Androida.Przyciski do podświetlania przycisków na klawiaturze Android

enter image description here

Mój kod źródłowy:

<Button android:layout_height="wrap_content" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:text="@string/drawer_quizzes" 
     android:backgroundTint="@color/md_light_green_500" 
     android:stateListAnimator="@null" 
     android:textColor="#fff" 
     android:textSize="12dp" 
     android:fontFamily="sans-serif" 
     android:drawableLeft="@drawable/ic_action_landscape" 
     android:gravity="left|center_vertical" 
     android:drawablePadding="8dp" 
     /> 

Czy istnieje jakiś sposób, aby odcień przycisk? Czy istnieje niestandardowa metoda widoku, aby osiągnąć ten efekt?

+0

, więc chcesz umieścić obraz po lewej stronie tekstu na przycisku? –

+0

@HawraaKhalil tak, dokładnie. Ale powinno być zabarwione na biało –

+1

Głosuj tutaj https://code.google.com/p/android/issues/detail?id=198613 jeśli chcesz drawableTint przejść do biblioteki pomocy –

Odpowiedz

38

Można osiągnąć barwienia drawableleft na przycisku z tą metodą:

Krok 1: utworzyć plik zasobów rozciągliwej z bitmapy jako elementu nadrzędnego, jak pokazano poniżej, a nazwisko to jak ic_action_landscape.xml w folderze rozciągliwej

<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@android:drawable/ic_btn_speak_now" 
    android:tint="@color/white" /> 

Krok 2: Utwórz Przycisk sterowania w układzie jak poniżej

<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:backgroundTint="@color/md_light_green_500" 
     android:drawableLeft="@drawable/ic_action_landscape" 
     android:drawablePadding="8dp" 
     android:fontFamily="sans-serif" 
     android:gravity="left|center_vertical" 
     android:stateListAnimator="@null" 
     android:text="@string/drawer_quizzes" 
     android:textColor="#fff" 
     android:textSize="12dp" /> 

Przycisk pobiera rysunki z ic_action_landscape.xml z folderu do rysowania zamiast z @android: ciągnione lub ciągnione png (s).

Metoda 2:
Krok 1:
Można nawet dodać ikonę jako działanie Bar and Tab ikony z Planie jako obraz , które mogą być importowane z niestandardowej lokalizacji lub Kliparty

Krok 2:
z tematu rozwijanej wybierz niestandardowy

Krok 3:
Następnie wybierz kolor jako #FFFFFF w planie wyboru koloru. Method 2 Pictorial representation

Na koniec zakończ kreatora, aby dodać obraz, a następnie dodaj losowanie jako obraz.

Pictorial representation for answer to the question

+0

Dzięki, używam pierwszej metody teraz jako że chciałbym również użyć ikony (czarnej) w innych częściach interfejsu użytkownika. –

+14

Należy jednak pamiętać, że atrybut tinty jest obsługiwany tylko od Lollipopa. Do obsługi pre-Lollipop, użyłem następującego kodu, aby odcień programować programowo: 'Drawable [] drawables = postButton.getCompoundDrawables(); \t \t \t Drawable wrapDrawable = DrawableCompat.wrap (drawables [0]); \t \t \t DrawableCompat.setTint (wrapDrawable, getResources(). GetColor (android.R.color.white)); ', używając biblioteki support-v4. – Boris

+0

Wygląda na to, że metoda 1 działa tylko dla domyślnych ikon (z Androidem). Jeśli dodamy nową ikonę do naszych zasobów, nie działa ona po mojej stronie. Tylko uwaga. – vida

1

Jak sugeruje @Boris, można korzystać z biblioteki wsparcia.

Rozszerzyłem AppCompatButton o numer draft code. Model TintAppCompatButton powinien mieć domyślne zachowanie: , ale zostało zrobioneTintAppCompatButtonCustom w celu odtworzenia niestandardowych kolorów.

Zobaczę, czy uda mi się zebrać PR, aby wprowadzić tę informację do oficjalnej biblioteki wsparcia.

Kod zainteresowania jest:

private void init() { 
    PorterDuff.Mode tintMode = PorterDuff.Mode.SRC_IN; 
    Drawable[] ds = getCompoundDrawables(); 
    tint(ds[LEFT], Color.RED, tintMode); 
    tint(ds[TOP], Color.YELLOW, tintMode); 
    tint(ds[RIGHT], Color.GREEN, tintMode); 
    tint(ds[BOTTOM], Color.BLUE, tintMode); 
} 

private void tint(Drawable d, int color, PorterDuff.Mode tintMode) { 
    TintInfo ti = new TintInfo(); 
    ti.mTintMode = tintMode; 
    ti.mTintList = ColorStateList.valueOf(color); 
    ti.mHasTintList = true; 
    ti.mHasTintMode = true; 

    TintManager.tintDrawable(d, ti, new int[]{0}); 
} 
1

mogę spóźnić się na to, ale jeśli używasz C#, można zrobić to w ten sposób:

Color iconColor = Color.Orange; // TODO: Get from settings 
Mode mode = Mode.SrcAtop; 

Drawable drawable = ResourcesCompat.GetDrawable(Resources, Resource.Drawable.ic_action_arrest, null); 

drawable.SetColorFilter(iconColor, mode); 

Trzeba także :

using Android.Graphics; 
using static Android.Graphics.PorterDuff; 
using Android.Graphics.Drawables; 

Mam nadzieję, że to pomoże. To najprostszy sposób, jaki znalazłem. Pamiętaj też, że DOWOLNE miejsce w aplikacji, w której używasz tej ikony, będzie miało ten kolor.

0

Wiem, że istnieje już wiele odpowiedzi, ale żaden z nich nie uszczęśliwił mnie, ponieważ nie chciałem mieć różnych rysunków dla różnych stylów elementów.

Więc moje rozwiązanie było ustawić filtr koloru w konstruktorze tak:

int textColor = getTextColors().getColorForState(EMPTY_STATE_SET, Color.WHITE); 
    Drawable[] drawables = getCompoundDrawablesRelative(); 
    for (Drawable drawable : drawables) { 
     if(drawable != null) { 
      drawable.setColorFilter(textColor, PorterDuff.Mode.SRC_ATOP); 
     } 
    } 

użyłem koloru tekstu, ponieważ to było to, czego potrzebujemy, ale to może być zastąpione atrybutu niestandardowego się więcej dinamic.

Powiązane problemy