网上搜 滑动控件(SwitchView),很多。本来也没什么写的,但是根据新项目需求,和事件界面调试,还是发现了很多问题。把网上的项目改来改去,麻烦。就自己写了。
简单的效果图
根据本次实际功能和自己调试过程中发现的问题,针对 switchView,总结了以下需要具备的功能。
1、可以滑动。以中心为界限,当滑过中点,就变换颜色。如:当前是开启状态,当小圆滑过中点,背景就变成关闭时候的颜色。抬起手,小圆自动移动到终点位置。反之亦然;
2、可以点击。如:当前是开启状态,点击按钮(手指按下位置和最后手指的位置,绝对值不超过5像素,且整个过程中,都没超过5像素。注:假设按下位置是10,滑动到20,再滑动到11,虽然绝对值相差1,但是也是滑动),自动切换为 关闭 状态。反之亦然;
3、自动移动过程屏蔽触摸事件。当小圆在自动移动的过程中,再次触摸(点击或滑动)switchView,也无效;
4、可以自由屏蔽触摸事件。如:需求为,有4个设置按钮,可以随意开关。但是,最好要保留2个是开启的。如果已经关闭了2个,再去关闭的时候,要屏蔽触摸事件,且给出对应提示
5、不会引起滑动冲突。如,设置界面的设置按钮很多,一屏放不下,就需要ScrollView包裹,而switchView也是有滑动事件的,如果不做任何解决,switchView滑动到一半,再上下滑动,就会导致switchView展示错乱,例如,小圆停在控件的中间不动,等等问题。现在要解决这种问题
源码不多,就直接粘贴了,不想下载的,可以直接复制下面的代码。
我这个控件的源码,是写在上一个demo中调试的。想下载的,可以去
上个Demo的GitHub
后面我会写代码中的细节讲解和用法。
res -> values -> attra.xml
<declare-styleable name="MySwitchView">
<!--开关打开时,背景的颜色-->
<attr name="bgOpenColor" format="color"/>
<!--开关关闭时,背景的颜色-->
<attr name="bgCloseColor" format="color"/>
<!--控件中小圆的颜色-->
<attr name="circleColor" format="color"/>
</declare-styleable>
MySwitchView
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.os.Handler
import android.os.Message
import android.util.AttributeSet
import android.view.MotionEvent
import android.widget.LinearLayout
import android.widget.Toast
class MySwitchView : LinearLayout {
private var mContext: Context? = null
//椭圆背景画笔
private var bgPaint: Paint? = null
//滑动控件中的 圆 的画笔
private var circlePaint: Paint? = null
private var defaultOpenColor: Int = Color.parseColor("#4A79FD")
private var defaultCloseColor: Int = Color.parseColor("#dddddd")
private var defaultCircleColor: Int = Color.WHITE
private var bgOpenColor: Int = defaultOpenColor
private var bgCloseColor: Int = defaultCloseColor
private var circleColor: Int = defaultCircleColor
private var viewWidth: Int = 0
private var viewHeigh