自定义滑动控件(SwitchView),同时解决和ScrollView的冲突

本文介绍了一款自定义滑动控件SwitchView的实现,详细阐述了其核心功能,包括滑动切换、点击切换、自动移动过程屏蔽触摸事件、处理触摸事件屏蔽以及解决与ScrollView的滑动冲突问题。提供了源码分享和使用方法,并讨论了在实现过程中遇到的难点和解决方案。
摘要由CSDN通过智能技术生成

网上搜 滑动控件(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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值