SwitchCompatのthumbやtrackの色や形をカスタマイズしてみます
2021.2.1
SwitchCompat
SwitcCompatの基本的なところは、こちらで確認しました
簡単な色の変更もselectorを使ってできましたが
つまみを画像にしたり、形をshapeを使って変えてみたりすることも可能です
thumbを画像に変える
この画像を使ってみます
unlock.png
変更点はthumbだけですが
状態の遷移をstateからselectorで設定することもできますが
コードではこちらを使うことができます
1 |
setThumbResource(R.drawable.unlock); |
SwitchCompatがcheckされるとthumbにそれぞれの画像を設定するようにします
1 2 3 4 5 6 7 8 9 10 |
SwitchCompat sw0 = findViewById(R.id.switch0); sw0.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { sw0.setText(R.string.unlock); sw0.setThumbResource(R.drawable.unlock); } else { sw0.setThumbResource(R.drawable.locked); sw0.setText(R.string.locked); } }); |
レイアウトはデフォルトでのthumbを入れておきます
1 2 3 4 5 6 7 8 9 10 11 |
<androidx.appcompat.widget.SwitchCompat android:id="@+id/switch0" android:layout_width="200dp" android:layout_height="wrap_content" android:text="@string/sw0" android:thumb="@drawable/locked" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.4" /> |
thumb と track の色を変更する
thumbだけでなくtrackもカスタマイズして変更してみます
1 2 3 4 5 6 7 8 9 10 |
SwitchCompat sw1 = findViewById(R.id.switch1); sw1.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { sw1.setTrackResource(R.drawable.custom_track_on); sw1.setThumbResource(R.drawable.custom_thumb_on); } else { sw1.setTrackResource(R.drawable.custom_track_off); sw1.setThumbResource(R.drawable.custom_thumb_off); } }); |
offとon用にshapeを使って形と色をカスタマイズします
custom_thumb_off.xml
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#484"/> <solid android:color="#4e4"/> <size android:width="30dp" android:height="30dp" /> <corners android:radius="5dp"/> </shape> |
custom_thumb_on.xml
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#484"/> <solid android:color="#fe4"/> <size android:width="30dp" android:height="30dp" /> <corners android:radius="5dp"/> </shape> |
custom_track_off.xml
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#444"/> <solid android:color="#aca"/> <corners android:radius="5dp"/> </shape> |
custom_track_on.xml
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#484"/> <solid android:color="#dfd"/> <corners android:radius="5dp"/> </shape> |
これらを res\drawable\ 以下に配置します
デフォルトでのカスタマイズを有効にするため
以下を追加しておきます
android:thumb=”@drawable/custom_thumb_off” app:track=”@drawable/custom_track_off”
1 2 3 4 5 6 7 8 9 10 11 12 |
<androidx.appcompat.widget.SwitchCompat android:id="@+id/switch1" android:layout_width="200dp" android:layout_height="wrap_content" android:text="@string/sw1" android:thumb="@drawable/custom_thumb_off" app:track="@drawable/custom_track_off" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.6" /> |
四角いthumbで緑と黄色にカスタマイズできました
stateによって分けるselectorを使うこともできます
サンプルコード
2つをまとめてみました
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
//package com.example.testswitchcompat; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SwitchCompat; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SwitchCompat sw0 = findViewById(R.id.switch0); sw0.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { sw0.setText(R.string.unlock); sw0.setThumbResource(R.drawable.unlock); } else { sw0.setThumbResource(R.drawable.locked); sw0.setText(R.string.locked); } }); SwitchCompat sw1 = findViewById(R.id.switch1); sw1.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { sw1.setTrackResource(R.drawable.custom_track_on); sw1.setThumbResource(R.drawable.custom_thumb_on); } else { sw1.setTrackResource(R.drawable.custom_track_off); sw1.setThumbResource(R.drawable.custom_thumb_off); } }); } } |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.appcompat.widget.SwitchCompat android:id="@+id/switch0" android:layout_width="200dp" android:layout_height="wrap_content" android:text="@string/sw0" android:thumb="@drawable/locked" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.4" /> <androidx.appcompat.widget.SwitchCompat android:id="@+id/switch1" android:layout_width="200dp" android:layout_height="wrap_content" android:text="@string/sw1" android:thumb="@drawable/custom_thumb_off" app:track="@drawable/custom_track_off" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.6" /> </androidx.constraintlayout.widget.ConstraintLayout> |
strings.xml
1 2 3 4 5 6 7 |
<resources> <string name="app_name">TestSwitchCompat</string> <string name="sw0">locked:</string> <string name="sw1">SwitchCompat:</string> <string name="locked">Locked</string> <string name="unlock">Unlock</string> </resources> |
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#484"/> <solid android:color="#4e4"/> <size android:width="30dp" android:height="30dp" /> <corners android:radius="5dp"/> </shape> |
custom_thumb_on.xml
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#484"/> <solid android:color="#fe4"/> <size android:width="30dp" android:height="30dp" /> <corners android:radius="5dp"/> </shape> |
custom_track_off.xml
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#444"/> <solid android:color="#aca"/> <corners android:radius="5dp"/> </shape> |
custom_track_on.xml
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#484"/> <solid android:color="#dfd"/> <corners android:radius="5dp"/> </shape> |
これで実行させてみましょう
References:
切り替えボタン | Android デベロッパー
SwitchCompat – Android Developers