前言
由于最近需要实现一个自定义的switch,本想写一个MySwitch继承Switch来进行自定义,但是后来发现其实只需要通过定义switch的thumb和track的图片来达到自定义switch样式的目的。
实现
1.定义track
track即滑动的轨道。
在res/drawable内先定义一个轨道关闭状态的drawable,switch_gray_track.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- switch的高度-->
<size android:height="20dp"/>
<corners android:radius="10dp"/>
<solid android:color="#D9D9D9" />
</shape>
再定义一个轨道开启状态的drawable,switch_yellow_track.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:height="20dp" />
<corners android:radius="10dp" />
<solid android:color="#FECD15" />
</shape>
最后定义一个selector作为轨道的样式,switch_track.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/switch_yellow_track" android:state_checked="true" />
<item android:drawable="@drawable/switch_gray_track" />
</selector>
2.定义thumb
thumb即滑动块。
在res/drawable内定义一个滑动块的drawable,switch_thumb.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!-- 滑动块的宽高 -->
<size
android:width="20dp"
android:height="20dp" />
<solid android:color="#FFFFFF" />
<!-- 透明的描边-->
<stroke android:width="3dp"
android:color="@android:color/transparent"/>
</shape>
增加了一个透明的描边,不然白色的小滑块就完全覆盖掉了外面的轨道。
3.设置Switch
修改android:layout_width,android:layout_height 这两个属性,并不会实际修改Switch的大小设置大了,边上会出现空白部分,设置小了,Switch显示不全。
Switch的高度是由track的高度决定的,宽度呢则可以通过设置switchMinWidth(开关最小宽度 )来更改。
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:switchMinWidth="20dp"
android:track="@drawable/switch_track"
android:thumb="@drawable/switch_thumb"/>
源码
github: https://github.com/JeremySun823/MySwitchTest