2015-01-08 18 views
40

próbowałem stosując poniższy link, aby zmienić barwę SwitchCompat:Jak zmienić kolor ścieżek SwitchCompat

How to change the color of a SwitchCompat

Zawiadomienie niska constrast w moim przełącznika:

The SwitchCompat

Ale po zmianie wszystkich istotnych wartości kolorów ścieżka (jaśniejsza szara) SwitchCompat pozostaje taka sama. Nie chcę zmieniać wyglądu poza kolorem. Kciuk jest różowy i chcę, aby utwór miał pewien kontrast. Czy brakowało mi zdefiniowania wartości w pliku styles.xml?

Próbowałem te wartości (Random non-białych kolorów):

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/first</item> 
    <item name="colorPrimaryDark">@color/second</item> 
    <item name="colorAccent">@color/third</item> 
    ... 
    <item name="colorControlActivated">@color/first</item> 
    <item name="colorControlHighlight">@color/first</item> 
    <item name="colorControlNormal">@color/second</item> 
    <item name="colorSwitchThumbNormal">@color/second</item> 
    <item name="colorButtonNormal">@color/second</item> 
...> 

Odpowiedz

128

miałem sam probrem i rozwiązać go.

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    ... 
    <!-- Active thumb color & Active track color(30% transparency) --> 
    <item name="colorControlActivated">@color/theme</item> 
    <!-- Inactive thumb color --> 
    <item name="colorSwitchThumbNormal">@color/grey300</item> 
    <!-- Inactive track color(30% transparency) --> 
    <item name="android:colorForeground">@color/grey600</item> 
    ... 
</style> 

czytam aplikacji kodu kompatybilnego i zrozumieć.

android.support.v7.internal.widget.TintManager.java

private ColorStateList getSwitchTrackColorStateList() { 
    if (mSwitchTrackStateList == null) { 
     final int[][] states = new int[3][]; 
     final int[] colors = new int[3]; 
     int i = 0; 

     // Disabled state 
     states[i] = new int[] { -android.R.attr.state_enabled }; 
     colors[i] = getThemeAttrColor(android.R.attr.colorForeground, 0.1f); 
     i++; 

     states[i] = new int[] { android.R.attr.state_checked }; 
     colors[i] = getThemeAttrColor(R.attr.colorControlActivated, 0.3f); 
     i++; 

     // Default enabled state 
     states[i] = new int[0]; 
     colors[i] = getThemeAttrColor(android.R.attr.colorForeground, 0.3f); 
     i++; 

     mSwitchTrackStateList = new ColorStateList(states, colors); 
    } 
    return mSwitchTrackStateList; 
} 
+2

Dziękuję i dobra kontrola samego kodu. –

+5

w jaki sposób ustawić inny kolor aktywnego kciuka i aktywny kolor ścieżki? zamiast 30% różnicy przezroczystości w tym samym kolorze. – ir2pid

+1

@ ir2pid: Możesz określić losowanie. –

6

Poniżej AppCompat sposobem zmiany zarówno tor i kolor kciuk programowo, zadaniu SwitchCompat. W tym przykładzie zakodowałem na czerwono kod thumbColor. Najlepiej byłoby ustawić kolor za pomocą drugiego parametru metody.

Należy pamiętać, że po zaznaczeniu przełącznika pojawia się tętnienie. Kolor tętnienia nie zostanie zmieniony przez poniższy kod.

public static void setSwitchColor(SwitchCompat v) { 
    // thumb color of your choice 
    int thumbColor = Color.RED; 

    // trackColor is the thumbColor with 30% transparency (77) 
    int trackColor = Color.argb(77, Color.red(thumbColor), Color.green(thumbColor), Color.blue(thumbColor)); 

    // setting the thumb color 
    DrawableCompat.setTintList(v.getThumbDrawable(), new ColorStateList(
      new int[][]{ 
        new int[]{android.R.attr.state_checked}, 
        new int[]{} 
      }, 
      new int[]{ 
        thumbColor, 
        Color.WHITE 
      })); 

    // setting the track color 
    DrawableCompat.setTintList(v.getTrackDrawable(), new ColorStateList(
      new int[][]{ 
        new int[]{android.R.attr.state_checked}, 
        new int[]{} 
      }, 
      new int[]{ 
        trackColor, 
        Color.parseColor("#4D000000") // full black with 30% transparency (4D) 
      })); 
} 
0

Jeśli chcesz bardziej przełączniki w wielu kolorach w jednym aktywny, można korzystać z tego rozwiązania (na podstawie tematu przez @Konifar):

<style name="CustomSwitchTheme" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
    <!-- Active thumb color & Active track color(30% transparency) --> 
    <item name="colorControlActivated">@color/custom</item> 
    <!-- Inactive thumb color --> 
    <item name="colorSwitchThumbNormal">#E0E0E0</item> 
    <!-- Inactive track color(30% transparency) --> 
    <item name="android:colorForeground">#757575</item> 
</style> 

gdzie @color/custom jest kolor kciuka gdy przełącznik jest aktywowany.

Następnie zastosować ten motyw do SwitchCompat ten sposób:

<android.support.v7.widget.SwitchCompat 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:theme="@style/CustomSwitchTheme" /> 
0

miałem ten sam problem.Wreszcie rozwiązano go programowo z tym kodem Kotlin

fun tintSwitchButton(sw: SwitchCompat, resolvedColor: Int) { 
    val states = arrayOf(
      intArrayOf(-android.R.attr.state_pressed), 
      intArrayOf(android.R.attr.state_pressed) 
    ) 

    DrawableCompat.setTintList(sw?.trackDrawable, ColorStateList(
      states, 
      intArrayOf(resolvedColor, resolvedColor) 
    )) 

    DrawableCompat.setTintList(sw?.thumbDrawable, ColorStateList(
      states, 
      intArrayOf(Color.WHITE, Color.WHITE) 
    )) 
} 

a wywołania funkcji jest

tintSwitchButton(switchCompat, Color.rgb(214, 0, 0)) 

Można również utworzyć funkcję rozszerzenia:

fun SwitchCompat.tint(resolvedColor: Int) { 
    val states = arrayOf(
     intArrayOf(-android.R.attr.state_pressed), 
     intArrayOf(android.R.attr.state_pressed) 
    ) 

    DrawableCompat.setTintList(trackDrawable, ColorStateList(
     states, 
     intArrayOf(resolvedColor, resolvedColor) 
    )) 

    DrawableCompat.setTintList(thumbDrawable, ColorStateList(
     states, 
     intArrayOf(Color.WHITE, Color.WHITE) 
    )) 
} 

więc wywołanie byłoby łatwiejsze

switchCompat.tint(Color.rgb(214,0,0)) 
1
Here is Switch Layout 
-Adding theme to your switch to change the color of track.Check the style given below:-. 

**Switch Compact** 
    <android.support.v7.widget.SwitchCompat 
       android:id="@+id/goOnlineBtn" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       app:theme="@style/Switch_style/> 


**Switch_style** 
    <style name="Switch_style" parent="Theme.AppCompat.Light"> 
     <!-- active thumb & track color (30% transparency) --> 
     <item name="colorControlNormal">@android:color/white</item> 
     <item name="colorControlActivated">@android:color/blue</item> 
     <item name="colorSwitchThumbNormal">@android:color/white</item> 
     <item name="trackTint">@color/white</item> 
    </style> 

Gdzie trackTint będzie zmienić kolor utwór

0

wystarczy użyć colorControlActivated aby ustawić kolor torze i kciukiem SwitchCompat użytkownika.

Jeśli nie jest ustawiony, domyślny kolor colorControlActivated użyje colorAccent. (z doświadczenia, nadal nie można znaleźć w kodzie źródłowym).

Kod źródłowy zmienił się i nadal nie podoba się @Ovidiu powiedział. Ale nadal dziękuję mu za poinformowanie mnie o tym, jak znaleźć odpowiedź z kodu źródłowego.

mThumbDrawable = a.getDrawable(R.styleable.SwitchCompat_android_thumb); 

ostatecznie wywoła następującą metodę.

/frameworks/support/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java

private ColorStateList createSwitchTrackColorStateList(Context context) { 
    final int[][] states = new int[3][]; 
    final int[] colors = new int[3]; 
    int i = 0; 

    // Disabled state 
    states[i] = ThemeUtils.DISABLED_STATE_SET; 
    colors[i] = getThemeAttrColor(context, android.R.attr.colorForeground, 0.1f); 
    i++; 

    states[i] = ThemeUtils.CHECKED_STATE_SET; 
    colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated, 0.3f); 
    i++; 

    // Default enabled state 
    states[i] = ThemeUtils.EMPTY_STATE_SET; 
    colors[i] = getThemeAttrColor(context, android.R.attr.colorForeground, 0.3f); 
    i++; 

    return new ColorStateList(states, colors); 
} 

private ColorStateList createSwitchThumbColorStateList(Context context) { 
    final int[][] states = new int[3][]; 
    final int[] colors = new int[3]; 
    int i = 0; 

    final ColorStateList thumbColor = getThemeAttrColorStateList(context, 
      R.attr.colorSwitchThumbNormal); 

    if (thumbColor != null && thumbColor.isStateful()) { 
     // If colorSwitchThumbNormal is a valid ColorStateList, extract the default and 
     // disabled colors from it 

     // Disabled state 
     states[i] = ThemeUtils.DISABLED_STATE_SET; 
     colors[i] = thumbColor.getColorForState(states[i], 0); 
     i++; 

     states[i] = ThemeUtils.CHECKED_STATE_SET; 
     colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated); 
     i++; 

     // Default enabled state 
     states[i] = ThemeUtils.EMPTY_STATE_SET; 
     colors[i] = thumbColor.getDefaultColor(); 
     i++; 
    } else { 
     // Else we'll use an approximation using the default disabled alpha 

     // Disabled state 
     states[i] = ThemeUtils.DISABLED_STATE_SET; 
     colors[i] = getDisabledThemeAttrColor(context, R.attr.colorSwitchThumbNormal); 
     i++; 

     states[i] = ThemeUtils.CHECKED_STATE_SET; 
     colors[i] = getThemeAttrColor(context, R.attr.colorControlActivated); 
     i++; 

     // Default enabled state 
     states[i] = ThemeUtils.EMPTY_STATE_SET; 
     colors[i] = getThemeAttrColor(context, R.attr.colorSwitchThumbNormal); 
     i++; 
    } 

    return new ColorStateList(states, colors); 
}